
cc.redberry.transformation.collect.EqualsSplitCriteria Maven / Gradle / Ivy
/*
* Redberry: symbolic tensor computations.
*
* Copyright (c) 2010-2012:
* Stanislav Poslavsky
* Bolotin Dmitriy
*
* This file is part of Redberry.
*
* Redberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Redberry is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Redberry. If not, see .
*/
package cc.redberry.transformation.collect;
import cc.redberry.core.context.CC;
import cc.redberry.core.tensor.*;
import cc.redberry.core.tensor.testing.TTest;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Dmitry Bolotin
* @author Stanislav Poslavsky
*/
////TODO understand, where clone() is need
public class EqualsSplitCriteria implements SplitCriteria {
public static final EqualsSplitCriteria INSTANCE = new EqualsSplitCriteria();
private EqualsSplitCriteria() {
}
@Override
public boolean factorOut(Tensor tensor) {
return (tensor instanceof TensorNumber) || TTest.testIsSymbol(tensor);
}
@Override
public EqualsSplit split(Tensor tensor) {
if (tensor instanceof Product) {
TensorIterator it = tensor.iterator();
Tensor current;
List factored = null;
while (it.hasNext()) {
current = it.next();
if (factorOut(current)) {
if (factored == null)
factored = new ArrayList<>();
factored.add(current);
it.remove();
}
}
if (((Product) tensor).isEmpty())
throw new RuntimeException("Scalar sum must be collected with CollectScalars!");
Tensor term = tensor.equivalent();
term.setParent(CC.getRootParentTensor());
if (factored == null)
return new EqualsSplit(TensorNumber.createONE(), term);
Tensor factoredTensor;
if (factored.size() == 1) {
factoredTensor = factored.get(0);
factoredTensor.setParent(CC.getRootParentTensor());
} else
factoredTensor = new Product(factored);
return new EqualsSplit(factoredTensor, term);
}
if (tensor instanceof SimpleTensor)
if (factorOut(tensor))
throw new RuntimeException("Scalar sum must be collected with CollectScalars!");
else {
Tensor term = tensor.equivalent();
term.setParent(CC.getRootParentTensor());
return new EqualsSplit(TensorNumber.createONE(), term);
}
throw new UnsupportedOperationException("Not supported yet.");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy