mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-26 06:22:48 -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();
|
||||
|
||||
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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user