@Override public Tensor set(int i, Tensor tensor) { // return super.set(i, tensor); if (i >= data.length || i < 0) throw new IndexOutOfBoundsException(); Tensor old = data[i]; if (old == tensor) return this; if (TensorUtils.equalsExactly(old, tensor)) return this; if (TensorUtils.isIndeterminate(tensor)) return tensor; if (TensorUtils.isZero(tensor)) return remove(i); Tensor[] newData = data.clone(); newData[i] = tensor; if (TensorUtils.equals(old, tensor)) return new Sum(newData, indices); return Tensors.sum(newData); }
private static Tensor[] reIm(Tensor sum) { IntArrayList im = new IntArrayList(sum.size()); for (int i = sum.size() - 1; i >= 0; --i) { if (sum.get(i) instanceof Complex && !((Complex) sum.get(i)).getImaginary().isZero()) im.add(i); else if (sum.get(i) instanceof Product && !((Product) sum.get(i)).getFactor().getImaginary().isZero()) im.add(i); } Tensor[] parts = new Tensor[2]; int[] positions = im.toArray(); parts[0] = ((Sum) sum).select(positions); parts[1] = ((Sum) sum).remove(positions); return parts; }
private Tensor factorSymbolicTerms(Tensor tensor) { FromParentToChildIterator iterator = new FromParentToChildIterator(tensor); Tensor c; while ((c = iterator.next()) != null) { if (!(c instanceof Sum)) continue; Tensor remainder = c, temp; IntArrayList symbolicPositions = new IntArrayList(); for (int i = c.size() - 1; i >= 0; --i) { temp = c.get(i); if (isSymbolic(temp)) { symbolicPositions.add(i); if (remainder instanceof Sum) remainder = ((Sum) remainder).remove(i); else remainder = Complex.ZERO; } } Tensor symbolicPart = ((Sum) c).select(symbolicPositions.toArray()); symbolicPart = factorSymbolicTerm(symbolicPart); if (remainder instanceof Sum) { SumBuilder sb = new SumBuilder(remainder.size()); for (Tensor tt : remainder) sb.put(factorSymbolicTerms(tt)); remainder = sb.build(); } else remainder = factorSymbolicTerms(remainder); iterator.set(Tensors.sum(symbolicPart, remainder)); } return iterator.result(); }
it.set(((Sum) current).remove(ps)); continue main;
assert temp instanceof Sum; sb.put(temp.get(nonProductOfSumsPositions.get(i))); temp = ((Sum) temp).remove(nonProductOfSumsPositions.get(i));