package producttablecreator; 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 de.gaalop.tba.table.BitIO.MaxReader; import de.gaalop.tba.table.BitIO.MaxWriter; import de.gaalop.tba.table.TableCompressed; import de.gaalop.tba.table.TableFormat; import java.io.DataInputStream; import java.io.DataOutputStream; 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.HashSet; import java.util.LinkedList; import javax.swing.JFileChooser; /** * Creates a product table of an algebra, given by its definition file. * @author Christian Steinmetz */ public class SimpleProductTableCreator { /** * @param args the command line arguments: * 0: directory path */ public static void main(String[] args) throws FileNotFoundException, IOException { File dir = null; if (args.length == 0) { JFileChooser jFC = new JFileChooser(); 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]); if (!dir.exists()) { System.out.println("The given first parameter, is not the path of an existing directory!"); System.exit(2); } File[] subDirs = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); if (subDirs.length == 0) { computeTableOfSingleAlgebra(dir); } else { for (File dirS: subDirs) { System.out.println("Compute "+dirS.getCanonicalPath()); computeTableOfSingleAlgebra(dirS); } } System.exit(0); } private static void computeTableOfSingleAlgebra(File dir) throws FileNotFoundException, IOException { 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; DataOutputStream dout = new DataOutputStream(new FileOutputStream(new File(dir, "products.csv"))); TableFormat.writeToFile((int) Math.pow(2,dimension), dimension, inner, outer, geo, dout, TableFormat.TABLE_COMPRESSED_MAX); //Test written products int bladeCount = (int) Math.pow(2,dimension); IMultTable innerS = new MultTableImpl();innerS.createTable(bladeCount); IMultTable outerS = new MultTableImpl();outerS.createTable(bladeCount); IMultTable geoS = new MultTableImpl();geoS.createTable(bladeCount); TableFormat.readFromFile(new DataInputStream(new FileInputStream(new File(dir, "products.csv"))), innerS, outerS, geoS); boolean ok = true; for (int i=0;i<bladeCount;i++) for (int j=0;j<bladeCount;j++) { if (!multivectorsEqual(inner.getProduct(i, j), innerS.getProduct(i, j))) ok = false; if (!multivectorsEqual(outer.getProduct(i, j), outerS.getProduct(i, j))) ok = false; if (!multivectorsEqual(geo.getProduct(i, j) ,geoS.getProduct(i, j))) ok = false; } System.out.println("Successful="+ok); } private static boolean multivectorsEqual(Multivector m1, Multivector m2) { if (m1.getBlades().size() != m2.getBlades().size()) return false; HashSet<BladeRef> set1 = new HashSet<BladeRef>(m1.getBlades()); for (BladeRef bref2: m2.getBlades()) { if (set1.contains(bref2)) { set1.remove(bref2); } else return false; } return set1.isEmpty(); } }