package de.gaalop.gapp.importing; import de.gaalop.gapp.PosSelector; import de.gaalop.gapp.PosSelectorset; import de.gaalop.gapp.Selector; import de.gaalop.gapp.Selectorset; import de.gaalop.gapp.Valueset; 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.ParallelObjectVisitor; import de.gaalop.gapp.importing.parallelObjects.Product; import de.gaalop.gapp.importing.parallelObjects.Sum; import de.gaalop.gapp.instructionSet.GAPPAssignMv; import de.gaalop.gapp.instructionSet.GAPPSetMv; import de.gaalop.gapp.variables.GAPPConstant; import de.gaalop.gapp.variables.GAPPMultivector; import de.gaalop.tba.Algebra; /** * Creates a GAPPMultivector from ParallelObject, which is a terminal * @author Christian Steinmetz */ public class GAPPMultivectorCreator implements ParallelObjectVisitor { //return GAPPMultivector private GAPPCreator gappCreator; private int bladeCount; private Algebra algebra; public GAPPMultivectorCreator(GAPPCreator gappCreator, int bladeCount, Algebra algebra) { this.gappCreator = gappCreator; this.bladeCount = bladeCount; this.algebra = algebra; } @Override public Object visitVariable(ParVariable variable, Object arg) { throw new IllegalStateException("Variables shouldn't appear in GAPP transformation!"); } @Override public Object visitMvComponent(MvComponent mvComponent, Object arg) { GAPPMultivector mvTmp = gappCreator.createMv(); PosSelectorset selDestSet = new PosSelectorset(); selDestSet.add(new PosSelector(0, algebra.getBlade(0).toString())); Selectorset selSrcSet = new Selectorset(); selSrcSet.add(new Selector( mvComponent.getMultivectorComponent().getBladeIndex(), mvComponent.isNegated() ? (byte) -1 : (byte) 1, algebra.getBlade(mvComponent.getMultivectorComponent().getBladeIndex()).toString())); gappCreator.gapp.addInstruction(new GAPPSetMv(mvTmp, new GAPPMultivector( mvComponent.getMultivectorComponent().getName()), selDestSet, selSrcSet)); return mvTmp; } @Override public Object visitConstant(Constant constant, Object arg) { GAPPMultivector mvTmp = gappCreator.createMv(); PosSelectorset selDestSet = new PosSelectorset(); selDestSet.add(new PosSelector(0, algebra.getBlade(0).toString())); Valueset valSet = new Valueset(); valSet.add(new GAPPConstant((constant.isNegated() ? -1 : 1) * constant.getValue())); gappCreator.gapp.addInstruction(new GAPPAssignMv(mvTmp, selDestSet, valSet)); return mvTmp; } // ========================== Illegal methods ============================== @Override public Object visitDotProduct(DotProduct dotProduct, Object arg) { throw new IllegalStateException("DotProducts are not allowed here"); } @Override public Object visitSum(Sum sum, Object arg) { throw new IllegalStateException("Sums are not allowed here"); } @Override public Object visitProduct(Product product, Object arg) { throw new IllegalStateException("Products are not allowed here"); } @Override public Object visitExtCalculation(ExtCalculation extCalculation, Object arg) { throw new IllegalStateException("ExtCalculations are not allowed here"); } }