static IndexMappingProvider createPort(IndexMappingProvider opu, Tensor from, Tensor to) { if (from.hashCode() != to.hashCode()) return IndexMappingProvider.Util.EMPTY_PROVIDER; if (from.getClass() != to.getClass()) { Tensor nonComplex; // Processing case -2*(1/2)*g_mn -> g_mn if (from instanceof Product && !(to instanceof Product)) { if (from.size() != 2) return IndexMappingProvider.Util.EMPTY_PROVIDER; if ((nonComplex = extractNonComplexFactor(from)) != null) return new MinusIndexMappingProviderWrapper(createPort(opu, nonComplex, to)); return IndexMappingProvider.Util.EMPTY_PROVIDER; } // Processing case g_mn -> -2*(1/2)*g_mn if (to instanceof Product && !(from instanceof Product)) { if (to.size() != 2) return IndexMappingProvider.Util.EMPTY_PROVIDER; if ((nonComplex = extractNonComplexFactor(to)) != null) return new MinusIndexMappingProviderWrapper(createPort(opu, from, nonComplex)); return IndexMappingProvider.Util.EMPTY_PROVIDER; } return IndexMappingProvider.Util.EMPTY_PROVIDER; } IndexMappingProviderFactory factory = map.get(from.getClass()); if (factory == null) throw new RuntimeException("Unsupported tensor type: " + from.getClass()); return factory.create(opu, from, to); }