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;
/**
* Fills a given DotProduct
* @author Christian Steinmetz
*/
public class DotProductCreator implements ParallelObjectVisitor {
private DotProduct dotProduct;
private int summandNo;
/**
* Calls DotProductsFinder to find more DotProducts in a given ParallelObject instance
* @param object The ParallelObject instance
*/
private DotProduct processMoreDotProducts(ParallelObject object) {
DotProductsFinder finder = new DotProductsFinder();
return (DotProduct) object.accept(finder, null);
}
public DotProductCreator(DotProduct dotProduct, int summandNo) {
this.dotProduct = dotProduct;
this.summandNo = summandNo;
}
@Override
public Object visitProduct(Product product, Object arg) {
int vectorNo = 0;
for (ParallelObject factor : product.getFactors()) {
dotProduct.set(summandNo, vectorNo, factor);
DotProduct newDot = processMoreDotProducts(factor);
if (newDot != null) {
dotProduct.set(summandNo, vectorNo, newDot);
}
if (product.isNegated()) {
dotProduct.get(summandNo, vectorNo).negate();
product.negate();
}
vectorNo++;
}
return null;
}
@Override
public Object visitExtCalculation(ExtCalculation extCalculation, Object arg) {
dotProduct.set(summandNo, 0, extCalculation);
DotProduct newDot = processMoreDotProducts(extCalculation.getOperand1());
if (newDot != null) {
extCalculation.setOperand1(newDot);
}
if (extCalculation.getOperand2() != null) {
DotProduct newDot2 = processMoreDotProducts(extCalculation.getOperand2());
if (newDot2 != null) {
extCalculation.setOperand2(newDot2);
}
}
return null;
}
@Override
public Object visitConstant(Constant constant, Object arg) {
dotProduct.set(summandNo, 0, constant);
return null;
}
@Override
public Object visitMvComponent(MvComponent mvComponent, Object arg) {
dotProduct.set(summandNo, 0, mvComponent);
return null;
}
@Override
public Object visitVariable(ParVariable variable, Object arg) {
dotProduct.set(summandNo, 0, variable);
return null;
}
// ========================== Illegal methods ==============================
@Override
public Object visitSum(Sum sum, Object arg) {
throw new IllegalStateException("Sums are here not allowed");
}
@Override
public Object visitDotProduct(DotProduct dotProduct, Object arg) {
throw new IllegalStateException("DotProducts are here not allowed");
}
}