private static Term[] sum2SplitArray(Sum sum, Int pivotPosition) { Term[] terms = new Term[sum.size()]; int pivotSumsCount = Integer.MAX_VALUE, pivotPosition1 = -1; for (int i = sum.size() - 1; i >= 0; --i) { terms[i] = tensor2term(sum.get(i)); if (terms[i].factors.length < pivotSumsCount) { pivotSumsCount = terms[i].factors.length; pivotPosition1 = i; } } pivotPosition.value = pivotPosition1; return terms; }
@Override public String toString(OutputFormat mode) { StringBuilder sb = new StringBuilder(); String temp; for (int i = 0; ; ++i) { temp = get(i).toString(mode, Sum.class); if ((temp.charAt(0) == '-' || temp.charAt(0) == '+') && sb.length() != 0) sb.deleteCharAt(sb.length() - 1); String str = get(i).toString(mode, Sum.class); if (str.contains("'") && !mode.printMatrixIndices) return toString(mode.printMatrixIndices()); sb.append(str); if (i == size() - 1) return sb.toString(); sb.append('+'); } }
private static Tensor multiplyWithFactory(Sum sum, Tensor factor, Transformation... transformations) { final ArrayList<Tensor> newSumData = new ArrayList<>(sum.size()); Tensor temp; boolean reduced = false; for (int i = sum.size() - 1; i >= 0; --i) { temp = Transformation.Util.applySequentially(multiply(factor, sum.get(i)), transformations); if (!TensorUtils.isZero(temp)) { newSumData.add(temp); if (!reduced && isReduced(sum.get(i), factor, temp)) reduced = true; } } if (newSumData.size() == 0) return Complex.ZERO; if (newSumData.size() == 1) return newSumData.get(0); final Tensor[] data = newSumData.toArray(new Tensor[newSumData.size()]); if (reduced) return SumFactory.FACTORY.create(data); return new Sum(data, IndicesFactory.create(newSumData.get(0).getIndices().getFree())); }
/** * Expands out the product of two sums. * * @param s1 first sum * @param s2 second sum * @param transformations additional transformations to be * consequently applied on each term * in the resulting expression. * @param factors if specified, then each resulting term will be multiplied on this factor * @return the resulting expanded tensor */ public static Tensor expandPairOfSums(Sum s1, Sum s2, Tensor[] factors, Transformation[] transformations) { ExpandPairPort epp = new ExpandPairPort(s1, s2, factors); TensorBuilder sum = new SumBuilder(s1.size() * s2.size()); Tensor t; while ((t = epp.take()) != null) sum.put(apply(transformations, t)); return sum.build(); }
/** * @deprecated very unsafe method without checks */ @Deprecated public static Tensor multiplySumElementsOnFactors(Sum sum) { final Tensor[] newSumData = new Tensor[sum.size()]; for (int i = newSumData.length - 1; i >= 0; --i) newSumData[i] = multiply(CC.generateNewSymbol(), sum.get(i)); return new Sum(newSumData, IndicesFactory.create(newSumData[0].getIndices().getFree())); }
private static Tensor multiplyWithBuilder(Sum sum, Tensor factor, Transformation... transformations) { SumBuilder sb = new SumBuilder(sum.size()); for (Tensor t : sum) sb.put(Transformation.Util.applySequentially(multiply(t, factor), transformations)); return sb.build(); }
public static Tensor multiplySumElementsOnFactor(Sum sum, Tensor factor, Transformation[] transformations) { if (TensorUtils.isZero(factor)) return Complex.ZERO; if (TensorUtils.isOne(factor)) return sum; if (TensorUtils.haveIndicesIntersections(sum, factor)) { SumBuilder sb = new SumBuilder(sum.size()); for (Tensor t : sum) sb.put(apply(transformations, multiply(t, factor))); return sb.build(); } else return apply(transformations, FastTensors.multiplySumElementsOnFactor(sum, factor)); }
public static Tensor multiplySumElementsOnFactorAndExpand(Sum sum, Tensor factor, Transformation[] transformations) { if (TensorUtils.isZero(factor)) return Complex.ZERO; if (TensorUtils.isOne(factor)) return sum; if (factor instanceof Sum && factor.getIndices().size() != 0) throw new IllegalArgumentException(); if (TensorUtils.haveIndicesIntersections(sum, factor)) { SumBuilder sb = new SumBuilder(sum.size()); for (Tensor t : sum) sb.put(apply(transformations, ExpandUtils.expandIndexlessSubproduct.transform(multiply(t, factor)))); return sb.build(); } else return apply(transformations, FastTensors.multiplySumElementsOnFactorAndExpand(sum, factor)); }
Sum s = (Sum) tensor; Tensor temp, data[] = null; for (int i = s.size() - 1; i >= 0; --i) { temp = renameIndicesOfFieldsArguments(s.data[i], forbidden); if (temp != s.data[i]) {