mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-26 22:41:59 -04:00
refactoring of deciding which minimizer to use
This commit is contained in:
parent
fb5537dba8
commit
0f9a633d30
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user