package de.gaalop.visualizer;
import de.gaalop.OptimizationException;
import de.gaalop.cfg.AssignmentNode;
import de.gaalop.dfg.Expression;
import de.gaalop.dfg.MultivectorComponent;
import de.gaalop.tba.cfgImport.optimization.maxima.DFGToMaximaCode;
import de.gaalop.tba.cfgImport.optimization.maxima.MaximaConnection;
import de.gaalop.tba.cfgImport.optimization.maxima.MaximaInput;
import de.gaalop.tba.cfgImport.optimization.maxima.MaximaOutput;
import de.gaalop.tba.cfgImport.optimization.maxima.MaximaRoutines;
import de.gaalop.tba.cfgImport.optimization.maxima.ProcessBuilderMaximaConnection;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Implements a differentiater that uses maxima
* @author christian
*/
public class MaximaDifferentiater implements Differentiater {
private String maximaCommand;
public MaximaDifferentiater(String maximaCommand) {
this.maximaCommand = maximaCommand;
}
@Override
public LinkedList<AssignmentNode> differentiate(LinkedList<AssignmentNode> toDerive, MultivectorComponent variable) {
try {
MaximaConnection connection = new ProcessBuilderMaximaConnection(maximaCommand);
MaximaInput input = new MaximaInput();
input.add("display2d:false;"); // very important!
input.add("ratprint:false;"); // very important!
input.add("keepfloat:true;");
fillMaximaInput(toDerive, input, variable);
input.add("quit();"); // very important!
MaximaOutput output = connection.optimizeWithMaxima(input);
//connect in and output
LinkedList<String> connected = new LinkedList<String>();
MaximaRoutines.groupMaximaInAndOutputs(connected, output);
connected.removeFirst(); // remove display2d
connected.removeFirst(); // remove ratsimp
connected.removeFirst(); // remove keepfloat
LinkedList<AssignmentNode> result = new LinkedList<AssignmentNode>();
ListIterator<AssignmentNode> listIterator = toDerive.listIterator();
for (String io : connected) {
AssignmentNode node = listIterator.next();
Expression exp = MaximaRoutines.getExpressionFromMaximaOutput(io);
result.add(new AssignmentNode(node.getGraph(), new MultivectorComponent(node.getVariable().getName(), 0), exp));
}
return result;
} catch (OptimizationException ex) {
Logger.getLogger(MaximaDifferentiater.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
private void fillMaximaInput(LinkedList<AssignmentNode> toDerive, MaximaInput input, MultivectorComponent variable) {
for (AssignmentNode node : toDerive) {
DFGToMaximaCode dfg = new DFGToMaximaCode();
node.getValue().accept(dfg);
input.add("ratsimp(diff("+dfg.getResultString() + ","+variable.getName()+"\\$"+variable.getBladeIndex()+",1));");
}
}
}