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

Added support for marking edges as permanent or forbidden (via mapping)

parent 715604d0
No related branches found
No related tags found
No related merge requests found
...@@ -23,6 +23,8 @@ public class Core { ...@@ -23,6 +23,8 @@ public class Core {
public static void performYoshiko( public static void performYoshiko(
int timeLimit, int timeLimit,
CyColumn weightColumn, CyColumn weightColumn,
CyColumn permanentColumn,
CyColumn forbiddenColumn,
double insertionCostDefault, double insertionCostDefault,
double deletionCostDefault double deletionCostDefault
) )
...@@ -45,6 +47,8 @@ public class Core { ...@@ -45,6 +47,8 @@ public class Core {
currentNetwork, currentNetwork,
nodeMap, nodeMap,
weightColumn, weightColumn,
permanentColumn,
forbiddenColumn,
deletionCostDefault deletionCostDefault
); );
...@@ -55,7 +59,6 @@ public class Core { ...@@ -55,7 +59,6 @@ public class Core {
SWIGTYPE_p_ysk__ClusterEditingSolutions solutions = LibraryInterface.processLibraryInput(input); SWIGTYPE_p_ysk__ClusterEditingSolutions solutions = LibraryInterface.processLibraryInput(input);
long numberOfSolutions = LibraryInterface.ClusterEditingSolutions_getNumberOfSolutions(solutions); long numberOfSolutions = LibraryInterface.ClusterEditingSolutions_getNumberOfSolutions(solutions);
System.out.println("Found: "+numberOfSolutions+" solutions!"); System.out.println("Found: "+numberOfSolutions+" solutions!");
double modificationCost = LibraryInterface.ClusterEditingSolutions_getTotalCost(solutions); double modificationCost = LibraryInterface.ClusterEditingSolutions_getTotalCost(solutions);
...@@ -63,6 +66,7 @@ public class Core { ...@@ -63,6 +66,7 @@ public class Core {
for (long i=0;i<numberOfSolutions;i++) { for (long i=0;i<numberOfSolutions;i++) {
System.out.println("Processing solution "+(i+1)+" of "+numberOfSolutions); System.out.println("Processing solution "+(i+1)+" of "+numberOfSolutions);
String columnName = "YOSHIKO_SOLUTION_"+(i+1); String columnName = "YOSHIKO_SOLUTION_"+(i+1);
currentNetwork.getDefaultNodeTable().deleteColumn(columnName);
currentNetwork.getDefaultNodeTable().createColumn(columnName, String.class, false); currentNetwork.getDefaultNodeTable().createColumn(columnName, String.class, false);
long numberOfClusters = LibraryInterface.ClusterEditingSolutions_getNumberOfClusters(solutions, i); long numberOfClusters = LibraryInterface.ClusterEditingSolutions_getNumberOfClusters(solutions, i);
for (long k=0;k<numberOfClusters;k++) { for (long k=0;k<numberOfClusters;k++) {
......
...@@ -21,6 +21,8 @@ public class NetworkParser { ...@@ -21,6 +21,8 @@ public class NetworkParser {
CyNetwork net, CyNetwork net,
NodeMap nodeMap, NodeMap nodeMap,
CyColumn weightColumn, CyColumn weightColumn,
CyColumn permanentColumn,
CyColumn forbiddenColumn,
double deletionCostDefault double deletionCostDefault
) )
{ {
...@@ -36,30 +38,53 @@ public class NetworkParser { ...@@ -36,30 +38,53 @@ public class NetworkParser {
//Loop over edges //Loop over edges
for (CyEdge e : edges) { for (CyEdge e : edges) {
CyRow edgeEntry = net.getRow(e); CyRow edgeEntry = net.getRow(e);
//Set to default cost
//Parse editing costs
double weight = deletionCostDefault; double weight = deletionCostDefault;
if (weightColumn != null){ if (weightColumn != null){
System.out.println("Using column: "+weightColumn.getName());
try { try {
//Find out if the weights are double or int //Find out if the weights are double or int
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Class<? extends Number> weightType = (Class<? extends Number>) weightColumn.getType(); Class<? extends Number> weightType = (Class<? extends Number>) weightColumn.getType();
logger.info("Column has type: "+weightType.getName()); logger.debug("Column has type: "+weightType.getName());
if (weightType == Integer.class) {
weight = (int)edgeEntry.get(weightColumn.getName(), weightType);
}
else if(weightType == Double.class) {
weight = (double)edgeEntry.get(weightColumn.getName(), weightType); weight = (double)edgeEntry.get(weightColumn.getName(), weightType);
} }
}
catch(Exception ex) { catch(Exception ex) {
ex.printStackTrace();
//Invalid entry (no entry) //Invalid entry (no entry)
logger.info("No valid edit costs defined for: "+edgeEntry.get("name", String.class)+", falling back to default value!"); logger.info("No valid edit costs defined for: "+edgeEntry.get("name", String.class)+", falling back to default value!");
} }
} }
//Parse Forbidden/Permanent markers
boolean forbidden = false;
boolean permanent = false;
if (permanentColumn != null) {
permanent = (boolean)edgeEntry.get(permanentColumn.getName(), boolean.class);
}
if (forbiddenColumn != null) {
forbidden = (boolean)edgeEntry.get(forbiddenColumn.getName(), boolean.class);
}
logger.debug("Found Edge: "+edgeEntry.get("name", String.class)+ " with weight:"+weight); logger.debug("Found Edge: "+edgeEntry.get("name", String.class)+ " with weight:"+weight);
LibraryInterface.LibraryInput_addEdge(generatedInput, LibraryInterface.LibraryInput_addEdge(
generatedInput,
nodeMap.get(e.getSource()), nodeMap.get(e.getSource()),
nodeMap.get(e.getTarget()) nodeMap.get(e.getTarget()),
, weight); weight,
permanent,
forbidden
);
} }
} }
......
...@@ -10,35 +10,46 @@ import javax.swing.JComboBox; ...@@ -10,35 +10,46 @@ import javax.swing.JComboBox;
import org.cytoscape.application.CyApplicationManager; import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.model.CyColumn; import org.cytoscape.model.CyColumn;
import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.events.ColumnCreatedEvent;
import org.cytoscape.model.events.ColumnDeletedListener;
import de.hhu.ba.yoshikoWrapper.core.Core; import de.hhu.ba.yoshikoWrapper.core.Core;
@SuppressWarnings("serial") //will never be serialized @SuppressWarnings("serial") //will never be serialized
public class ModificationCostMapper extends ComfortPanel{ public class ColumnMapper extends ComfortPanel{
//Symbolic links //Symbolic links
private CyApplicationManager cy; private CyApplicationManager cy;
//Swing components //Swing components
private JComboBox<CyColumn> tableFields; private JComboBox<CyColumn> editingCostMapper;
private JCheckBox useMapping; private JComboBox<CyColumn> permanentMapper;
private JComboBox<CyColumn> forbiddenMapper;
public ModificationCostMapper() { private JCheckBox useMappingCost;
tableFields = new JComboBox<CyColumn>(); private JCheckBox useMappingPerm;
useMapping = new JCheckBox("Map modification costs"); private JCheckBox useMappingForb;
useMapping.setToolTipText(
public ColumnMapper() {
cy = Core.getApplicationManager();
//SWING COMPONENTS
editingCostMapper = new JComboBox<CyColumn>();
permanentMapper = new JComboBox<CyColumn>();
forbiddenMapper = new JComboBox<CyColumn>();
useMappingCost = new JCheckBox("Map modification costs");
useMappingPerm = new JCheckBox("Map edges as permanent");
useMappingForb = new JCheckBox("Map edges as forbidden");
useMappingCost.setToolTipText(
"When you use this value you can assign a column in the edge table to represent the modification costs that are to be paid for deleting an edge." "When you use this value you can assign a column in the edge table to represent the modification costs that are to be paid for deleting an edge."
+"You can also assign negative values if you have a complete graph to represent insertion costs." +"You can also assign negative values if you have a complete graph to represent insertion costs."
+"Note: Any missing values are assumed to be the default values" +"Note: Any missing values are assumed to be the default values"
); );
cy = Core.getApplicationManager(); this.addAll(useMappingCost,editingCostMapper,useMappingPerm,permanentMapper,useMappingForb,forbiddenMapper);
this.addAll(useMapping,tableFields);
//Initial call to get table values //Initial call to get table values
updateValues(); updateValues();
//Add a focus listener to update values //Add a focus listener to update values
tableFields.addFocusListener (new FocusListener() { this.addFocusListener (new FocusListener() {
@Override @Override
public void focusGained(FocusEvent e) { public void focusGained(FocusEvent e) {
...@@ -53,22 +64,56 @@ public class ModificationCostMapper extends ComfortPanel{ ...@@ -53,22 +64,56 @@ public class ModificationCostMapper extends ComfortPanel{
} }
public void updateValues() { public void updateValues() {
//Clear entries
tableFields.removeAllItems();
CyNetwork net = cy.getCurrentNetwork(); CyNetwork net = cy.getCurrentNetwork();
if (net != null) { //Check if a network is loaded if (net != null) { //Check if a network is loaded
//Clear entries
editingCostMapper.removeAllItems();
for (CyColumn c : net.getDefaultEdgeTable().getColumns()){ for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
//Only add columns with numeric values //Only add columns with numeric values
if (c.getType() == Integer.class || c.getType() == Double.class) { if (c.getType() == Integer.class || c.getType() == Double.class) {
tableFields.addItem(c); editingCostMapper.addItem(c);
}
}
forbiddenMapper.removeAllItems();
for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
//Only add columns with boolean values
if (c.getType() == Boolean.class) {
editingCostMapper.addItem(c);
}
}
permanentMapper.removeAllItems();
for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
//Only add columns with boolean values
if (c.getType() == Boolean.class) {
permanentMapper.addItem(c);
}
}
}
} }
public CyColumn getEditingCostColumn() {
if (useMappingCost.isSelected()) {
return editingCostMapper.getItemAt(editingCostMapper.getSelectedIndex());
} }
return null;
} }
public CyColumn getForbiddenColumn() {
if (useMappingForb.isSelected()) {
return forbiddenMapper.getItemAt(forbiddenMapper.getSelectedIndex());
}
return null;
} }
public CyColumn getValue() { public CyColumn getPermanentColumn() {
if (useMapping.isSelected()) { if (useMappingPerm.isSelected()) {
return tableFields.getItemAt(tableFields.getSelectedIndex()); return permanentMapper.getItemAt(permanentMapper.getSelectedIndex());
} }
return null; return null;
} }
......
...@@ -10,16 +10,15 @@ import org.cytoscape.model.CyColumn; ...@@ -10,16 +10,15 @@ import org.cytoscape.model.CyColumn;
public class EditCostPanel extends ComfortPanel { public class EditCostPanel extends ComfortPanel {
//SWING COMPONENTS //SWING COMPONENTS
private ModificationCostMapper modCostMapper; private ColumnMapper columnMapper;
private DoubleInputField icField; private DoubleInputField icField;
private DoubleInputField dcField; private DoubleInputField dcField;
private JLabel icLabel; private JLabel icLabel;
private JLabel dcLabel; private JLabel dcLabel;
public EditCostPanel() { public EditCostPanel() {
//Initialize components //Initialize components
modCostMapper = new ModificationCostMapper(); columnMapper = new ColumnMapper();
icField = new DoubleInputField(Double.NEGATIVE_INFINITY,0); icField = new DoubleInputField(Double.NEGATIVE_INFINITY,0);
dcField = new DoubleInputField(0,Double.POSITIVE_INFINITY); dcField = new DoubleInputField(0,Double.POSITIVE_INFINITY);
icField.setText("-1.0"); icField.setText("-1.0");
...@@ -28,7 +27,7 @@ public class EditCostPanel extends ComfortPanel { ...@@ -28,7 +27,7 @@ public class EditCostPanel extends ComfortPanel {
dcLabel = new JLabel("Deletion Cost:"); dcLabel = new JLabel("Deletion Cost:");
icLabel.setLabelFor(icField); icLabel.setLabelFor(icField);
dcLabel.setLabelFor(dcField); dcLabel.setLabelFor(dcField);
this.addAll(modCostMapper,icField,dcField,icLabel,dcLabel); this.addAll(columnMapper,icField,dcField,icLabel,dcLabel);
// //
this.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); this.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
...@@ -37,7 +36,15 @@ public class EditCostPanel extends ComfortPanel { ...@@ -37,7 +36,15 @@ public class EditCostPanel extends ComfortPanel {
//SETTER / GETTER //SETTER / GETTER
public CyColumn getWeightColumn() { public CyColumn getWeightColumn() {
return modCostMapper.getValue(); return columnMapper.getEditingCostColumn();
}
public CyColumn getPermanentColumn() {
return columnMapper.getPermanentColumn();
}
public CyColumn getForbiddenColumn() {
return columnMapper.getForbiddenColumn();
} }
public double getDefaultInsertionCost() { public double getDefaultInsertionCost() {
...@@ -48,4 +55,6 @@ public class EditCostPanel extends ComfortPanel { ...@@ -48,4 +55,6 @@ public class EditCostPanel extends ComfortPanel {
return dcField.getValueAsDouble(); return dcField.getValueAsDouble();
} }
} }
package de.hhu.ba.yoshikoWrapper.gui; package de.hhu.ba.yoshikoWrapper.gui;
import java.text.DecimalFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import javax.swing.text.NumberFormatter; import javax.swing.text.NumberFormatter;
...@@ -19,7 +20,7 @@ public class FormatHelper { ...@@ -19,7 +20,7 @@ public class FormatHelper {
} }
public static NumberFormatter getDoubleFormatter(double minValue, double maxValue) { public static NumberFormatter getDoubleFormatter(double minValue, double maxValue) {
NumberFormat format = NumberFormat.getInstance(); NumberFormat format = DecimalFormat.getInstance();
NumberFormatter formatter = new NumberFormatter(format); NumberFormatter formatter = new NumberFormatter(format);
formatter.setValueClass(Double.class); formatter.setValueClass(Double.class);
formatter.setMinimum(minValue); formatter.setMinimum(minValue);
......
...@@ -100,6 +100,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent { ...@@ -100,6 +100,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent {
Core.performYoshiko( Core.performYoshiko(
timeLimitSetter.getTimeLimit(), timeLimitSetter.getTimeLimit(),
ecPanel.getWeightColumn(), ecPanel.getWeightColumn(),
ecPanel.getPermanentColumn(),
ecPanel.getForbiddenColumn(),
ecPanel.getDefaultInsertionCost(), ecPanel.getDefaultInsertionCost(),
ecPanel.getDefaultDeletionCost() ecPanel.getDefaultDeletionCost()
); );
......
...@@ -2,6 +2,7 @@ package de.hhu.ba.yoshikoWrapper.gui; ...@@ -2,6 +2,7 @@ package de.hhu.ba.yoshikoWrapper.gui;
import java.awt.Component; import java.awt.Component;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
@SuppressWarnings("serial") @SuppressWarnings("serial")
...@@ -15,6 +16,7 @@ public class ReductionRulesChooser extends ComfortPanel{ ...@@ -15,6 +16,7 @@ public class ReductionRulesChooser extends ComfortPanel{
private JCheckBox useSNRule; private JCheckBox useSNRule;
public ReductionRulesChooser() { public ReductionRulesChooser() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
//Initialize subcomponents //Initialize subcomponents
useCRule = new JCheckBox("Use Clique Rule"); useCRule = new JCheckBox("Use Clique Rule");
useCCRule = new JCheckBox("Use Critical-Clique Rule"); useCCRule = new JCheckBox("Use Critical-Clique Rule");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment