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();
for (TableRows.InnerList list : rows.listIterable())
@ -159,7 +162,7 @@ public class QuineMcCluskey {
if (!row.isUsed() && row.getSource().size() > 0)
primes.add(row);
rows=newRows;
rows = newRows;
}
/**
@ -169,6 +172,22 @@ public class QuineMcCluskey {
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
public String toString() {
StringBuilder sb = new StringBuilder();

View File

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

View File

@ -1,8 +1,6 @@
package de.neemann.digital.gui.components.table;
import de.neemann.digital.analyse.AnalyseException;
import de.neemann.digital.analyse.MinimizerInterface;
import de.neemann.digital.analyse.TruthTable;
import de.neemann.digital.analyse.*;
import de.neemann.digital.analyse.expression.Expression;
import de.neemann.digital.analyse.expression.ExpressionException;
import de.neemann.digital.analyse.expression.Variable;
@ -30,17 +28,14 @@ public class ExpressionCreator {
private static final int MAX_INPUTS_ALLOWED = 12;
private final TruthTable theTable;
private final MinimizerInterface minimizer;
/**
* Creates a new instance
*
* @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.minimizer = minimizer;
}
/**
@ -93,9 +88,18 @@ public class ExpressionCreator {
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()));
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 ExpressionListener listener;

View File

@ -1,6 +1,8 @@
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.ExpressionException;
import de.neemann.digital.analyse.expression.Variable;
@ -70,7 +72,6 @@ public class TableDialog extends JDialog {
private AllSolutionsDialog allSolutionsDialog;
private PinMap pinMap;
private ExpressionListenerStore lastGeneratedExpressions;
private MinimizerInterface minimizer = new MinimizerQuineMcCluskey();
/**
* Creates a new instance
@ -595,8 +596,7 @@ public class TableDialog extends JDialog {
expressionListener = new ExpressionListenerJK(expressionListener);
lastGeneratedExpressions = new ExpressionListenerStore(expressionListener);
final int numVars = model.getTable().getVars().size();
new ExpressionCreator(model.getTable(), getMinimizer(numVars)).create(lastGeneratedExpressions);
new ExpressionCreator(model.getTable()).create(lastGeneratedExpressions);
} catch (ExpressionException | FormatterException | AnalyseException e1) {
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 int n;