From 6940db5c2557dd114c509f68a72220e06a6138f7 Mon Sep 17 00:00:00 2001
From: Philipp Spohr <spohr.philipp@web.de>
Date: Mon, 4 Sep 2017 20:53:57 +0200
Subject: [PATCH] Basic support for killing cplex various stuff UTF-8 fix for
 whining maven Enabled time-limit by default

---
 pom.xml                                       |  2 +-
 .../ba/yoshikoWrapper/core/AlgorithmTask.java | 19 +++++--
 .../yoshikoWrapper/core/CallbackHandler.java  | 13 ++---
 .../yoshikoWrapper/gui/TimeLimitSetter.java   |  5 +-
 .../ba/yoshikoWrapper/swig/CoreAlgorithm.java | 51 +++++++++++++++++++
 .../{JavaInformer.java => CplexInformer.java} | 22 ++++----
 .../yoshikoWrapper/swig/LibraryInterface.java | 10 ++--
 .../swig/LibraryInterfaceJNI.java             | 22 ++++----
 8 files changed, 101 insertions(+), 43 deletions(-)
 create mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/swig/CoreAlgorithm.java
 rename src/main/java/de/hhu/ba/yoshikoWrapper/swig/{JavaInformer.java => CplexInformer.java} (57%)

diff --git a/pom.xml b/pom.xml
index bc32d80..d697b89 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
 		<bundle.symbolicName>de.hhu.ba.yoshikoWrapper</bundle.symbolicName>
 		<bundle.namespace>de.hhu.ba.yoshikoWrapper</bundle.namespace>
 		<cytoscape.api.version>3.0.1</cytoscape.api.version>
-		
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven-bundle-plugin.version>2.3.4</maven-bundle-plugin.version>
 		<osgi.api.version>4.2.0</osgi.api.version>
 	</properties>
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java
index 64579b6..8c182bf 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java
@@ -40,6 +40,7 @@ import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution;
 import de.hhu.ba.yoshikoWrapper.gui.ResultPanel;
 import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger;
 import de.hhu.ba.yoshikoWrapper.swig.ClusterEditingSolutions;
+import de.hhu.ba.yoshikoWrapper.swig.CoreAlgorithm;
 import de.hhu.ba.yoshikoWrapper.swig.IntVector;
 import de.hhu.ba.yoshikoWrapper.swig.LibraryInput;
 import de.hhu.ba.yoshikoWrapper.swig.LibraryInterface;
