/** * Accept method in the visitor pattern for traversing the GAPP data structure. * Calls the accept method of every instruction in this data structure. * * @param visitor The visitor used for calling * @param arg An argument, which will be used in the calls */ public void accept(GAPPVisitor visitor, Object arg) { for (GAPPBaseInstruction inst : instructions) { inst.accept(visitor, null); } }
public GAPPBaseInstruction createBaseInstruction(String cmd) { InstructionType instr = InstructionType.valueOf(cmd); switch (instr) { case assignMv: return new GAPPAssignMv(null); case assignInputsVector: return new GAPPAssignInputsVector(null); case calculateMv: return new GAPPCalculateMv(null, null, null, null); case dotVectors: GAPPMultivector m = null; return new GAPPDotVectors(m, null, null); case resetMv: return new GAPPResetMv(null, 0); case setMv: return new GAPPSetMv(null, null, null, null); case setVector: return new GAPPSetVector(null, null); } return null; }
@Override public Object visitResetMv(GAPPResetMv gappResetMv, Object arg) { return new GAPPResetMv( (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder( gappResetMv.getDestination()), gappResetMv.getSize()); }
@Override public Object visitCalculateMvCoeff(GAPPCalculateMvCoeff gappCalculateMvCoeff, Object arg) { return new GAPPCalculateMv(gappCalculateMvCoeff.getType(), (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappCalculateMvCoeff.getDestination()), (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappCalculateMvCoeff.getOperand1()), (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappCalculateMvCoeff.getOperand2())); }
@Override public Object visitAssignMv(GAPPAssignMv gappAssignMv, Object arg) { return new GAPPAssignMv( (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappAssignMv.getDestination()), copyPosSelectorset(gappAssignMv.getSelectors()), copyValueset(gappAssignMv.getValues())); }
@Override public Object visitCalculateMv(GAPPCalculateMv gappCalculateMv, Object arg) { return new GAPPCalculateMv(gappCalculateMv.getType(), (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappCalculateMv.getDestination()), (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappCalculateMv.getOperand1()), (GAPPMultivector) GAPPValueHolderCopier.copyValueHolder(gappCalculateMv.getOperand2())); }
@Override public Object visitCalculateMv(GAPPCalculateMv gappCalculateMv, Object arg) { result.append("calculateMv "); printMultivector(gappCalculateMv.getDestination()); result.append(" = "); result.append(gappCalculateMv.getType().toString()); result.append("("); printMultivector(gappCalculateMv.getOperand1()); if (gappCalculateMv.getOperand2() != null) { result.append(","); printMultivector(gappCalculateMv.getOperand2()); } result.append(");\n"); return null; }
@Override public Object visitAssignMv(GAPPAssignMv gappAssignMv, Object arg) { result.append("assignMv "); printMultivector(gappAssignMv.getDestination()); printPosSelectors(gappAssignMv.getSelectors()); result.append(" = "); printValueSet(gappAssignMv.getValues()); result.append(";\n"); return null; }
@Override public Object visitSetMv(GAPPSetMv gappSetMv, Object arg) { curLine++; access(gappSetMv.getDestination()); access(gappSetMv.getSource()); return null; }
@Override public Object visitCalculateMv(GAPPCalculateMv gappCalculateMv, Object arg) { curLine++; access(gappCalculateMv.getDestination()); access(gappCalculateMv.getOperand1()); if (gappCalculateMv.getOperand2() != null) { access(gappCalculateMv.getOperand2()); } return null; }
@Override public Object visitAssignInputsVector(GAPPAssignInputsVector gappAssignInputsVector, Object arg) { return new GAPPAssignInputsVector(copyVariableset(gappAssignInputsVector.getValues())); }
@Override public Object visitResetMv(GAPPResetMv gappResetMv, Object arg) { result.append("resetMv "); printMultivector(gappResetMv.getDestination()); result.append("["); result.append(gappResetMv.getSize()); result.append("];\n"); return null; }
@Override public Object visitDotVectors(GAPPDotVectors gappDotVectors, Object arg) { curLine++; access(gappDotVectors.getDestination()); return null; }
@Override public Object visitAssignMv(GAPPAssignMv gappAssignMv, Object arg) { curLine++; access(gappAssignMv.getDestination()); return null; }
@Override public Object visitResetMv(GAPPResetMv gappResetMv, Object arg) { multivectors.add(gappResetMv.getDestination().getName()); return null; }
@Override public Object visitCalculateMv(GAPPCalculateMv gappCalculateMv, Object arg) { multivectors.add(gappCalculateMv.getDestination().getName()); return null; }
@Override public Object visitAssignInputsVector(GAPPAssignInputsVector gappAssignInputsVector, Object arg) { result.append("assignInputsVector inputsVector = "); printVariableSet(gappAssignInputsVector.getValues()); result.append(";\n"); return null; }
private void evaluateInstruction() { instructions[curInstruction].accept(executer, null); }
/** * Updates all setOfVariables * @param instructions The GAPP instructions */ public static void updateSetOfVariables(LinkedList<GAPPBaseInstruction> instructions) { SetOfVariablesUpdater updater = new SetOfVariablesUpdater(); for (GAPPBaseInstruction i: instructions) i.accept(updater, null); }
@Override public String toString() { PrettyPrint printer = new PrettyPrint(); accept(printer, null); return printer.getResultString(); } }