From f6d092078114b65e2cac4898830cb112a5c1fbd4 Mon Sep 17 00:00:00 2001 From: Caleb Fontenot Date: Thu, 21 Mar 2024 21:50:22 -0500 Subject: [PATCH] It works but the output is broken :) --- .../edu/slcc/asdv/beans/MatrixOperations.java | 42 ++++++ .../java/edu/slcc/asdv/beans/MenuBar.java | 23 +++- .../main/java/edu/slcc/asdv/bl/Matrices.java | 127 +++++++++++++++++- .../main/java/edu/slcc/asdv/bl/Matrix.java | 2 + .../ZIPs/TermProject1_CalebFontenot.zip | Bin 0 -> 12545 bytes 5 files changed, 183 insertions(+), 11 deletions(-) create mode 100644 Semester 3/ZIPs/TermProject1_CalebFontenot.zip diff --git a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MatrixOperations.java b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MatrixOperations.java index 659348f..43351fd 100644 --- a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MatrixOperations.java +++ b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MatrixOperations.java @@ -35,6 +35,7 @@ public class MatrixOperations implements Serializable ArrayList> b = convertToBigInteger(matrixA.getMatrix()); ArrayList> c = new ArrayList>(); c = convertToString(matrixManipulator.addParallel(a, b)); + printArray(c); matrixC.setMatrixC( c ); return ""; } @@ -44,6 +45,16 @@ public class MatrixOperations implements Serializable ArrayList> b = convertToBigInteger(matrixA.getMatrix()); ArrayList> c = new ArrayList>(); c = convertToString(matrixManipulator.multiplyParallel(a, b)); + printArray(c); + matrixC.setMatrixC( c ); + return "";} + + public String subtract() { + ArrayList> a = convertToBigInteger(matrixA.getMatrix()); + ArrayList> b = convertToBigInteger(matrixA.getMatrix()); + ArrayList> c = new ArrayList>(); + c = convertToString(matrixManipulator.subtractParallel(a, b)); + printArray(c); matrixC.setMatrixC( c ); return "";} @@ -83,5 +94,36 @@ public class MatrixOperations implements Serializable } return string2DArray; } + + /** + * + * @param matrix + * @return + */ + public String printArray(ArrayList> matrix) { + String output = "{\n"; + for (int i = 0; i < matrix.size(); ++i) { + output += printSingleArray(matrix.get(i)); + if ((matrix.size() - 1) > i) { + output += ",\n"; + } + } + output += "\n}"; + System.out.println(output); + return output; + } + + public String printSingleArray(ArrayList matrix) { + String output = "\t{"; + for (int i = 0; i < matrix.size(); ++i) { + output += matrix.get(i); + if ((matrix.size() - 1) > i) { + output += ", "; + } + } + output += "}"; + return output; + } + } diff --git a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MenuBar.java b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MenuBar.java index d9fb89e..8d98aee 100644 --- a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MenuBar.java +++ b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/beans/MenuBar.java @@ -31,7 +31,7 @@ public class MenuBar implements Serializable matrixOperations.add();///adition of matrices System.out.println(matrixOperations.getMatrixC()); - List idsC = new ArrayList(); + List idsC = new ArrayList<>(); idsC.add("formC"); idsC.add("formC:datatableC"); idsC.add("formC:datatableC:columnsC"); @@ -46,10 +46,10 @@ public class MenuBar implements Serializable System.out.println("menu multiply was called"); System.out.println("menu bar multiply()"); - matrixOperations.multiply();///adition of matrices + matrixOperations.multiply();///multiplication of matrices System.out.println(matrixOperations.getMatrixC()); - List idsC = new ArrayList(); + List idsC = new ArrayList<>(); idsC.add("formC"); idsC.add("formC:datatableC"); idsC.add("formC:datatableC:columnsC"); @@ -60,10 +60,19 @@ public class MenuBar implements Serializable public void subtract() { - message( - FacesMessage.SEVERITY_INFO, - "Not implemented.", "To be implemented." - ); + System.out.println("menu subtract was called"); + + System.out.println("menu bar subtract()"); + matrixOperations.subtract();///subtraction of matrices + System.out.println(matrixOperations.getMatrixC()); + + List idsC = new ArrayList<>(); + idsC.add("formC"); + idsC.add("formC:datatableC"); + idsC.add("formC:datatableC:columnsC"); + idsC.add("formC:datatableC:columnsC:inputTextC"); + //idsC.add("form-menu");//:menuBar:submenu_matrices:menuitem_add"); + PrimeFaces.current().ajax().update(idsC); } diff --git a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrices.java b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrices.java index cdc428a..ab749c3 100644 --- a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrices.java +++ b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrices.java @@ -33,10 +33,16 @@ public class Matrices implements Matrix return result; } - - - - + @Override + public ArrayList> subtractParallel(ArrayList> A, ArrayList> B) + { + RecursiveTask>> rt + = new Matrices.MatricesSubtraction(0, A.size() - 1, A, B); + ForkJoinPool pool = new ForkJoinPool(); + ArrayList> result = pool.invoke(rt); + return result; + } + static class MatricesAddition extends RecursiveTask>> { @@ -131,6 +137,18 @@ public class Matrices implements Matrix } return resultsOfMultiplications; } + + public static ArrayList subtractLists(ArrayList list1, ArrayList list2) + { + ArrayList resultsOfSubtraction = new ArrayList(); + for (int bi = 0; bi < list1.size(); + ++bi) + { + resultsOfSubtraction.add(list1.get(bi).subtract(list2.get(bi))); + } + return resultsOfSubtraction; + } + public static ArrayList> columnMajorOrderReversal(ArrayList> b) { @@ -170,6 +188,14 @@ public class Matrices implements Matrix return bd; } + public static BigInteger subtract(ArrayList list) { + BigInteger bd = BigInteger.ZERO; + for (int bi = 0; bi < list.size(); bi++) { + bd = bd.subtract(list.get(bi)); + } + return bd; + } + static class MatricesMultiplication extends RecursiveTask>> { @@ -261,5 +287,98 @@ public class Matrices implements Matrix } } + + static class MatricesSubtraction extends RecursiveTask>> + { + + ArrayList> A; + ArrayList> B; + ArrayList> AxB; + final int HOW_MANY_ROWS_IN_PARALLEL = 3;//threshold + int startIndex; + int endIndex; + + public MatricesSubtraction(int startIndex, int endIndex, + ArrayList> A, + ArrayList> B) + { + this.startIndex = startIndex;//start at this row of the matrix + this.endIndex = endIndex;//end at this row of the matrix + this.A = A; + this.B = B; + AxB = new ArrayList>(); + + } + + /** + * matrix + * 1, 2, 3 + * 4, 5, 6 + * + * will be transformed to + * 1, 4 + * 2, 5 + * 3, 6 + * + * @param list + * @return + */ + @Override + protected ArrayList> compute() + { + //>>This is the addition of matrices in the IF. + //That is, HOW_MANY_ROWS_IN_PARALLEL from matrix A and HOW_MANY_ROWS_IN_PARALLEL from matrix B + if (this.endIndex - this.startIndex < HOW_MANY_ROWS_IN_PARALLEL) + { + ArrayList> resultC = new ArrayList>(); + ArrayList> bTransformed = columnMajorOrderReversal(B); + + for (int biA = this.startIndex; + biA <= this.endIndex; + ++biA) + { + ArrayList rowA = A.get(biA); + ArrayList rowAxB = new ArrayList(); + ArrayList rowCalculation = new ArrayList(); + for (int biB = 0; + biB < bTransformed.size(); + ++biB) + { + ArrayList rowB = bTransformed.get(biB); + + ArrayList productsOfRow = subtractLists(rowA, rowB); + BigInteger sumOfDifference = add(productsOfRow); + rowCalculation.add(sumOfDifference); + + } + resultC.add(rowCalculation); + + } + return resultC; + } + else + { //>> keep on FORKING the matrix until the + //side of the matric is equal or less to HOW_MANY_ROWS_IN_PARALLEL + + int mid = (this.startIndex + this.endIndex) / 2; + RecursiveTask>> firstHalf + = new MatricesMultiplication(this.startIndex, mid, A, B); + + RecursiveTask>> secondHalf + = new MatricesMultiplication(mid + 1, this.endIndex, A, B); + + firstHalf.fork();//this line will invoke method compute + secondHalf.fork();///this line will invoke method compute + + //>> join what the FORKs returned from the IFs + AxB.addAll(firstHalf.join()); + AxB.addAll(secondHalf.join()); + + return AxB; + } + } + + } + } diff --git a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrix.java b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrix.java index fd06101..951e67e 100644 --- a/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrix.java +++ b/Semester 3/Assignments/templatesMatricesSample/src/main/java/edu/slcc/asdv/bl/Matrix.java @@ -15,5 +15,7 @@ public interface Matrix { ArrayList> addParallel(ArrayList> A, ArrayList> B); ArrayList> multiplyParallel(ArrayList> A, ArrayList> B); + ArrayList> subtractParallel(ArrayList> A, ArrayList> B); + } diff --git a/Semester 3/ZIPs/TermProject1_CalebFontenot.zip b/Semester 3/ZIPs/TermProject1_CalebFontenot.zip new file mode 100644 index 0000000000000000000000000000000000000000..5527979b740c87b3c091b42504b5c26576d56b0b GIT binary patch literal 12545 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