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

Using Cytoscapes internal "task" system although it's clunky to conform to a "standard cy app"

parent 1987f083
Branches
Tags
No related merge requests found
......@@ -3,17 +3,15 @@ package de.hhu.ba.yoshikoWrapper;
import java.util.Properties;
import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.application.swing.CyAction;
import org.cytoscape.application.swing.CySwingApplication;
import org.cytoscape.application.swing.CytoPanelComponent;
import org.cytoscape.service.util.AbstractCyActivator;
import org.cytoscape.work.swing.DialogTaskManager;
import org.osgi.framework.BundleContext;
import de.hhu.ba.yoshikoWrapper.core.ConfigurationManager;
import de.hhu.ba.yoshikoWrapper.core.Core;
import de.hhu.ba.yoshikoWrapper.core.CyCore;
import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader;
import de.hhu.ba.yoshikoWrapper.gui.MainPanel;
import de.hhu.ba.yoshikoWrapper.gui.MainPanelAction;
import de.hhu.ba.yoshikoWrapper.gui.SolutionsPanel;
......@@ -38,14 +36,12 @@ public class CyActivator extends AbstractCyActivator {
YoshikoLoader.loadLibrary(cm.getProperties().getProperty("pathToYoshiko"));
}
CyApplicationManager cyApplicationManager = getService(context, CyApplicationManager.class);
Core.setApplicationManager(cyApplicationManager);
CySwingApplication cytoscapeDesktopService = getService(context,CySwingApplication.class);
//Create symbolic links to give other classes access
CyCore.cy = getService(context, CyApplicationManager.class);
CyCore.dialogTaskManager = getService(context, DialogTaskManager.class);
//main panel and result panel
MainPanel mainPanel = new MainPanel();
SolutionsPanel solutionsPanel = new SolutionsPanel();
MainPanel mainPanel = new MainPanel(solutionsPanel);
registerService(context,mainPanel,CytoPanelComponent.class, new Properties());
registerService(context,solutionsPanel,CytoPanelComponent.class, new Properties());
}
......
package de.hhu.ba.yoshikoWrapper.core;
//TODO: ADD LOGGER SYSTEM
import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.model.CyColumn;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode;
import org.cytoscape.work.AbstractTask;
import org.cytoscape.work.TaskMonitor;
import org.slf4j.Logger;
import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger;
......@@ -13,14 +14,23 @@ import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_std__vectorT_int_t;
import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_yskInput__LibraryInput;
import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_ysk__ClusterEditingSolutions;
public class Core {
public class AlgorithmTask extends AbstractTask {
//Symbolic links
private static CyApplicationManager cy;
private static Logger logger = YoshikoLogger.getInstance().getLogger();
public static void performYoshiko(
//Parameters
private double insertionCostDefault;
private double deletionCostDefault;
private CyColumn permanentColumn;
private CyColumn forbiddenColumn;
private CyColumn weightColumn;
private int timeLimit;
private CyNetwork net;
public AlgorithmTask(
CyNetwork net,
int timeLimit,
CyColumn weightColumn,
CyColumn permanentColumn,
......@@ -29,10 +39,22 @@ public class Core {
double deletionCostDefault
)
{
this.net = net;
this.timeLimit = timeLimit;
this.weightColumn = weightColumn;
this.permanentColumn = permanentColumn;
this.forbiddenColumn = forbiddenColumn;
this.insertionCostDefault = insertionCostDefault;
this.deletionCostDefault = deletionCostDefault;
}
@Override
public void run(TaskMonitor taskMonitor) throws Exception {
taskMonitor.setTitle(LocalizationManager.yoshikoStrings().getString("yoshTask"));
taskMonitor.setProgress(0.0);
//Get current network
CyNetwork currentNetwork = cy.getCurrentNetwork();
if (currentNetwork == null) {
logger.warn("There is no network loaded. You need to load a network first!");
if (net == null) {
logger.warn("CoreAlgorithm called on a net that is NULL!");
return;
}
......@@ -40,23 +62,26 @@ public class Core {
LibraryInterface.setTimeLimit(timeLimit);
//Create a node map to identify nodes and eges in the solution
NodeMap nodeMap = new NodeMap(currentNetwork);
NodeMap nodeMap = new NodeMap(net);
taskMonitor.setProgress(0.1);
//Generate an input instance from the network
SWIGTYPE_p_yskInput__LibraryInput input = NetworkParser.parseNetwork(
currentNetwork,
net,
nodeMap,
weightColumn,
permanentColumn,
forbiddenColumn,
deletionCostDefault
);
taskMonitor.setProgress(0.2);
//Set the default value for insertion cost
LibraryInterface.LibraryInput_setDefaultInsertionCost(input, insertionCostDefault);
//Call Yoshiko <<< Algorithm is performed here
SWIGTYPE_p_ysk__ClusterEditingSolutions solutions = LibraryInterface.processLibraryInput(input);
taskMonitor.setProgress(0.9);
long numberOfSolutions = LibraryInterface.ClusterEditingSolutions_getNumberOfSolutions(solutions);
......@@ -66,8 +91,8 @@ public class Core {
for (long i=0;i<numberOfSolutions;i++) {
System.out.println("Processing solution "+(i+1)+" of "+numberOfSolutions);
String columnName = "YOSHIKO_SOLUTION_"+(i+1);
currentNetwork.getDefaultNodeTable().deleteColumn(columnName);
currentNetwork.getDefaultNodeTable().createColumn(columnName, String.class, false);
net.getDefaultNodeTable().deleteColumn(columnName);
net.getDefaultNodeTable().createColumn(columnName, String.class, false);
long numberOfClusters = LibraryInterface.ClusterEditingSolutions_getNumberOfClusters(solutions, i);
for (long k=0;k<numberOfClusters;k++) {
System.out.println("Processing cluster "+(k+1)+" of "+numberOfClusters);
......@@ -81,23 +106,12 @@ public class Core {
System.out.println("FATAL ERROR: Node was not previously mapped!");
return;
}
currentNetwork.getRow(node).set(columnName, ""+(k+1));
net.getRow(node).set(columnName, ""+(k+1));
}
}
}
LibraryInterface.delete_LibraryInput(input);
taskMonitor.setProgress(1.0);
}
//SETTER / GETTER METHODS
public static void setApplicationManager(CyApplicationManager cyApplicationManager) {
cy = cyApplicationManager;
}
public static CyApplicationManager getApplicationManager() {
return cy;
}
}
package de.hhu.ba.yoshikoWrapper.core;
import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.work.swing.DialogTaskManager;
public class CyCore {
public static CyApplicationManager cy;
public static DialogTaskManager dialogTaskManager;
}
......@@ -8,17 +8,14 @@ import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.model.CyColumn;
import org.cytoscape.model.CyNetwork;
import de.hhu.ba.yoshikoWrapper.core.Core;
import de.hhu.ba.yoshikoWrapper.core.CyCore;
@SuppressWarnings("serial") //will never be serialized
public class ColumnMapper extends ComfortPanel{
//Symbolic links
private CyApplicationManager cy;
//Swing components
private JComboBox<CyColumn> editingCostMapper;
......@@ -33,7 +30,6 @@ public class ColumnMapper extends ComfortPanel{
public ColumnMapper() {
this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
cy = Core.getApplicationManager();
//SWING COMPONENTS
editingCostMapper = new JComboBox<CyColumn>();
......@@ -64,7 +60,7 @@ public class ColumnMapper extends ComfortPanel{
public void updateValues() {
CyNetwork net = cy.getCurrentNetwork();
CyNetwork net = CyCore.cy.getCurrentNetwork();
if (net != null) { //Check if a network is loaded
......
......@@ -13,7 +13,11 @@ import javax.swing.JRadioButton;
import org.cytoscape.application.swing.CytoPanelComponent;
import org.cytoscape.application.swing.CytoPanelName;
import de.hhu.ba.yoshikoWrapper.core.Core;
import org.cytoscape.work.AbstractTask;
import org.cytoscape.work.TaskIterator;
import de.hhu.ba.yoshikoWrapper.core.AlgorithmTask;
import de.hhu.ba.yoshikoWrapper.core.CyCore;
import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader;
/**This class describes the Swing Panel that the user interacts with in cytoscape
......@@ -41,13 +45,18 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent {
private final JCheckBox useTriangleCutsBox;
private final JCheckBox usePartitionCutsBox;
//SYMBOLIC LINKS
private final SolutionsPanel solutionsPanel;
/**
* Main constructor, creates a new Panel and initializes subcomponents
* @param solPanel
*/
public MainPanel() {
public MainPanel(SolutionsPanel solPanel) {
this.solutionsPanel = solPanel;
//SWING INIT
this.setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));
//Initialize Swing components
......@@ -71,7 +80,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent {
@Override
public void actionPerformed(ActionEvent e) {
if (YoshikoLoader.isLibraryLoaded()){
Core.performYoshiko(
AbstractTask yoshiko = new AlgorithmTask(
CyCore.cy.getCurrentNetwork(),
timeLimitSetter.getTimeLimit(),
ecPanel.getWeightColumn(),
ecPanel.getPermanentColumn(),
......@@ -79,7 +89,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent {
ecPanel.getDefaultInsertionCost(),
ecPanel.getDefaultDeletionCost()
);
CyCore.dialogTaskManager.execute(new TaskIterator(1,yoshiko));
solutionsPanel.setVisible(true);
}
}
......
resultsPanelTitle = Yoshiko Results
yoshVersion = Yoshiko Version
resolveLibPath = Resolve Yoshiko Library Path
yoshTask = Performing Yoshiko Algorithm
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment