package de.gaalop.tba;
import de.gaalop.algebra.TCBlade;
import de.gaalop.cfg.AlgebraDefinitionFile;
import de.gaalop.dfg.Expression;
import java.util.HashMap;
import java.util.Vector;
/**
* Defines an algebra by storing the base elements and the blades
* @author Christian Steinmetz
*/
public class Algebra {
private String[] base;
private Vector<Blade> blades = new Vector<Blade>();
private HashMap<Blade,Integer> indices = new HashMap<Blade, Integer>();
private boolean dirty;
public Algebra() {
dirty = true;
}
public Algebra(String[] base, TCBlade[] blades) {
this.base = base;
for (TCBlade b: blades)
this.blades.add(new Blade(b));
dirty = true;
}
public Algebra(AlgebraDefinitionFile alFile) {
this.base = alFile.base;
for (Expression e: alFile.blades)
blades.add(Blade.createBladeFromExpression(e));
dirty = true;
}
public int getBladeCount() {
return blades.size();
}
public Blade getBlade(int index) {
if (index < blades.size()) {
return blades.get(index);
} else
return blades.get(0); //hint: inputsVector.bladeIndex can be greater then algebra bladecount, if more than 2^n input variables exist.
//Return blade "1" in this case (of a vector), because the order of a vector depends not on the algebra.
}
public void setBlade(int index, Blade bladeExpr) {
if (index > blades.size() - 1) {
blades.setSize(index + 1);
}
blades.set(index, bladeExpr);
dirty = true;
}
/**
* Returns the index to a given blade
* @param bladeExpr The blade to be searched
* @return The index of the blade
*/
public int getIndex(Blade bladeExpr) {
if (dirty) buildMap();
if (bladeExpr.getBases().isEmpty())
return 0;
return indices.get(bladeExpr);
}
public String[] getBase() {
return base;
}
public void setBase(String[] base) {
this.base = base;
}
/**
* Returns the number of elements in the base
* @return The number of base elements
*/
public int getBaseCount() {
return base.length - 1;
}
public void buildMap() {
indices.clear();
int i=0;
for (Blade b: blades)
indices.put(b, i++);
dirty = false;
}
}