@Override public IndexMappingProvider create(final IndexMappingProvider opu, final Tensor from, final Tensor to) { if (from.equals(to)) if (((Complex) from).isZero()) return new PlusMinusIndexMappingProvider(opu); else return new DummyIndexMappingProvider(opu); else if (from.equals(((Complex) to).negate())) return new MinusIndexMappingProvider(opu); return IndexMappingProvider.Util.EMPTY_PROVIDER; } };
@Override public IndexMappingProvider create(IndexMappingProvider opu, Tensor from, Tensor to) { OutputPort<IndexMappingBuffer> mp = IndexMappings.createPortOfBuffers(from.get(0), to.get(0)); IndexMappingBuffer buffer; byte state = 0; while ((buffer = mp.take()) != null) { state |= (byte) (buffer.getSign() ? 0x10 : 0x01); if (state == 0x11) break; } switch (state) { case 0x00: return IndexMappingProvider.Util.EMPTY_PROVIDER; case 0x01: return new DummyIndexMappingProvider(opu); case 0x10: return new MinusIndexMappingProvider(opu); case 0x11: return new PlusMinusIndexMappingProvider(opu); default: throw new RuntimeException("Ups"); } } };
@Override public IndexMappingProvider create(IndexMappingProvider opu, Tensor from, Tensor to) { IndexMappingBuffer exponentMapping = IndexMappings.getFirstBuffer(from.get(1), to.get(1)); //todo try get first positive mapping if (exponentMapping == null || exponentMapping.getSign()) return IndexMappingProvider.Util.EMPTY_PROVIDER; //todo two signs are possible IndexMappingBuffer baseMapping = IndexMappings.getFirstBuffer(from.get(0), to.get(0)); if (baseMapping == null) return IndexMappingProvider.Util.EMPTY_PROVIDER; if (baseMapping.getSign() == false) return new DummyIndexMappingProvider(opu); if (!(from.get(1) instanceof Complex)) return IndexMappingProvider.Util.EMPTY_PROVIDER; assert to.get(1) instanceof Complex; Complex exponent = (Complex) from.get(1); if (NumberUtils.isIntegerEven(exponent)) return new DummyIndexMappingProvider(opu); if (NumberUtils.isIntegerOdd(exponent)) return new MinusIndexMappingProvider(opu); return IndexMappingProvider.Util.EMPTY_PROVIDER; } }