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 {
public static void performYoshiko(
int timeLimit,
CyColumn weightColumn,
CyColumn permanentColumn,
CyColumn forbiddenColumn,
double insertionCostDefault,
double deletionCostDefault
)
......@@ -45,6 +47,8 @@ public class Core {
currentNetwork,
nodeMap,
weightColumn,
permanentColumn,
forbiddenColumn,
deletionCostDefault
);
......@@ -55,7 +59,6 @@ public class Core {
SWIGTYPE_p_ysk__ClusterEditingSolutions solutions = LibraryInterface.processLibraryInput(input);
long numberOfSolutions = LibraryInterface.ClusterEditingSolutions_getNumberOfSolutions(solutions);
System.out.println("Found: "+numberOfSolutions+" solutions!");
double modificationCost = LibraryInterface.ClusterEditingSolutions_getTotalCost(solutions);
......@@ -63,6 +66,7 @@ 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);
long numberOfClusters = LibraryInterface.ClusterEditingSolutions_getNumberOfClusters(solutions, i);
for (long k=0;k<numberOfClusters;k++) {
......
......@@ -21,6 +21,8 @@ public class NetworkParser {
CyNetwork net,
NodeMap nodeMap,
CyColumn weightColumn,
CyColumn permanentColumn,
CyColumn forbiddenColumn,
double deletionCostDefault
)
{
......@@ -36,30 +38,53 @@ public class NetworkParser {
//Loop over edges
for (CyEdge e : edges) {
CyRow edgeEntry = net.getRow(e);
//Set to default cost
//Parse editing costs
double weight = deletionCostDefault;
if (weightColumn != null){
System.out.println("Using column: "+weightColumn.getName());
try {
//Find out if the weights are double or int
@SuppressWarnings("unchecked")
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);
}
}
catch(Exception ex) {
ex.printStackTrace();
//Invalid entry (no entry)
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);
LibraryInterface.LibraryInput_addEdge(generatedInput,
LibraryInterface.LibraryInput_addEdge(
generatedInput,
nodeMap.get(e.getSource()),
nodeMap.get(e.getTarget())
, weight);
nodeMap.get(e.getTarget()),
weight,
permanent,
forbidden
);
}
}
......
......@@ -10,35 +10,46 @@ import javax.swing.JComboBox;
import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.model.CyColumn;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.events.ColumnCreatedEvent;
import org.cytoscape.model.events.ColumnDeletedListener;
import de.hhu.ba.yoshikoWrapper.core.Core;
@SuppressWarnings("serial") //will never be serialized
public class ModificationCostMapper extends ComfortPanel{
public class ColumnMapper extends ComfortPanel{
//Symbolic links
private CyApplicationManager cy;
//Swing components
private JComboBox<CyColumn> tableFields;
private JCheckBox useMapping;
private JComboBox<CyColumn> editingCostMapper;
private JComboBox<CyColumn> permanentMapper;
private JComboBox<CyColumn> forbiddenMapper;
public ModificationCostMapper() {
tableFields = new JComboBox<CyColumn>();
useMapping = new JCheckBox("Map modification costs");
useMapping.setToolTipText(
private JCheckBox useMappingCost;
private JCheckBox useMappingPerm;
private JCheckBox useMappingForb;
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."
+"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"
);
cy = Core.getApplicationManager();
this.addAll(useMapping,tableFields);
this.addAll(useMappingCost,editingCostMapper,useMappingPerm,permanentMapper,useMappingForb,forbiddenMapper);
//Initial call to get table values
updateValues();
//Add a focus listener to update values
tableFields.addFocusListener (new FocusListener() {
this.addFocusListener (new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
......@@ -53,22 +64,56 @@ public class ModificationCostMapper extends ComfortPanel{
}
public void updateValues() {
//Clear entries
tableFields.removeAllItems();
CyNetwork net = cy.getCurrentNetwork();
if (net != null) { //Check if a network is loaded
//Clear entries
editingCostMapper.removeAllItems();
for (CyColumn c : net.getDefaultEdgeTable().getColumns()){
//Only add columns with numeric values
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() {
if (useMapping.isSelected()) {
return tableFields.getItemAt(tableFields.getSelectedIndex());
public CyColumn getPermanentColumn() {
if (useMappingPerm.isSelected()) {
return permanentMapper.getItemAt(permanentMapper.getSelectedIndex());
}
return null;
}
......
......@@ -10,16 +10,15 @@ import org.cytoscape.model.CyColumn;
public class EditCostPanel extends ComfortPanel {
//SWING COMPONENTS
private ModificationCostMapper modCostMapper;
private ColumnMapper columnMapper;
private DoubleInputField icField;
private DoubleInputField dcField;
private JLabel icLabel;
private JLabel dcLabel;
public EditCostPanel() {
//Initialize components
modCostMapper = new ModificationCostMapper();
columnMapper = new ColumnMapper();
icField = new DoubleInputField(Double.NEGATIVE_INFINITY,0);
dcField = new DoubleInputField(0,Double.POSITIVE_INFINITY);
icField.setText("-1.0");
......@@ -28,7 +27,7 @@ public class EditCostPanel extends ComfortPanel {
dcLabel = new JLabel("Deletion Cost:");
icLabel.setLabelFor(icField);
dcLabel.setLabelFor(dcField);
this.addAll(modCostMapper,icField,dcField,icLabel,dcLabel);
this.addAll(columnMapper,icField,dcField,icLabel,dcLabel);
//
this.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
......@@ -37,7 +36,15 @@ public class EditCostPanel extends ComfortPanel {
//SETTER / GETTER
public CyColumn getWeightColumn() {
return modCostMapper.getValue();
return columnMapper.getEditingCostColumn();
}
public CyColumn getPermanentColumn() {
return columnMapper.getPermanentColumn();
}
public CyColumn getForbiddenColumn() {
return columnMapper.getForbiddenColumn();
}
public double getDefaultInsertionCost() {
......@@ -48,4 +55,6 @@ public class EditCostPanel extends ComfortPanel {
return dcField.getValueAsDouble();
}
}
package de.hhu.ba.yoshikoWrapper.gui;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.text.NumberFormatter;
......@@ -19,7 +20,7 @@ public class FormatHelper {
}
public static NumberFormatter getDoubleFormatter(double minValue, double maxValue) {
NumberFormat format = NumberFormat.getInstance();
NumberFormat format = DecimalFormat.getInstance();
NumberFormatter formatter = new NumberFormatter(format);
formatter.setValueClass(Double.class);
formatter.setMinimum(minValue);
......
......@@ -100,6 +100,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent {
Core.performYoshiko(
timeLimitSetter.getTimeLimit(),
ecPanel.getWeightColumn(),
ecPanel.getPermanentColumn(),
ecPanel.getForbiddenColumn(),
ecPanel.getDefaultInsertionCost(),
ecPanel.getDefaultDeletionCost()
);
......
......@@ -2,6 +2,7 @@ package de.hhu.ba.yoshikoWrapper.gui;
import java.awt.Component;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
@SuppressWarnings("serial")
......@@ -15,6 +16,7 @@ public class ReductionRulesChooser extends ComfortPanel{
private JCheckBox useSNRule;
public ReductionRulesChooser() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
//Initialize subcomponents
useCRule = new JCheckBox("Use 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