@Override public FactorNode clone() { //factorForbiddenIndices are immutable return new FactorNode(factor, builder.clone(), factorForbiddenIndices); } }
@Override public TensorBuilder clone() { TIntObjectHashMap<List<FactorNode>> summands = new TIntObjectHashMap<>(this.summands); for (List<FactorNode> vals : summands.valueCollection()) for (int i = vals.size() - 1; i >= 0; --i) vals.set(i, vals.get(i).clone()); return new SumBuilderSplitingScalars(summands, complex, indices, sortedFreeIndices.clone()); } }
if (factorNodes == null) { List<FactorNode> fns = new ArrayList<>(); fns.add(new FactorNode(split.factor, split.getBuilder())); summands.put(hash, fns); } else { if ((b = compareFactors(split.factor, node.factor)) != null) { if (b) node.put(Tensors.negate(split.summand), split.factor); else node.put(split.summand, split.factor); break; factorNodes.add(new FactorNode(split.factor, split.getBuilder()));
@Override public Tensor build() { if (complex.isNaN() || complex.isInfinite()) return complex; List<Tensor> sum = new ArrayList<>(); final boolean isNumeric = complex.isNumeric(); for (List<FactorNode> nodes : summands.valueCollection()) for (FactorNode node : nodes) { if (isNumeric) { Tensor summand = Tensors.multiply(toNumeric(node.build()), toNumeric(node.factor)); if (summand instanceof Complex) complex = complex.add((Complex) summand); else sum.add(summand); } else { Tensor summand = Tensors.multiply(node.build(), node.factor); if (!TensorUtils.isZero(summand)) sum.add(summand); } } if (sum.isEmpty()) return complex; if (!complex.isZero()) sum.add(complex); if (sum.size() == 1) return sum.get(0); return new Sum(sum.toArray(new Tensor[sum.size()]), indices); }
@Override public TensorBuilder clone() { TIntObjectHashMap<List<FactorNode>> summands = new TIntObjectHashMap<>(this.summands); for (List<FactorNode> vals : summands.valueCollection()) for (int i = vals.size() - 1; i >= 0; --i) vals.set(i, vals.get(i).clone()); return new SumBuilder(summands, complex, indices, sortedFreeIndices.clone()); } }