Skip to content
Snippets Groups Projects
Commit 5fa42617 authored by Philipp Spohr's avatar Philipp Spohr
Browse files

Implemented Thread-Control / Limitation (prevents freezing keeps GUI usable)

parent 86c5da84
Branches
Tags
No related merge requests found
...@@ -92,6 +92,9 @@ public class AlgorithmTask extends AbstractTask { ...@@ -92,6 +92,9 @@ public class AlgorithmTask extends AbstractTask {
//Set time limit //Set time limit
LibraryInterface.setTimeLimit(parameterSet.timeLimit); LibraryInterface.setTimeLimit(parameterSet.timeLimit);
if (parameterSet.disableMultiThreading) {
LibraryInterface.setThreadLimit(1);
}
//Create a node map to identify nodes and eges in the solution //Create a node map to identify nodes and eges in the solution
NodeMap nodeMap = new NodeMap(net); NodeMap nodeMap = new NodeMap(net);
...@@ -122,6 +125,7 @@ public class AlgorithmTask extends AbstractTask { ...@@ -122,6 +125,7 @@ public class AlgorithmTask extends AbstractTask {
); );
class CallbackHandler extends CplexInformer{ class CallbackHandler extends CplexInformer{
@Override
public boolean continueOnTimeout() { public boolean continueOnTimeout() {
try { try {
int result = JOptionPane.showConfirmDialog( int result = JOptionPane.showConfirmDialog(
...@@ -141,6 +145,11 @@ public class AlgorithmTask extends AbstractTask { ...@@ -141,6 +145,11 @@ public class AlgorithmTask extends AbstractTask {
return false; return false;
} }
} }
@Override
public void updateGap(double gap) {
taskMonitor.setStatusMessage(LocalizationManager.get("currentGap")+": "+gap);
}
} }
ca.registerCplexInformer(new CallbackHandler()); ca.registerCplexInformer(new CallbackHandler());
......
...@@ -16,5 +16,6 @@ public class ParameterSet { ...@@ -16,5 +16,6 @@ public class ParameterSet {
public boolean usePartitionCuts; public boolean usePartitionCuts;
public boolean useHeuristic; public boolean useHeuristic;
public int solCount; public int solCount;
public boolean disableMultiThreading;
} }
...@@ -255,6 +255,7 @@ public class MainPanel extends JPanel implements CytoPanelComponent { ...@@ -255,6 +255,7 @@ public class MainPanel extends JPanel implements CytoPanelComponent {
ret.usePartitionCuts = opModePanel.usePartitionCuts(); ret.usePartitionCuts = opModePanel.usePartitionCuts();
ret.useHeuristic = opModePanel.useHeuristic(); ret.useHeuristic = opModePanel.useHeuristic();
ret.solCount = opModePanel.getSolCount(); ret.solCount = opModePanel.getSolCount();
ret.disableMultiThreading = opModePanel.isMultiThreadingDisabled();
return ret; return ret;
} }
......
...@@ -32,6 +32,7 @@ import javax.swing.JCheckBox; ...@@ -32,6 +32,7 @@ import javax.swing.JCheckBox;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton; import javax.swing.JRadioButton;
import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
import javax.swing.GroupLayout.Alignment; import javax.swing.GroupLayout.Alignment;
...@@ -45,6 +46,7 @@ public class OperationModePanel extends JPanel{ ...@@ -45,6 +46,7 @@ public class OperationModePanel extends JPanel{
private final SolutionNumberChooser solutionNumberChooser; private final SolutionNumberChooser solutionNumberChooser;
private final JCheckBox useTriangleCutsBox; private final JCheckBox useTriangleCutsBox;
private final JCheckBox usePartitionCutsBox; private final JCheckBox usePartitionCutsBox;
private final JCheckBox disableMultiThreading;
private final ButtonGroup heuristicGroup; private final ButtonGroup heuristicGroup;
...@@ -65,6 +67,9 @@ public class OperationModePanel extends JPanel{ ...@@ -65,6 +67,9 @@ public class OperationModePanel extends JPanel{
useTriangleCutsBox = new JCheckBox("Use Triangle Cuts"); useTriangleCutsBox = new JCheckBox("Use Triangle Cuts");
usePartitionCutsBox = new JCheckBox("Use Partition Cuts"); usePartitionCutsBox = new JCheckBox("Use Partition Cuts");
disableMultiThreading = new JCheckBox(LocalizationManager.get("disableMultiThreading"));
disableMultiThreading.setSelected(true);
//Link time limit option to ILP //Link time limit option to ILP
useILP.addActionListener(ilpHeuristicSwitch); useILP.addActionListener(ilpHeuristicSwitch);
useHeuristic.addActionListener(ilpHeuristicSwitch); useHeuristic.addActionListener(ilpHeuristicSwitch);
...@@ -75,7 +80,8 @@ public class OperationModePanel extends JPanel{ ...@@ -75,7 +80,8 @@ public class OperationModePanel extends JPanel{
solutionNumberChooser, solutionNumberChooser,
timeLimitSetter, timeLimitSetter,
useTriangleCutsBox, useTriangleCutsBox,
usePartitionCutsBox usePartitionCutsBox,
disableMultiThreading
); );
//Layout //Layout
...@@ -90,6 +96,7 @@ public class OperationModePanel extends JPanel{ ...@@ -90,6 +96,7 @@ public class OperationModePanel extends JPanel{
.addComponent(timeLimitSetter, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(timeLimitSetter, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(useTriangleCutsBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(useTriangleCutsBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(usePartitionCutsBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(usePartitionCutsBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(disableMultiThreading, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
); );
layout.setVerticalGroup(layout.createSequentialGroup() layout.setVerticalGroup(layout.createSequentialGroup()
...@@ -99,6 +106,7 @@ public class OperationModePanel extends JPanel{ ...@@ -99,6 +106,7 @@ public class OperationModePanel extends JPanel{
.addComponent(timeLimitSetter) .addComponent(timeLimitSetter)
.addComponent(useTriangleCutsBox) .addComponent(useTriangleCutsBox)
.addComponent(usePartitionCutsBox) .addComponent(usePartitionCutsBox)
.addComponent(disableMultiThreading)
); );
this.setLayout(layout); this.setLayout(layout);
...@@ -113,12 +121,14 @@ public class OperationModePanel extends JPanel{ ...@@ -113,12 +121,14 @@ public class OperationModePanel extends JPanel{
useTriangleCutsBox.setEnabled(true); useTriangleCutsBox.setEnabled(true);
usePartitionCutsBox.setEnabled(true); usePartitionCutsBox.setEnabled(true);
solutionNumberChooser.setEnabled(true); solutionNumberChooser.setEnabled(true);
disableMultiThreading.setEnabled(true);
} }
else { else {
timeLimitSetter.setEnabled(false); timeLimitSetter.setEnabled(false);
useTriangleCutsBox.setEnabled(false); useTriangleCutsBox.setEnabled(false);
usePartitionCutsBox.setEnabled(false); usePartitionCutsBox.setEnabled(false);
solutionNumberChooser.setEnabled(false); solutionNumberChooser.setEnabled(false);
disableMultiThreading.setEnabled(false);
} }
} }
}; };
...@@ -141,6 +151,10 @@ public class OperationModePanel extends JPanel{ ...@@ -141,6 +151,10 @@ public class OperationModePanel extends JPanel{
return useHeuristic.isSelected(); return useHeuristic.isSelected();
} }
public boolean isMultiThreadingDisabled() {
return disableMultiThreading.isSelected();
}
public int getSolCount() { public int getSolCount() {
return solutionNumberChooser.getSolCount(); return solutionNumberChooser.getSolCount();
} }
......
...@@ -50,8 +50,8 @@ public class CplexInformer { ...@@ -50,8 +50,8 @@ public class CplexInformer {
LibraryInterfaceJNI.CplexInformer_change_ownership(this, swigCPtr, true); LibraryInterfaceJNI.CplexInformer_change_ownership(this, swigCPtr, true);
} }
public void callback(double gap) { public void updateGap(double gap) {
if (getClass() == CplexInformer.class) LibraryInterfaceJNI.CplexInformer_callback(swigCPtr, this, gap); else LibraryInterfaceJNI.CplexInformer_callbackSwigExplicitCplexInformer(swigCPtr, this, gap); if (getClass() == CplexInformer.class) LibraryInterfaceJNI.CplexInformer_updateGap(swigCPtr, this, gap); else LibraryInterfaceJNI.CplexInformer_updateGapSwigExplicitCplexInformer(swigCPtr, this, gap);
} }
public boolean continueOnTimeout() { public boolean continueOnTimeout() {
......
...@@ -17,6 +17,10 @@ public class LibraryInterface { ...@@ -17,6 +17,10 @@ public class LibraryInterface {
LibraryInterfaceJNI.setTimeLimit(limit); LibraryInterfaceJNI.setTimeLimit(limit);
} }
public static void setThreadLimit(int limit) {
LibraryInterfaceJNI.setThreadLimit(limit);
}
public static void setVerbosity(int level) { public static void setVerbosity(int level) {
LibraryInterfaceJNI.setVerbosity(level); LibraryInterfaceJNI.setVerbosity(level);
} }
......
...@@ -46,8 +46,8 @@ public class LibraryInterfaceJNI { ...@@ -46,8 +46,8 @@ public class LibraryInterfaceJNI {
public final static native void LibraryInput_addEdge__SWIG_1(long jarg1, LibraryInput jarg1_, long jarg2, long jarg3, double jarg4, boolean jarg5, boolean jarg6); public final static native void LibraryInput_addEdge__SWIG_1(long jarg1, LibraryInput jarg1_, long jarg2, long jarg3, double jarg4, boolean jarg5, boolean jarg6);
public final static native void LibraryInput_setSize(long jarg1, LibraryInput jarg1_, long jarg2); public final static native void LibraryInput_setSize(long jarg1, LibraryInput jarg1_, long jarg2);
public final static native void LibraryInput_setDefaultInsertionCost(long jarg1, LibraryInput jarg1_, double jarg2); public final static native void LibraryInput_setDefaultInsertionCost(long jarg1, LibraryInput jarg1_, double jarg2);
public final static native void CplexInformer_callback(long jarg1, CplexInformer jarg1_, double jarg2); public final static native void CplexInformer_updateGap(long jarg1, CplexInformer jarg1_, double jarg2);
public final static native void CplexInformer_callbackSwigExplicitCplexInformer(long jarg1, CplexInformer jarg1_, double jarg2); public final static native void CplexInformer_updateGapSwigExplicitCplexInformer(long jarg1, CplexInformer jarg1_, double jarg2);
public final static native boolean CplexInformer_continueOnTimeout(long jarg1, CplexInformer jarg1_); public final static native boolean CplexInformer_continueOnTimeout(long jarg1, CplexInformer jarg1_);
public final static native boolean CplexInformer_continueOnTimeoutSwigExplicitCplexInformer(long jarg1, CplexInformer jarg1_); public final static native boolean CplexInformer_continueOnTimeoutSwigExplicitCplexInformer(long jarg1, CplexInformer jarg1_);
public final static native void delete_CplexInformer(long jarg1); public final static native void delete_CplexInformer(long jarg1);
...@@ -60,11 +60,12 @@ public class LibraryInterfaceJNI { ...@@ -60,11 +60,12 @@ public class LibraryInterfaceJNI {
public final static native void delete_CoreAlgorithm(long jarg1); public final static native void delete_CoreAlgorithm(long jarg1);
public final static native String getVersionString(); public final static native String getVersionString();
public final static native void setTimeLimit(int jarg1); public final static native void setTimeLimit(int jarg1);
public final static native void setThreadLimit(int jarg1);
public final static native void setVerbosity(int jarg1); public final static native void setVerbosity(int jarg1);
public final static native long getRun(long jarg1, LibraryInput jarg1_, int jarg2, String jarg3, double jarg4, boolean jarg5, boolean jarg6, boolean jarg7); public final static native long getRun(long jarg1, LibraryInput jarg1_, int jarg2, String jarg3, double jarg4, boolean jarg5, boolean jarg6, boolean jarg7);
public static void SwigDirector_CplexInformer_callback(CplexInformer jself, double gap) { public static void SwigDirector_CplexInformer_updateGap(CplexInformer jself, double gap) {
jself.callback(gap); jself.updateGap(gap);
} }
public static boolean SwigDirector_CplexInformer_continueOnTimeout(CplexInformer jself) { public static boolean SwigDirector_CplexInformer_continueOnTimeout(CplexInformer jself) {
return jself.continueOnTimeout(); return jself.continueOnTimeout();
......
...@@ -61,3 +61,5 @@ notOptimal = Not Optimal Solution ...@@ -61,3 +61,5 @@ notOptimal = Not Optimal Solution
ilpMarker = ILP Properties ilpMarker = ILP Properties
timeoutMarker = Timed Out timeoutMarker = Timed Out
gap = Gap gap = Gap
currentGap = [ILP] Current Gap:
disableMultiThreading = Disable Multithreading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment