package de.gaalop.tba;
import de.gaalop.algebra.TCBlade;
import de.gaalop.dfg.BaseVector;
import de.gaalop.dfg.Expression;
import de.gaalop.dfg.ExpressionFactory;
import de.gaalop.dfg.FloatConstant;
import de.gaalop.visitors.DFGTraversalVisitor;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Vector;
/**
* Defines a blade with a sign and a coefficient
* @author Christian Steinmetz
*/
public class Blade {
private Vector<String> bases;
public Blade() {
bases = new Vector<String>();
}
public Blade(String[] bases) {
this.bases = new Vector<String>(Arrays.asList(bases));
}
public Blade(Vector<String> bases) {
this.bases = bases;
}
public Blade(TCBlade b) {
this.bases = new Vector<String>(Arrays.asList(b.getBase()));
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (String b : bases) {
sb.append("^" + b);
}
if (bases.size() > 0) {
return sb.substring(1);
} else {
return "1.0";
}
}
/**
* Adds a basis to this blade
* @param toAdd The basis to be added
*/
public void addBasis(String toAdd) {
bases.add(toAdd);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Blade) {
Blade comp = (Blade) obj;
return bases.equals(comp.bases);
}
return false;
}
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + (this.bases != null ? this.bases.hashCode() : 0);
return hash;
}
public Vector<String> getBases() {
return bases;
}
/**
* Creates an expression of this blade
* @return The expression
*/
public Expression getExpression() {
if (bases.size() >= 1) {
Expression result = getBaseVector(bases.get(0));
for (int i = 1; i < bases.size(); i++) {
result = ExpressionFactory.wedge(result, getBaseVector(bases.get(i)));
}
return result;
} else {
throw new IllegalStateException("Blade: Blade contains no base element!");
}
}
/**
* Converts a string into either an BaseVector or FloatConstant
* @param string The string
* @return The converted string
*/
private Expression getBaseVector(String string) {
if (string.equals("1")) {
return new FloatConstant(1);
} else {
return new BaseVector(string.substring(1));
}
}
public static Blade createBladeFromExpression(Expression expr) {
final LinkedList<String> list = new LinkedList<String>();
DFGTraversalVisitor visitor = new DFGTraversalVisitor() {
@Override
public void visit(BaseVector node) {
list.add(node.toString());
super.visit(node);
}
};
expr.accept(visitor);
return new Blade(list.toArray(new String[0]));
}
}