mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-17 08:55:05 -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.expression.*;
|
||||||
import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelector;
|
import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelector;
|
||||||
|
import de.neemann.digital.analyse.quinemc.primeselector.PrimeSelectorDefault;
|
||||||
import de.neemann.digital.lang.Lang;
|
import de.neemann.digital.lang.Lang;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -110,7 +111,7 @@ public class QuineMcCluskey {
|
|||||||
* @return the simplified QMC instance
|
* @return the simplified QMC instance
|
||||||
*/
|
*/
|
||||||
public QuineMcCluskey simplify() {
|
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.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -14,17 +13,15 @@ import java.util.TreeSet;
|
|||||||
public class BruteForce implements PrimeSelector {
|
public class BruteForce implements PrimeSelector {
|
||||||
@Override
|
@Override
|
||||||
public void select(ArrayList<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices) {
|
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();
|
int comb = 1 << primesAvail.size();
|
||||||
ArrayList<Integer> list = new ArrayList<>(comb);
|
ArrayList<Integer> list = new ArrayList<>(comb);
|
||||||
for (int i = 1; i < comb; i++) {
|
for (int i = 1; i < comb; i++) {
|
||||||
list.add(i);
|
list.add(i);
|
||||||
}
|
}
|
||||||
Collections.sort(list, new Comparator<Integer>() {
|
Collections.sort(list, (i1, i2) -> Integer.bitCount(i1) - Integer.bitCount(i2));
|
||||||
@Override
|
|
||||||
public int compare(Integer i1, Integer i2) {
|
|
||||||
return Integer.bitCount(i1) - Integer.bitCount(i2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
ArrayList<Integer> l = new ArrayList<>();
|
ArrayList<Integer> l = new ArrayList<>();
|
||||||
for (int mask : list) {
|
for (int mask : list) {
|
||||||
|
@ -5,29 +5,26 @@ import de.neemann.digital.analyse.quinemc.TableRow;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
*/
|
*/
|
||||||
public class BruteForceGetAll implements PrimeSelector, PrimeSelectorGetAll {
|
public class BruteForceGetAll implements PrimeSelector {
|
||||||
|
|
||||||
private ArrayList<ArrayList<TableRow>> foundSolutions;
|
private ArrayList<ArrayList<TableRow>> foundSolutions;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void select(ArrayList<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices) {
|
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();
|
int comb = 1 << primesAvail.size();
|
||||||
ArrayList<Integer> list = new ArrayList<>(comb);
|
ArrayList<Integer> list = new ArrayList<>(comb);
|
||||||
for (int i = 1; i < comb; i++) {
|
for (int i = 1; i < comb; i++) {
|
||||||
list.add(i);
|
list.add(i);
|
||||||
}
|
}
|
||||||
Collections.sort(list, new Comparator<Integer>() {
|
Collections.sort(list, (i1, i2) -> Integer.bitCount(i1) - Integer.bitCount(i2));
|
||||||
@Override
|
|
||||||
public int compare(Integer i1, Integer i2) {
|
|
||||||
return Integer.bitCount(i1) - Integer.bitCount(i2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
int primesUsed = 0;
|
int primesUsed = 0;
|
||||||
|
|
||||||
|
@ -13,26 +13,6 @@ import java.util.TreeSet;
|
|||||||
*/
|
*/
|
||||||
public interface PrimeSelector {
|
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
|
* Selects the primes to use
|
||||||
*
|
*
|
||||||
@ -41,4 +21,12 @@ public interface PrimeSelector {
|
|||||||
* @param termIndices the indices
|
* @param termIndices the indices
|
||||||
*/
|
*/
|
||||||
void select(ArrayList<TableRow> primes, ArrayList<TableRow> primesAvail, TreeSet<Integer> termIndices);
|
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.expression.format.FormatterException;
|
||||||
import de.neemann.digital.analyse.quinemc.QuineMcCluskey;
|
import de.neemann.digital.analyse.quinemc.QuineMcCluskey;
|
||||||
import de.neemann.digital.analyse.quinemc.TableRow;
|
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;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@ -39,7 +40,7 @@ public abstract class ExpressionCreator {
|
|||||||
public void create() throws ExpressionException, FormatterException {
|
public void create() throws ExpressionException, FormatterException {
|
||||||
ArrayList<Variable> vars = theTable.getVars();
|
ArrayList<Variable> vars = theTable.getVars();
|
||||||
for (int table = 0; table < theTable.getResultCount(); table++) {
|
for (int table = 0; table < theTable.getResultCount(); table++) {
|
||||||
BruteForceGetAll ps = new BruteForceGetAll();
|
PrimeSelector ps = new PrimeSelectorDefault();
|
||||||
Expression e = new QuineMcCluskey(vars)
|
Expression e = new QuineMcCluskey(vars)
|
||||||
.fillTableWith(theTable.getResult(table))
|
.fillTableWith(theTable.getResult(table))
|
||||||
.simplify(ps)
|
.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.Variable;
|
||||||
import de.neemann.digital.analyse.expression.format.FormatToExpression;
|
import de.neemann.digital.analyse.expression.format.FormatToExpression;
|
||||||
import de.neemann.digital.analyse.expression.format.FormatterException;
|
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 junit.framework.TestCase;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -53,7 +53,7 @@ public class QuineMcCluskeyRegressionTest extends TestCase {
|
|||||||
System.out.println(FormatToExpression.FORMATTER_JAVA.format(t.getExpression()));
|
System.out.println(FormatToExpression.FORMATTER_JAVA.format(t.getExpression()));
|
||||||
t = t.simplifyStep().removeDuplicates();
|
t = t.simplifyStep().removeDuplicates();
|
||||||
}
|
}
|
||||||
t.simplifyPrimes(PrimeSelector.DEFAULT);
|
t.simplifyPrimes(new PrimeSelectorDefault());
|
||||||
assertEquals("A || C", FormatToExpression.FORMATTER_JAVA.format(t.getExpression()));
|
assertEquals("A || C", FormatToExpression.FORMATTER_JAVA.format(t.getExpression()));
|
||||||
System.out.println("--");
|
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.Variable;
|
||||||
import de.neemann.digital.analyse.expression.format.FormatToExpression;
|
import de.neemann.digital.analyse.expression.format.FormatToExpression;
|
||||||
import de.neemann.digital.analyse.expression.format.FormatterException;
|
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 junit.framework.TestCase;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -101,7 +101,7 @@ public class QuineMcCluskeyTest extends TestCase {
|
|||||||
Expression exp = t.getExpression();
|
Expression exp = t.getExpression();
|
||||||
assertEquals("(A && C && D) || (!B && !D) || (!B && C) || (!C && !D)", FormatToExpression.FORMATTER_JAVA.format(exp));
|
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();
|
exp = t.getExpression();
|
||||||
assertEquals("(A && C && D) || (!B && C) || (!C && !D)", FormatToExpression.FORMATTER_JAVA.format(exp));
|
assertEquals("(A && C && D) || (!B && C) || (!C && !D)", FormatToExpression.FORMATTER_JAVA.format(exp));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user