package it.cavallium.warppi.math.rules.methods; import it.cavallium.warppi.math.Function; import it.cavallium.warppi.math.MathContext; import it.cavallium.warppi.math.functions.Multiplication; import it.cavallium.warppi.util.Error; import it.unimi.dsi.fastutil.objects.ObjectArrayList; /** * Multiplication method
* Example: X*3*X*2 = 6*X^2 * * @author Andrea Cavalli * */ public class MultiplicationMethod1 { public static boolean compare(final Function f) throws InterruptedException { return false;//TODO: return ((Multiplication) f).getParameter1().isSimplified() && ((Multiplication) f).getParameter2().isSimplified() && !(((Multiplication) f).getParameter1() instanceof Number && ((Multiplication) f).getParameter2() instanceof Number) && getFirstWorkingMultiplicationCouple(getMultiplicationElements(f)) != null; } public static ObjectArrayList execute(final Function f) throws Error, InterruptedException { Function result; final MathContext root = f.getMathContext(); final ObjectArrayList elements = MultiplicationMethod1.getMultiplicationElements(f); final int[] workingElementCouple = MultiplicationMethod1.getFirstWorkingMultiplicationCouple(elements); final Function elem1 = elements.get(workingElementCouple[0]); final Function elem2 = elements.get(workingElementCouple[1]); final int size = elements.size(); Function prec = new Multiplication(root, elem1, elem2); for (int i = size - 1; i >= 0; i--) { if (Thread.interrupted()) { throw new InterruptedException(); } if (i != workingElementCouple[0] & i != workingElementCouple[1]) { final Function a = prec; final Function b = elements.get(i); prec = new Multiplication(root, a, b); } } result = prec; final ObjectArrayList results = new ObjectArrayList<>(); results.add(result); return results; } private static ObjectArrayList getMultiplicationElements(Function mult) throws InterruptedException { final ObjectArrayList elements = new ObjectArrayList<>(); while (mult instanceof Multiplication) { if (Thread.interrupted()) { throw new InterruptedException(); } elements.add(((Multiplication) mult).getParameter1()); mult = ((Multiplication) mult).getParameter2(); } elements.add(mult); return elements; } private static int[] getFirstWorkingMultiplicationCouple(final ObjectArrayList elements) throws InterruptedException { return null; // TODO: // final int size = elements.size(); // Function a; // Function b; // if (elements.size() == 0) { // return null; // } // if (elements.size() == 2) { // return null; // } // final MathContext root = elements.get(0).getMathContext(); // for (int i = 0; i < size; i++) { // a = elements.get(i); // for (int j = 0; j < size; j++) { // if (Thread.interrupted()) throw new InterruptedException(); // b = elements.get(j); // if (i != j) { // Function testFunc; // testFunc = new Multiplication(root, a, b); // if (!testFunc.isSimplified()) { // return new int[] { i, j }; // } // } // } // } // return null; } }