fixed problems with QMC if there are to many primes

This commit is contained in:
hneemann 2016-05-10 14:42:41 +02:00
parent 64b2e2a185
commit cb9c3bedea
9 changed files with 60 additions and 61 deletions

View File

@ -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());
}
/**

View File

@ -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<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices) {
if (primesAvail.size() > 31)
throw new RuntimeException("to many primes");
int comb = 1 << primesAvail.size();
ArrayList<Integer> list = new ArrayList<>(comb);
for (int i = 1; i < comb; i++) {
list.add(i);
}
Collections.sort(list, new Comparator<Integer>() {
@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<Integer> l = new ArrayList<>();
for (int mask : list) {

View File

@ -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<ArrayList<TableRow>> foundSolutions;
@Override
public void select(ArrayList<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices) {
if (primesAvail.size() > 31)
throw new RuntimeException("to many primes");
int comb = 1 << primesAvail.size();
ArrayList<Integer> list = new ArrayList<>(comb);
for (int i = 1; i < comb; i++) {
list.add(i);
}
Collections.sort(list, new Comparator<Integer>() {
@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;

View File

@ -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<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> 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<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices);
/**
* @return all possible solutions
*/
default ArrayList<ArrayList<TableRow>> getAllSolutions() {
return null;
}
}

View File

@ -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<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices) {
int count = primesAvail.size();
if (count <= 22) {
ps = new BruteForceGetAll();
} else {
ps = new LargestFirst();
}
ps.select(primes, primesAvail, termIndices);
}
@Override
public ArrayList<ArrayList<TableRow>> getAllSolutions() {
if (ps == null)
return null;
else
return ps.getAllSolutions();
}
}

View File

@ -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<ArrayList<TableRow>> getAllSolutions();
}

View File

@ -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<Variable> 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)

View File

@ -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("--");
}

View File

@ -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));