Skip to content
Snippets Groups Projects
Select Git revision
  • dev_general
  • master default
  • 0.1.5
  • 0.1.4
  • 0.1.3
  • 0.1.2
  • 0.1.1
7 results

GraphAnalyzer.java

  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    GraphAnalyzer.java 3.83 KiB
    package de.hhu.ba.yoshikoWrapper.cytoUtil;
    
    import java.util.List;
    
    import org.cytoscape.model.CyColumn;
    import org.cytoscape.model.CyEdge;
    import org.cytoscape.model.CyNetwork;
    import org.cytoscape.model.CyRow;
    //import org.slf4j.Logger;
    
    //import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger;
    
    
    public class GraphAnalyzer {
    
    	//private static Logger logger = YoshikoLogger.getInstance().getLogger();
    
    	public static boolean isMultiGraph(CyNetwork net) {
    		//TODO: Better algorithm?
    
    
    		int n = net.getNodeCount();
    		List<CyEdge> edges = net.getEdgeList();
    
    		//Easiest check: Check if the graph contains more edges than a complete graph
    		if (edges.size() > (n*(n-1))/2) {
    			return true;
    		}
    
    		for (int i = 0; i < edges.size()-1; i++) {
    			for (int j=i+1; j<edges.size();j++) {
    				if (connectSameNodes(edges.get(i),edges.get(j))){
    					return true;
    				}
    			}
    		}
    
    		return false;
    	}
    
    	/**
    	 * Checks whether two edges connect the same pair of nodes
    	 * This function is symmetric
    	 * @param e1 An arbitrary CyEdge
    	 * @param e2 An arbitrary CyEdge
    	 * @return true if the edges connect the same pair of nodes, false otherwise
    	 */
    	private static boolean connectSameNodes(CyEdge e1, CyEdge e2) {
    		if (//Treating all edges as undirected here
    				(e1.getSource() == e2.getTarget() && e1.getTarget() == e2.getSource()) ||
    				(e1.getSource() == e2.getSource() && e1.getTarget() == e2.getTarget())
    				) {
    			return true;
    		}
    		return false;
    	}
    
    	public static boolean isDirected(CyNetwork net) {
    		for (CyEdge e: net.getEdgeList()) {
    			if (e.isDirected()) {
    				return true;
    			}
    		}
    		return false;
    	}
    
    	/**
    	 * Generates a fitting bitmask by choosing the reduction rules that appear to be the best choice based on current research
    	 * @param containsRealValues
    	 * @param heuristic
    	 * @return The bitmask as a String
    	 */
    	public static String suggestReductionRules(boolean containsRealValues, boolean heuristic) {
    
    		//TODO: Maybe also choose SNR Factor?
    		//TODO: More research, identify good rules
    
    		boolean useCRule = false,useCCRule= false,useACRule= false,useHERule= false,usePDRRule= false,useSNRule = false;
    		String ret = "";
    
    		//First of all: We don't choose any rules when in heuristic mode
    		if (!heuristic) {
    			//We check if the graph contains real weights
    			if (!containsRealValues) {
    				useCRule = true;
    				useCCRule = true;
    				useACRule = true;
    				useHERule = true;
    			}
    			usePDRRule = true;
    			useSNRule = true;
    		}
    
    		ret += (useCRule ? "1" : "0");
    		ret += (useCCRule ? "1" : "0");
    		ret += (useACRule ? "1" : "0");
    		ret += (useHERule ? "1" : "0");
    		ret += (usePDRRule ? "1" : "0");
    		ret += (useSNRule ? "1" : "0");
    
    		//logger.info("Suggesting the following reduction-rules bitmask: "+ret);
    		System.out.println("Suggesting the following reduction-rules bitmask: "+ret);
    
    		return ret;
    	}
    
    	public static boolean containsRealValues(
    			CyNetwork net,
    			CyColumn weightColumn,
    			CyColumn permanentColumn,
    			CyColumn forbiddenColumn,
    			double defaultInsertionCost,
    			double defaultDeletionCost)
    	{
    		//Simple checks: Deletion and Insertion Costs
    		if (defaultInsertionCost % 1 != 0 || defaultDeletionCost % 1 != 0) {
    			return true;
    		}
    
    		if (net != null){
    			//Fetch edges
    			List<CyEdge> edges = net.getEdgeList();
    
    			//Loop over edges
    			for (CyEdge e : edges) {
    
    				//Fetch entry and check if it exists
    				CyRow edgeEntry = net.getRow(e);
    
    				//Check if there is a weight column defined, else skip
    				if (weightColumn != null){
    					//Check if the column contains an entry for the respective edge
    					//It is possible, that there are missing entries
    					if (edgeEntry.get(weightColumn.getName(), weightColumn.getType()) != null){
    						if (weightColumn.getType() == Double.class) {
    							double weight = edgeEntry.get(weightColumn.getName(), Double.class);
    							if (weight%1!=0) {
    								return true;
    							}
    						}
    					}
    				}
    			}
    		}
    		return false;
    	}
    }