package de.gaalop.gapp.importing;
import de.gaalop.gapp.importing.parallelObjects.Constant;
import de.gaalop.gapp.importing.parallelObjects.DotProduct;
import de.gaalop.gapp.importing.parallelObjects.ExtCalculation;
import de.gaalop.gapp.importing.parallelObjects.MvComponent;
import de.gaalop.gapp.importing.parallelObjects.ParVariable;
import de.gaalop.gapp.importing.parallelObjects.ParallelObject;
import de.gaalop.gapp.importing.parallelObjects.ParallelObjectVisitor;
import de.gaalop.gapp.importing.parallelObjects.Product;
import de.gaalop.gapp.importing.parallelObjects.Sum;
import java.util.LinkedList;
/**
* Finds DotProdurcs in a ParallelObject
* @author Christian Steinmetz
*/
public class DotProductsFinder implements ParallelObjectVisitor {
// return ParallelObject instance if created, otherwise null
@Override
public Object visitSum(Sum sum, Object arg) {
// begin of a Dotproduct!
DotProduct dotProduct = new DotProduct();
int summandNo = 0;
for (ParallelObject summand : sum.getSummands()) {
DotProductCreator creator = new DotProductCreator(dotProduct, summandNo);
summand.accept(creator, null);
summandNo++;
}
if (sum.isNegated()) dotProduct.negate();
return dotProduct;
}
@Override
public Object visitProduct(Product product, Object arg) {
LinkedList<ParallelObject> toRemove = new LinkedList<ParallelObject>();
LinkedList<ParallelObject> toAdd = new LinkedList<ParallelObject>();
for (ParallelObject factor : product.getFactors()) {
DotProduct dp = (DotProduct) factor.accept(this, null);
if (dp != null) {
toRemove.add(factor);
toAdd.add(dp);
}
}
for (ParallelObject obj : toAdd) {
product.getFactors().add(obj);
}
for (ParallelObject obj : toRemove) {
product.getFactors().remove(obj);
}
return null;
}
@Override
public Object visitExtCalculation(ExtCalculation extCalculation, Object arg) {
DotProduct dp1 = (DotProduct) extCalculation.getOperand1().accept(this, null);
if (dp1 != null) {
extCalculation.setOperand1(dp1);
}
if (extCalculation.getOperand2() != null) {
DotProduct dp2 = (DotProduct) extCalculation.getOperand2().accept(this, null);
if (dp2 != null) {
extCalculation.setOperand2(dp2);
}
}
return null;
}
@Override
public Object visitVariable(ParVariable variable, Object arg) {
return null;
}
@Override
public Object visitConstant(Constant constant, Object arg) {
return null;
}
@Override
public Object visitMvComponent(MvComponent mvComponent, Object arg) {
return null;
}
@Override
public Object visitDotProduct(DotProduct dotProduct, Object arg) {
throw new IllegalStateException("DotProducts are here not allowed");
}
}