package de.gaalop.tba.table;
import de.gaalop.cfg.AlgebraDefinitionFile;
import de.gaalop.productComputer.GeoProductCalculator;
import de.gaalop.productComputer.InnerProductCalculator;
import de.gaalop.productComputer.OuterProductCalculator;
import de.gaalop.tba.BladeRef;
import de.gaalop.tba.IMultTable;
import de.gaalop.tba.MultTableAbsDirectComputer;
import de.gaalop.tba.MultTableImpl;
import de.gaalop.tba.Multivector;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.JFileChooser;
/**
* Creates a product table of an algebra, given by its definition file.
* @author Christian Steinmetz
*/
public class Main {
private static void createFromDir(File dir, int format) throws FileNotFoundException, IOException {
System.out.print(dir.getName()+":");
if (!dir.exists()) {
System.out.println("The given first parameter, is not the path of an existing directory!");
System.exit(2);
}
File definitionFile = new File(dir, "definition.csv");
if (!definitionFile.exists()) {
System.out.println("There is no file named 'definition.csv' in the directory!");
System.exit(3);
}
AlgebraDefinitionFile alFile = new AlgebraDefinitionFile();
FileInputStream inputStream = new FileInputStream(definitionFile);
alFile.loadFromFile(inputStream);
inputStream.close();
IMultTable inner = new MultTableAbsDirectComputer(alFile, new InnerProductCalculator());
IMultTable outer = new MultTableAbsDirectComputer(alFile, new OuterProductCalculator());
IMultTable geo = new MultTableAbsDirectComputer(alFile, new GeoProductCalculator());
int dimension = alFile.base.length-1;
TableFormat.writeToFile((int) Math.pow(2,dimension), dimension, inner, outer, geo, new FileOutputStream(new File(dir, "products.csv")),format);
System.out.println("Verify created file");
int bladeCount = (int) Math.pow(2, dimension);
IMultTable innerStored = new MultTableImpl();
innerStored.createTable(bladeCount);
IMultTable outerStored = new MultTableImpl();
outerStored.createTable(bladeCount);
IMultTable geoStored = new MultTableImpl();
geoStored.createTable(bladeCount);
TableFormat.readFromFile(new FileInputStream(new File(dir, "products.csv")), innerStored, outerStored, geoStored);
testEqual(innerStored, inner, dimension);
testEqual(outerStored, outer, dimension);
testEqual(geoStored, geo, dimension);
}
private static void gui(String[] args) throws FileNotFoundException, IOException {
File dir = null;
if (args.length == 0) {
JFileChooser jFC = new JFileChooser("D:\\BscMsc\\Gaalop\\algebra\\src\\main\\resources\\de\\gaalop\\algebra\\algebra");
jFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if (jFC.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
dir = jFC.getSelectedFile();
System.out.println(dir.getCanonicalPath());
} else {
System.out.println("No directory chosen!");
System.exit(1);
}
} else
dir = new File(args[0]);
}
private static void createAll() throws FileNotFoundException, IOException {
File directory = new File("D:\\BscMsc\\Gaalop\\algebra\\src\\main\\resources\\de\\gaalop\\algebra\\algebra");
File[] dirs = directory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
Arrays.sort(dirs);
for (File dir: dirs)
createFromDir(dir,TableFormat.TABLE_COMPRESSED_MAX);
}
/**
* @param args the command line arguments:
* 0: directory path
*/
public static void main(String[] args) throws FileNotFoundException, IOException {
//gui(args);
createAll();
}
private static void testEqual(IMultTable t1, IMultTable t2, int dimension) {
int bladeCount = (int) Math.pow(2,dimension);
for (int i1 = 0;i1 < bladeCount;i1++)
for (int i2 = 0;i2 < bladeCount;i2++)
if (!testEqual(t1.getProduct(i1, i2), t2.getProduct(i1, i2)))
System.out.print(i1+"!="+i2+": "+t1.getProduct(i1, i2).print()+" != "+t2.getProduct(i1, i2).print());
}
private static boolean testEqual(Multivector m1, Multivector m2) {
Vector<BladeRef> v1 = new Vector<BladeRef>(m1.getBlades());
Vector<BladeRef> v2 = new Vector<BladeRef>(m2.getBlades());
if (v1.size() != v2.size())
return false;
for (BladeRef b2: v2) {
if (v1.contains(b2))
v1.remove(b2);
}
return v1.isEmpty();
}
}