mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-16 08:25:09 -04:00
fixed problems with QMC if there are to many primes
This commit is contained in:
parent
64b2e2a185
commit
cb9c3bedea
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
@ -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)
|
||||
|
@ -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("--");
|
||||
}
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user