From cb9c3bedead16951f07d0de036fb898f5e6c2671 Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 10 May 2016 14:42:41 +0200 Subject: [PATCH] fixed problems with QMC if there are to many primes --- .../analyse/quinemc/QuineMcCluskey.java | 3 +- .../quinemc/primeselector/BruteForce.java | 11 +++--- .../primeselector/BruteForceGetAll.java | 13 +++---- .../quinemc/primeselector/PrimeSelector.java | 28 +++++---------- .../primeselector/PrimeSelectorDefault.java | 34 +++++++++++++++++++ .../primeselector/PrimeSelectorGetAll.java | 19 ----------- .../components/table/ExpressionCreator.java | 5 +-- .../quinemc/QuineMcCluskeyRegressionTest.java | 4 +-- .../analyse/quinemc/QuineMcCluskeyTest.java | 4 +-- 9 files changed, 60 insertions(+), 61 deletions(-) create mode 100644 src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorDefault.java delete mode 100644 src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorGetAll.java diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java b/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java index 8ccda9c01..140bdcd55 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java @@ -3,6 +3,7 @@ package de.neemann.digital.analyse.quinemc; import de.neemann.digital.analyse.expression.*; import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelector; +import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelectorDefault; import de.neemann.digital.lang.Lang; import java.util.ArrayList; @@ -110,7 +111,7 @@ public class QuineMcCluskey { * @return the simplified QMC instance */ public QuineMcCluskey simplify() { - return simplify(PrimeSelector.DEFAULT); + return simplify(new PrimeSelectorDefault()); } /** diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForce.java b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForce.java index 7737a628b..7f59c5c4e 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForce.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForce.java @@ -5,7 +5,6 @@ import de.neemann.digital.analyse.quinemc.TableRow; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.TreeSet; /** @@ -14,17 +13,15 @@ import java.util.TreeSet; public class BruteForce implements PrimeSelector { @Override public void select(ArrayList primes, ArrayList primesAvail, TreeSet termIndices) { + if (primesAvail.size() > 31) + throw new RuntimeException("to many primes"); + int comb = 1 << primesAvail.size(); ArrayList list = new ArrayList<>(comb); for (int i = 1; i < comb; i++) { list.add(i); } - Collections.sort(list, new Comparator() { - @Override - public int compare(Integer i1, Integer i2) { - return Integer.bitCount(i1) - Integer.bitCount(i2); - } - }); + Collections.sort(list, (i1, i2) -> Integer.bitCount(i1) - Integer.bitCount(i2)); ArrayList l = new ArrayList<>(); for (int mask : list) { diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForceGetAll.java b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForceGetAll.java index f37b1f304..b51a64746 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForceGetAll.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/BruteForceGetAll.java @@ -5,29 +5,26 @@ import de.neemann.digital.analyse.quinemc.TableRow; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.TreeSet; /** * @author hneemann */ -public class BruteForceGetAll implements PrimeSelector, PrimeSelectorGetAll { +public class BruteForceGetAll implements PrimeSelector { private ArrayList> foundSolutions; @Override public void select(ArrayList primes, ArrayList primesAvail, TreeSet termIndices) { + if (primesAvail.size() > 31) + throw new RuntimeException("to many primes"); + int comb = 1 << primesAvail.size(); ArrayList list = new ArrayList<>(comb); for (int i = 1; i < comb; i++) { list.add(i); } - Collections.sort(list, new Comparator() { - @Override - public int compare(Integer i1, Integer i2) { - return Integer.bitCount(i1) - Integer.bitCount(i2); - } - }); + Collections.sort(list, (i1, i2) -> Integer.bitCount(i1) - Integer.bitCount(i2)); int primesUsed = 0; diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelector.java b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelector.java index 632df185c..a29cb97ad 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelector.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelector.java @@ -13,26 +13,6 @@ import java.util.TreeSet; */ public interface PrimeSelector { - /** - * The default prime selector - */ - PrimeSelector DEFAULT = new PrimeSelector() { - - private final PrimeSelector bruteForce = new BruteForceGetAll(); - private final PrimeSelector largestFirst = new LargestFirst(); - - @Override - public void select(ArrayList primes, ArrayList primesAvail, TreeSet termIndices) { - int count = primesAvail.size(); - - if (count <= 12) { - bruteForce.select(primes, primesAvail, termIndices); - } else { - largestFirst.select(primes, primesAvail, termIndices); - } - } - }; - /** * Selects the primes to use * @@ -41,4 +21,12 @@ public interface PrimeSelector { * @param termIndices the indices */ void select(ArrayList primes, ArrayList primesAvail, TreeSet termIndices); + + /** + * @return all possible solutions + */ + default ArrayList> getAllSolutions() { + return null; + } + } diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorDefault.java b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorDefault.java new file mode 100644 index 000000000..5df3e8715 --- /dev/null +++ b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorDefault.java @@ -0,0 +1,34 @@ +package de.neemann.digital.analyse.quinemc.primeselector; + +import de.neemann.digital.analyse.quinemc.TableRow; + +import java.util.ArrayList; +import java.util.TreeSet; + +/** + * @author hneemann + */ +public class PrimeSelectorDefault implements PrimeSelector { + + private PrimeSelector ps; + + @Override + public void select(ArrayList primes, ArrayList primesAvail, TreeSet termIndices) { + int count = primesAvail.size(); + if (count <= 22) { + ps = new BruteForceGetAll(); + } else { + ps = new LargestFirst(); + } + ps.select(primes, primesAvail, termIndices); + } + + @Override + public ArrayList> getAllSolutions() { + if (ps == null) + return null; + else + return ps.getAllSolutions(); + } + +} diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorGetAll.java b/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorGetAll.java deleted file mode 100644 index 36f25932f..000000000 --- a/src/main/java/de/neemann/digital/analyse/quinemc/primeselector/PrimeSelectorGetAll.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.neemann.digital.analyse.quinemc.primeselector; - - -import de.neemann.digital.analyse.quinemc.TableRow; - -import java.util.ArrayList; - -/** - * Used to create all possible sollutions - * - * @author hneemann - */ -public interface PrimeSelectorGetAll { - - /** - * @return all possible solutions - */ - ArrayList> getAllSolutions(); -} diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index 7e6adaa7d..869dec630 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -8,7 +8,8 @@ import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.expression.format.FormatterException; import de.neemann.digital.analyse.quinemc.QuineMcCluskey; import de.neemann.digital.analyse.quinemc.TableRow; -import de.neemann.digital.analyse.quinemc.primeselector.BruteForceGetAll; +import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelector; +import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelectorDefault; import java.util.ArrayList; @@ -39,7 +40,7 @@ public abstract class ExpressionCreator { public void create() throws ExpressionException, FormatterException { ArrayList vars = theTable.getVars(); for (int table = 0; table < theTable.getResultCount(); table++) { - BruteForceGetAll ps = new BruteForceGetAll(); + PrimeSelector ps = new PrimeSelectorDefault(); Expression e = new QuineMcCluskey(vars) .fillTableWith(theTable.getResult(table)) .simplify(ps) diff --git a/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyRegressionTest.java b/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyRegressionTest.java index 71e5c5d73..30669ddc1 100644 --- a/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyRegressionTest.java +++ b/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyRegressionTest.java @@ -5,7 +5,7 @@ import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.expression.format.FormatToExpression; import de.neemann.digital.analyse.expression.format.FormatterException; -import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelector; +import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelectorDefault; import junit.framework.TestCase; import java.util.ArrayList; @@ -53,7 +53,7 @@ public class QuineMcCluskeyRegressionTest extends TestCase { System.out.println(FormatToExpression.FORMATTER_JAVA.format(t.getExpression())); t = t.simplifyStep().removeDuplicates(); } - t.simplifyPrimes(PrimeSelector.DEFAULT); + t.simplifyPrimes(new PrimeSelectorDefault()); assertEquals("A || C", FormatToExpression.FORMATTER_JAVA.format(t.getExpression())); System.out.println("--"); } diff --git a/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyTest.java b/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyTest.java index 7c9a10cde..d6d594dc5 100644 --- a/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyTest.java +++ b/src/test/java/de/neemann/digital/analyse/quinemc/QuineMcCluskeyTest.java @@ -7,7 +7,7 @@ import de.neemann.digital.analyse.expression.ExpressionException; import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.expression.format.FormatToExpression; import de.neemann.digital.analyse.expression.format.FormatterException; -import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelector; +import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelectorDefault; import junit.framework.TestCase; import java.util.ArrayList; @@ -101,7 +101,7 @@ public class QuineMcCluskeyTest extends TestCase { Expression exp = t.getExpression(); assertEquals("(A && C && D) || (!B && !D) || (!B && C) || (!C && !D)", FormatToExpression.FORMATTER_JAVA.format(exp)); - t.simplifyPrimes(PrimeSelector.DEFAULT); + t.simplifyPrimes(new PrimeSelectorDefault()); exp = t.getExpression(); assertEquals("(A && C && D) || (!B && C) || (!C && !D)", FormatToExpression.FORMATTER_JAVA.format(exp));