@Override public Tensor[] getRange(int from, int to) {//TODO optimize and comment if (from < 0 || to > size()) throw new ArrayIndexOutOfBoundsException(); if (from > to) throw new IllegalArgumentException(); int indexlessMaxPos = indexlessData.length; Tensor[] result = new Tensor[to - from]; if (to == from) return result; int n = 0; //offset for result if factor isn't 1 if (factor != Complex.ONE) { if (from == 0) { result[0] = factor; ++n; } else --from; --to; } if (to < indexlessMaxPos) System.arraycopy(indexlessData, from, result, n, to - from); else if (from < indexlessMaxPos) { System.arraycopy(indexlessData, from, result, n, indexlessMaxPos - from); System.arraycopy(data, 0, result, indexlessMaxPos - from + n, to - indexlessMaxPos); } else System.arraycopy(data, from - indexlessMaxPos, result, n, to - from); return result; }
@Override public String toString(OutputFormat format) { StringBuilder sb = new StringBuilder(); char operatorChar = format == OutputFormat.LaTeX ? ' ' : '*'; if (factor.isReal() && factor.getReal().signum() < 0) { sb.append('-'); Complex f = factor.abs(); if (!f.isOne()) sb.append(((Tensor) f).toString(format, Product.class)).append(operatorChar); } else if (factor != Complex.ONE) sb.append(((Tensor) factor).toString(format, Product.class)).append(operatorChar); int i = 0, size = factor == Complex.ONE ? size() : size() - 1; for (; i < indexlessData.length; ++i) { sb.append(indexlessData[i].toString(format, Product.class)); if (i == size - 1) return sb.toString(); sb.append(operatorChar); } // removeLastOperatorChar(sb, operatorChar); EnumSet<IndexType> matrixTypes; if (format.printMatrixIndices || (matrixTypes = IndicesUtils.nonMetricTypes(indices)).isEmpty()) return printData(sb, format, operatorChar); return printMatrices(sb, format, operatorChar, matrixTypes); }
private int calculateHash() { int result; if (factor == Complex.ONE || factor == Complex.MINUS_ONE) result = 0; //important for -a.hash() == a.hash() else result = factor.hashCode(); for (Tensor t : indexlessData) result = result * 31 + t.hashCode(); for (Tensor t : data) result = result * 17 + t.hashCode(); if (factor == Complex.MINUS_ONE && size() == 2) return result; return result - 79 * getContent().getStructureOfContractionsHashed().hashCode(); }
/** * Puts together similar scalar subproducts in a given product. For example, tensor A_m*A^m*A_n*A^n * will be transformed to tensor (A_m*A^m)**2. * * @param product product * @return the result */ public static Tensor collectScalarFactorsInProduct(Product product) { if (TensorUtils.isSymbolic(product)) return product; ScalarsBackedProductBuilder builder = new ScalarsBackedProductBuilder(product.size(), 1, product.getIndices().getFree().size()); builder.put(product); return builder.build(); } }
while (true) { Product product = ((Product) current); for (int i = 0; i < product.size(); i++) { Tensor dd = current.get(i); if (dd instanceof TensorField && ((TensorField) dd).isDiracDelta()) {
if (complex == Complex.ONE)//case a*b factor = tensor; else if (product.size() == 2)//case 2*a factor = product.get(1); else//case 2*a*b => factor = a*b