refactoring of deciding which minimizer to use

This commit is contained in:
hneemann 2017-03-14 17:03:00 +01:00
parent fb5537dba8
commit 0f9a633d30
4 changed files with 99 additions and 25 deletions

View File

@ -130,7 +130,10 @@ public class QuineMcCluskey {
} }
void simplifyStep() { /**
* a single simplification iteration
*/
public void simplifyStep() {
TableRows newRows = new TableRows(); TableRows newRows = new TableRows();
for (TableRows.InnerList list : rows.listIterable()) for (TableRows.InnerList list : rows.listIterable())
@ -159,7 +162,7 @@ public class QuineMcCluskey {
if (!row.isUsed() && row.getSource().size() > 0) if (!row.isUsed() && row.getSource().size() > 0)
primes.add(row); primes.add(row);
rows=newRows; rows = newRows;
} }
/** /**
@ -169,6 +172,22 @@ public class QuineMcCluskey {
return rows.isEmpty(); return rows.isEmpty();
} }
/**
* @return the actual table rows
*/
public TableRows getRows() {
return rows;
}
/**
* Sets the table rows.
*
* @param rows the rows to use
*/
public void setRows(TableRows rows) {
this.rows = rows;
}
@Override @Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();

View File

@ -10,18 +10,29 @@ import java.util.TreeMap;
* *
* @author hneemann * @author hneemann
*/ */
final class TableRows implements Iterable<TableRow> { public final class TableRows implements Iterable<TableRow> {
private final TreeMap<Long, InnerList> rows; private final TreeMap<Long, InnerList> rows;
private int size; private int size;
TableRows() { /**
* Creates a new set of table rows
*/
public TableRows() {
rows = new TreeMap<>(); rows = new TreeMap<>();
} }
/**
* @return the number of rows in the table
*/
public int size() { public int size() {
return size; return size;
} }
/**
* Adds a row to the table
*
* @param tableRow the row to add
*/
public void add(TableRow tableRow) { public void add(TableRow tableRow) {
long flags = tableRow.getOptimizedFlags(); long flags = tableRow.getOptimizedFlags();
getList(flags).add(tableRow); getList(flags).add(tableRow);
@ -37,11 +48,19 @@ final class TableRows implements Iterable<TableRow> {
return list; return list;
} }
/**
* remove all rows from this list
*/
public void clear() { public void clear() {
rows.clear(); rows.clear();
size = 0; size = 0;
} }
/**
* Add all rows from the given list
*
* @param newRows the list of rows
*/
public void addAll(TableRows newRows) { public void addAll(TableRows newRows) {
for (Map.Entry<Long, InnerList> e : newRows.rows.entrySet()) { for (Map.Entry<Long, InnerList> e : newRows.rows.entrySet()) {
InnerList values = e.getValue(); InnerList values = e.getValue();
@ -50,6 +69,9 @@ final class TableRows implements Iterable<TableRow> {
} }
} }
/**
* @return truw if this list is empty
*/
public boolean isEmpty() { public boolean isEmpty() {
return size == 0; return size == 0;
} }
@ -74,11 +96,20 @@ final class TableRows implements Iterable<TableRow> {
return new RowIterator(rows.values().iterator()); return new RowIterator(rows.values().iterator());
} }
/**
* @return a list of lists with all rows of the same optimized bit mask
*/
public Iterable<InnerList> listIterable() { public Iterable<InnerList> listIterable() {
return rows.values(); return rows.values();
} }
/**
* get the i'th row of this list
*
* @param i the index of the row
* @return the row
*/
public TableRow get(int i) { public TableRow get(int i) {
for (Map.Entry<Long, InnerList> e : rows.entrySet()) { for (Map.Entry<Long, InnerList> e : rows.entrySet()) {
InnerList list = e.getValue(); InnerList list = e.getValue();
@ -118,38 +149,65 @@ final class TableRows implements Iterable<TableRow> {
} }
} }
static final class InnerList implements Iterable<TableRow> { /**
* A list of rows with the same optimized mask
*/
public static final class InnerList implements Iterable<TableRow> {
private ArrayList<TableRow> innerList; private ArrayList<TableRow> innerList;
// private HashSet<TableRow> innerSet; // private HashSet<TableRow> innerSet;
private InnerList() { private InnerList() {
innerList=new ArrayList<>(); innerList = new ArrayList<>();
// innerSet=new HashSet<>(); // innerSet=new HashSet<>();
} }
/**
* @param r the row to search for
* @return true if this list contains the given row
*/
public boolean contains(TableRow r) { public boolean contains(TableRow r) {
return innerList.contains(r); return innerList.contains(r);
// return innerSet.contains(r); // return innerSet.contains(r);
} }
/**
* Add all given rows to thisd list
*
* @param values the rows to add
*/
public void addAll(InnerList values) { public void addAll(InnerList values) {
for (TableRow tr : values) for (TableRow tr : values)
add(tr); add(tr);
} }
/**
* add a single row to this list
*
* @param tableRow the row to add
*/
public void add(TableRow tableRow) { public void add(TableRow tableRow) {
innerList.add(tableRow); innerList.add(tableRow);
// innerSet.add(tableRow); // innerSet.add(tableRow);
} }
/**
* @return the size of this list
*/
public int size() { public int size() {
return innerList.size(); return innerList.size();
} }
/**
* returns the i'th element of this list
*
* @param i the index
* @return the row
*/
public TableRow get(int i) { public TableRow get(int i) {
return innerList.get(i); return innerList.get(i);
} }
@Override
public Iterator<TableRow> iterator() { public Iterator<TableRow> iterator() {
return innerList.iterator(); return innerList.iterator();
} }

View File

@ -1,8 +1,6 @@
package de.neemann.digital.gui.components.table; package de.neemann.digital.gui.components.table;
import de.neemann.digital.analyse.AnalyseException; import de.neemann.digital.analyse.*;
import de.neemann.digital.analyse.MinimizerInterface;
import de.neemann.digital.analyse.TruthTable;
import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.Expression;
import de.neemann.digital.analyse.expression.ExpressionException; import de.neemann.digital.analyse.expression.ExpressionException;
import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.expression.Variable;
@ -30,17 +28,14 @@ public class ExpressionCreator {
private static final int MAX_INPUTS_ALLOWED = 12; private static final int MAX_INPUTS_ALLOWED = 12;
private final TruthTable theTable; private final TruthTable theTable;
private final MinimizerInterface minimizer;
/** /**
* Creates a new instance * Creates a new instance
* *
* @param theTable the table to use * @param theTable the table to use
* @param minimizer the minimizer to use
*/ */
public ExpressionCreator(TruthTable theTable, MinimizerInterface minimizer) { public ExpressionCreator(TruthTable theTable) {
this.theTable = theTable; this.theTable = theTable;
this.minimizer = minimizer;
} }
/** /**
@ -93,9 +88,18 @@ public class ExpressionCreator {
if (!Main.enableExperimental() && localVars.size() > MAX_INPUTS_ALLOWED) if (!Main.enableExperimental() && localVars.size() > MAX_INPUTS_ALLOWED)
throw new AnalyseException(Lang.get("err_toManyInputsIn_N0_max_N1_is_N2", resultName, MAX_INPUTS_ALLOWED, localVars.size())); throw new AnalyseException(Lang.get("err_toManyInputsIn_N0_max_N1_is_N2", resultName, MAX_INPUTS_ALLOWED, localVars.size()));
minimizer.minimize(localVars, boolTable, resultName, listener); getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener);
} }
private MinimizerInterface getMinimizer(int size) {
if (size <= 4)
return new MinimizerQuineMcCluskeyExam();
else {
return new MinimizerQuineMcCluskey();
}
}
private final static class ThreadSaveExpressionListener implements ExpressionListener { private final static class ThreadSaveExpressionListener implements ExpressionListener {
private final ExpressionListener listener; private final ExpressionListener listener;

View File

@ -1,6 +1,8 @@
package de.neemann.digital.gui.components.table; package de.neemann.digital.gui.components.table;
import de.neemann.digital.analyse.*; import de.neemann.digital.analyse.AnalyseException;
import de.neemann.digital.analyse.TruthTable;
import de.neemann.digital.analyse.TruthTableTableModel;
import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.Expression;
import de.neemann.digital.analyse.expression.ExpressionException; import de.neemann.digital.analyse.expression.ExpressionException;
import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.expression.Variable;
@ -70,7 +72,6 @@ public class TableDialog extends JDialog {
private AllSolutionsDialog allSolutionsDialog; private AllSolutionsDialog allSolutionsDialog;
private PinMap pinMap; private PinMap pinMap;
private ExpressionListenerStore lastGeneratedExpressions; private ExpressionListenerStore lastGeneratedExpressions;
private MinimizerInterface minimizer = new MinimizerQuineMcCluskey();
/** /**
* Creates a new instance * Creates a new instance
@ -595,8 +596,7 @@ public class TableDialog extends JDialog {
expressionListener = new ExpressionListenerJK(expressionListener); expressionListener = new ExpressionListenerJK(expressionListener);
lastGeneratedExpressions = new ExpressionListenerStore(expressionListener); lastGeneratedExpressions = new ExpressionListenerStore(expressionListener);
final int numVars = model.getTable().getVars().size(); new ExpressionCreator(model.getTable()).create(lastGeneratedExpressions);
new ExpressionCreator(model.getTable(), getMinimizer(numVars)).create(lastGeneratedExpressions);
} catch (ExpressionException | FormatterException | AnalyseException e1) { } catch (ExpressionException | FormatterException | AnalyseException e1) {
lastGeneratedExpressions = null; lastGeneratedExpressions = null;
@ -604,13 +604,6 @@ public class TableDialog extends JDialog {
} }
} }
private MinimizerInterface getMinimizer(int size) {
if (size<=4)
return new MinimizerQuineMcCluskeyExam();
else
return minimizer;
}
private final class SizeAction extends AbstractAction { private final class SizeAction extends AbstractAction {
private int n; private int n;