From 0f9a633d3086adf29ca7e7ef13547e230851e9ed Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 14 Mar 2017 17:03:00 +0100 Subject: [PATCH] refactoring of deciding which minimizer to use --- .../analyse/quinemc/QuineMcCluskey.java | 23 ++++++- .../digital/analyse/quinemc/TableRows.java | 66 +++++++++++++++++-- .../components/table/ExpressionCreator.java | 20 +++--- .../gui/components/table/TableDialog.java | 15 ++--- 4 files changed, 99 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java b/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java index cd637eaf9..64e6a4322 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/QuineMcCluskey.java @@ -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(); diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/TableRows.java b/src/main/java/de/neemann/digital/analyse/quinemc/TableRows.java index 5990beab4..a70d6ddb6 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/TableRows.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/TableRows.java @@ -10,18 +10,29 @@ import java.util.TreeMap; * * @author hneemann */ -final class TableRows implements Iterable { +public final class TableRows implements Iterable { private final TreeMap 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 { 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 e : newRows.rows.entrySet()) { InnerList values = e.getValue(); @@ -50,6 +69,9 @@ final class TableRows implements Iterable { } } + /** + * @return truw if this list is empty + */ public boolean isEmpty() { return size == 0; } @@ -74,11 +96,20 @@ final class TableRows implements Iterable { return new RowIterator(rows.values().iterator()); } + /** + * @return a list of lists with all rows of the same optimized bit mask + */ public Iterable 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 e : rows.entrySet()) { InnerList list = e.getValue(); @@ -118,38 +149,65 @@ final class TableRows implements Iterable { } } - static final class InnerList implements Iterable { + /** + * A list of rows with the same optimized mask + */ + public static final class InnerList implements Iterable { private ArrayList innerList; // private HashSet 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 iterator() { return innerList.iterator(); } diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index fef93c067..867f84bbf 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -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; diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index e402d8b0b..29bc15113 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -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;