Esempio n. 1
0
  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);
  }