@@ -66,9 +67,12 @@ public class AlgorithmTask extends AbstractTask {
 	private boolean useHeuristic;
 	private int numberOfSolutions;
 	
-	//temps, need to be freed in C++
+	//Temps, need to be freed in C++
 	private LibraryInput input;
 	private ClusterEditingSolutions result;
+	
+	private CoreAlgorithm ca;
+	private CallbackHandler ch;
 
 	public AlgorithmTask(
 			CyNetwork net,
@@ -133,10 +137,9 @@ public class AlgorithmTask extends AbstractTask {
 
 		//Set the default value for insertion cost
 		input.setDefaultInsertionCost(insertionCostDefault);
-
+		
 		//Call Yoshiko <<< Algorithm is performed here
-		result = LibraryInterface.processLibraryInput(
-				input,
+		ca = LibraryInterface.getRun(input, 
 				numberOfSolutions,
 				bitMaskRules,
 				multiplicativeFactor, 
@@ -144,7 +147,7 @@ public class AlgorithmTask extends AbstractTask {
 				separateTriangles,
 				useHeuristic
 		);
-		
+		result  = ca.run();
 		
 		taskMonitor.setProgress(0.9);
 		
@@ -199,6 +202,7 @@ public class AlgorithmTask extends AbstractTask {
 		}
 
 		//At this point the C++ objects can be freed, in case that the algorithm terminates beforehand they need to be cleaned-up elsewhere
+		ca.delete();
 		input.delete();
 		result.delete();
 		
@@ -218,6 +222,11 @@ public class AlgorithmTask extends AbstractTask {
 	@Override
 	public void cancel() {
 		//Free C++ resources
+		if (ca != null) {
+			System.out.println("Deleting CoreAlgorithm instance!");
+			ca.cancel();
+			ca.delete();
+		}
 		if (input != null) {
 			input.delete();
 		}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CallbackHandler.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CallbackHandler.java
index 5a021f5..bda1ea0 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CallbackHandler.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CallbackHandler.java
@@ -1,14 +1,7 @@
 package de.hhu.ba.yoshikoWrapper.core;
 
-import de.hhu.ba.yoshikoWrapper.swig.JavaInformer;
+import de.hhu.ba.yoshikoWrapper.swig.CplexInformer;
 
-public class CallbackHandler extends JavaInformer {
-	public CallbackHandler() {
-	
-	}
-	
-	@Override
-	public void callback() {
-		
-	}
+public abstract class CallbackHandler extends CplexInformer {
+	public abstract void callback();
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java
index 576e6de..41d9f0a 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/TimeLimitSetter.java
@@ -40,8 +40,7 @@ public class TimeLimitSetter extends JPanel{
 		this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
 		checkBox = new JCheckBox(LocalizationManager.get("timeLimitILP"));
 		numberField = new IntegerInputField();
-		numberField.setText("60");
-		numberField.setEnabled(false); //By default time limit is turned off
+		numberField.setText("30");
 		checkBox.addActionListener(
 			new ActionListener() {
 
@@ -52,6 +51,8 @@ public class TimeLimitSetter extends JPanel{
 				
 			}
 		);
+		this.checkBox.setSelected(true);
+		setEnabled(true);
 		//REGISTER COMPONENTS
 		SwingUtil.addAll(this,checkBox,numberField);
 	}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/CoreAlgorithm.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/CoreAlgorithm.java
new file mode 100644
index 0000000..4ae599e
--- /dev/null
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/CoreAlgorithm.java
@@ -0,0 +1,51 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 3.0.8
+ *
+ * Do not make changes to this file unless you know what you are doing--modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+package de.hhu.ba.yoshikoWrapper.swig;
+
+public class CoreAlgorithm {
+  private transient long swigCPtr;
+  protected transient boolean swigCMemOwn;
+
+  protected CoreAlgorithm(long cPtr, boolean cMemoryOwn) {
+    swigCMemOwn = cMemoryOwn;
+    swigCPtr = cPtr;
+  }
+
+  protected static long getCPtr(CoreAlgorithm obj) {
+    return (obj == null) ? 0 : obj.swigCPtr;
+  }
+
+  protected void finalize() {
+    delete();
+  }
+
+  public synchronized void delete() {
+    if (swigCPtr != 0) {
+      if (swigCMemOwn) {
+        swigCMemOwn = false;
+        LibraryInterfaceJNI.delete_CoreAlgorithm(swigCPtr);
+      }
+      swigCPtr = 0;
+    }
+  }
+
+  public ClusterEditingSolutions run() {
+    long cPtr = LibraryInterfaceJNI.CoreAlgorithm_run(swigCPtr, this);
+    return (cPtr == 0) ? null : new ClusterEditingSolutions(cPtr, false);
+  }
+
+  public void cancel() {
+    LibraryInterfaceJNI.CoreAlgorithm_cancel(swigCPtr, this);
+  }
+
+  public void registerCplexInformer(CplexInformer informer) {
+    LibraryInterfaceJNI.CoreAlgorithm_registerCplexInformer(swigCPtr, this, CplexInformer.getCPtr(informer), informer);
+  }
+
+}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/JavaInformer.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/CplexInformer.java
similarity index 57%
rename from src/main/java/de/hhu/ba/yoshikoWrapper/swig/JavaInformer.java
rename to src/main/java/de/hhu/ba/yoshikoWrapper/swig/CplexInformer.java
index 2bdfe0b..7bff664 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/JavaInformer.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/CplexInformer.java
@@ -8,16 +8,16 @@
 
 package de.hhu.ba.yoshikoWrapper.swig;
 
-public class JavaInformer {
+public class CplexInformer {
   private transient long swigCPtr;
   protected transient boolean swigCMemOwn;
 
-  protected JavaInformer(long cPtr, boolean cMemoryOwn) {
+  protected CplexInformer(long cPtr, boolean cMemoryOwn) {
     swigCMemOwn = cMemoryOwn;
     swigCPtr = cPtr;
   }
 
-  protected static long getCPtr(JavaInformer obj) {
+  protected static long getCPtr(CplexInformer obj) {
     return (obj == null) ? 0 : obj.swigCPtr;
   }
 
@@ -29,7 +29,7 @@ public class JavaInformer {
     if (swigCPtr != 0) {
       if (swigCMemOwn) {
         swigCMemOwn = false;
-        LibraryInterfaceJNI.delete_JavaInformer(swigCPtr);
+        LibraryInterfaceJNI.delete_CplexInformer(swigCPtr);
       }
       swigCPtr = 0;
     }
@@ -42,21 +42,21 @@ public class JavaInformer {
 
   public void swigReleaseOwnership() {
     swigCMemOwn = false;
-    LibraryInterfaceJNI.JavaInformer_change_ownership(this, swigCPtr, false);
+    LibraryInterfaceJNI.CplexInformer_change_ownership(this, swigCPtr, false);
   }
 
   public void swigTakeOwnership() {
     swigCMemOwn = true;
-    LibraryInterfaceJNI.JavaInformer_change_ownership(this, swigCPtr, true);
+    LibraryInterfaceJNI.CplexInformer_change_ownership(this, swigCPtr, true);
   }
 
-  public void callback() {
-    if (getClass() == JavaInformer.class) LibraryInterfaceJNI.JavaInformer_callback(swigCPtr, this); else LibraryInterfaceJNI.JavaInformer_callbackSwigExplicitJavaInformer(swigCPtr, this);
+  public void callback(double gap) {
+    if (getClass() == CplexInformer.class) LibraryInterfaceJNI.CplexInformer_callback(swigCPtr, this, gap); else LibraryInterfaceJNI.CplexInformer_callbackSwigExplicitCplexInformer(swigCPtr, this, gap);
   }
 
-  public JavaInformer() {
-    this(LibraryInterfaceJNI.new_JavaInformer(), true);
-    LibraryInterfaceJNI.JavaInformer_director_connect(this, swigCPtr, swigCMemOwn, true);
+  public CplexInformer() {
+    this(LibraryInterfaceJNI.new_CplexInformer(), true);
+    LibraryInterfaceJNI.CplexInformer_director_connect(this, swigCPtr, swigCMemOwn, true);
   }
 
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterface.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterface.java
index 123dbf6..df59eeb 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterface.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterface.java
@@ -13,11 +13,6 @@ public class LibraryInterface {
     return LibraryInterfaceJNI.getVersionString();
   }
 
-  public static ClusterEditingSolutions processLibraryInput(LibraryInput libIn, int nrOptimalSolutions, String rulesBitMask, double multiplicativeFactor, boolean separatePartitionCuts, boolean separateTriangles, boolean useHeuristic) {
-    long cPtr = LibraryInterfaceJNI.processLibraryInput(LibraryInput.getCPtr(libIn), libIn, nrOptimalSolutions, rulesBitMask, multiplicativeFactor, separatePartitionCuts, separateTriangles, useHeuristic);
-    return (cPtr == 0) ? null : new ClusterEditingSolutions(cPtr, false);
-  }
-
   public static void setTimeLimit(int limit) {
     LibraryInterfaceJNI.setTimeLimit(limit);
   }
@@ -26,4 +21,9 @@ public class LibraryInterface {
     LibraryInterfaceJNI.setVerbosity(level);
   }
 
+  public static CoreAlgorithm getRun(LibraryInput input, int nrOptimalSolutions, String rulesBitMask, double multiplicativeFactor, boolean useHeuristic, boolean separatePartitionCuts, boolean separateTriangles) {
+    long cPtr = LibraryInterfaceJNI.getRun(LibraryInput.getCPtr(input), input, nrOptimalSolutions, rulesBitMask, multiplicativeFactor, useHeuristic, separatePartitionCuts, separateTriangles);
+    return (cPtr == 0) ? null : new CoreAlgorithm(cPtr, false);
+  }
+
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterfaceJNI.java b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterfaceJNI.java
index 1b4f46d..999ecd2 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterfaceJNI.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/swig/LibraryInterfaceJNI.java
@@ -34,19 +34,23 @@ 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_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 JavaInformer_callback(long jarg1, JavaInformer jarg1_);
-  public final static native void JavaInformer_callbackSwigExplicitJavaInformer(long jarg1, JavaInformer jarg1_);
-  public final static native void delete_JavaInformer(long jarg1);
-  public final static native long new_JavaInformer();
-  public final static native void JavaInformer_director_connect(JavaInformer obj, long cptr, boolean mem_own, boolean weak_global);
-  public final static native void JavaInformer_change_ownership(JavaInformer obj, long cptr, boolean take_or_release);
+  public final static native void CplexInformer_callback(long jarg1, CplexInformer jarg1_, double jarg2);
+  public final static native void CplexInformer_callbackSwigExplicitCplexInformer(long jarg1, CplexInformer jarg1_, double jarg2);
+  public final static native void delete_CplexInformer(long jarg1);
+  public final static native long new_CplexInformer();
+  public final static native void CplexInformer_director_connect(CplexInformer obj, long cptr, boolean mem_own, boolean weak_global);
+  public final static native void CplexInformer_change_ownership(CplexInformer obj, long cptr, boolean take_or_release);
+  public final static native long CoreAlgorithm_run(long jarg1, CoreAlgorithm jarg1_);
+  public final static native void CoreAlgorithm_cancel(long jarg1, CoreAlgorithm jarg1_);
+  public final static native void CoreAlgorithm_registerCplexInformer(long jarg1, CoreAlgorithm jarg1_, long jarg2, CplexInformer jarg2_);
+  public final static native void delete_CoreAlgorithm(long jarg1);
   public final static native String getVersionString();
-  public final static native long processLibraryInput(long jarg1, LibraryInput jarg1_, int jarg2, String jarg3, double jarg4, boolean jarg5, boolean jarg6, boolean jarg7);
   public final static native void setTimeLimit(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 static void SwigDirector_JavaInformer_callback(JavaInformer jself) {
-    jself.callback();
+  public static void SwigDirector_CplexInformer_callback(CplexInformer jself, double gap) {
+    jself.callback(gap);
   }
 
   private final static native void swig_module_init();
-- 
GitLab