From 3d4223b667e5e2e31634efe938413aa247afe7d4 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 12:20:41 +0200
Subject: [PATCH 01/25] add getReactionTransitions and getTransitions

---
 .../computation/transform/GraphOperation.java | 109 ++++++++++++++++--
 1 file changed, 102 insertions(+), 7 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index 59e933a8e..69bc1cb1b 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -53,7 +53,7 @@ public class GraphOperation {
 	 * Instantiates a new graph operation.
 	 */
 	public GraphOperation() {}
-	
+
 	/**
 	 * compute the intersection of two graph.
 	 *
@@ -75,7 +75,7 @@ public class GraphOperation {
 		}
 		return i;
 	}
-	
+
 	/**
 	 * compute the union of two graph.
 	 *
@@ -103,7 +103,7 @@ public class GraphOperation {
 		}
 		return u;
 	}
-	
+
 	/**
 	 * compute the size of the intersect of two graph.
 	 *
@@ -121,7 +121,7 @@ public class GraphOperation {
 		}
 		return size;
 	}
-	
+
 	/**
 	 * compute the size of the union of two graph.
 	 *
@@ -135,7 +135,7 @@ public class GraphOperation {
 	public static <V extends BioEntity, E extends Edge<V>, G extends BioGraph<V,E>> int unionSize(G g1, G g2){
 		return g1.edgeSet().size()+g2.edgeSet().size()- intersectSize(g1, g2);
 	}
-	
+
 	/**
 	 * compute the order of the intersect of two graph.
 	 *
@@ -151,7 +151,7 @@ public class GraphOperation {
 		}
 		return order;
 	}
-	
+
 	/**
 	 * compute the order of the union of two graph.
 	 * @param <G> the graph class
@@ -163,5 +163,100 @@ public class GraphOperation {
 	public static <G extends BioGraph<? extends BioEntity, ? extends Edge<?>>> int unionOrder(G g1, G g2){
 		return g1.vertexSet().size()+g2.vertexSet().size()- intersectOrder(g1, g2);
 	}
-	
+
+	/**
+ * Compute the transition score for each connex component of a reaction subgraph
+ *
+ * @param g the cpd graph skeleton network
+ * @param reaction the reaction to evaluate
+ * @param sort, if true return transitions in descending order
+ * @return the transitionScore
+ */
+public static <G extends CompoundGraph> Map<Set<BioMetabolite>,Double> getReactionTransitions(G g, BioReaction reaction,Boolean sort){
+	//TODO find a better place for this method
+	Map<Set<BioMetabolite>,Double> reactionTransitions = new HashMap<Set<BioMetabolite>,Double> ();
+	//Create graph for the reaction
+	CompoundGraph rSubGraph = new CompoundGraph();
+		//Create all possible edges between left and right reactants
+	for (BioReactant lr : reaction.getLeftReactantsView()) {
+		for(BioReactant rr : reaction.getRightReactantsView()) {
+			if(lr != rr) {
+				//create edge if exist in g (to avoid side transitions already filtered in the CSN)
+				ReactionEdge tmp_edge = new ReactionEdge(lr.getMetabolite(),rr.getMetabolite(),reaction);
+				if(g.containsEdge(tmp_edge)) {
+					rSubGraph.addVertex(lr.getMetabolite());
+					rSubGraph.addVertex(rr.getMetabolite());
+					rSubGraph.addEdge(tmp_edge);
+				}
+			}
+		}
+	}
+	//Compute connex components
+	List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedComponent(rSubGraph);
+	for(Set<BioMetabolite> component : cc) {
+		HashMap<String,Double> comp_stat = (GraphMeasure.getNumberParallelEdgesOfComponent(g,component));
+		reactionTransitions.put(component, comp_stat.get("N_edges")/comp_stat.get("N_pedges"));
+}
+	if(sort) {
+		//sort in descending order
+		Map<Set<BioMetabolite>,Double> reactionTransitionsSorted =
+				reactionTransitions.entrySet().stream()
+					.sorted(Entry.<Set<BioMetabolite>,Double>comparingByValue().reversed())
+					.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
+																		(e1, e2) -> e1, LinkedHashMap::new));
+		return reactionTransitionsSorted;
+	}else {
+		return reactionTransitions;
+	}
+}
+/**
+ * Get the transitions for each reaction of the graph
+ * @param <G> the graph class
+ *
+ * @param g the cpd graph skeleton network
+ * @return annotate the input graph edges
+ */
+public static <G extends CompoundGraph> void getTransitions(G g){
+	//Init graphLocalMeasure
+	HashSet<BioReaction> reactionList = new HashSet<BioReaction>();
+	//First task : find all edges associated to a reaction
+	//find all reactions in the CSN
+	for(ReactionEdge edge : g.edgeSet()) {
+		reactionList.add(edge.getReaction());
+	}
+	//For each reaction, get Reaction Transitions
+	for(BioReaction reaction : reactionList) {
+		Boolean main_transition = true;
+		System.out.println("Reaction = "+reaction.getId());
+		for(Entry<Set<BioMetabolite>, Double> transition : getReactionTransitions(g,reaction,true).entrySet()) {
+			//
+			System.out.println("Transition = "+transition);
+			if(transition !=null) {
+				Set<ReactionEdge> EdgesContainer = new HashSet<ReactionEdge>();
+				//iterate over component edges,add main attribute to g
+				for(BioMetabolite m1 : transition.getKey()) {
+					for(BioMetabolite m2 : transition.getKey()) {
+						ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
+						if((m1!=m2) && (g.containsEdge(tmp_redge))) {
+							// annotate edge
+							EdgesContainer.add(tmp_redge);
+							}
+						}
+					}
+				if(main_transition) {
+					//iterate over EdgesContainer
+					for(ReactionEdge edge : EdgesContainer) {
+						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Main");
+						}
+					main_transition = false;
+				}else {
+					//iterate over EdgesContainer
+					for(ReactionEdge edge : EdgesContainer) {
+						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Side");
+						}
+					}
+				}
+			}
+		}
+	}
 }
-- 
GitLab


From 0403da612bd338e039a979e73c84b6d97340c9d5 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 12:41:32 +0200
Subject: [PATCH 02/25] add getNumberEdgesOfComponents and
 getNumberParallelEdgesOfComponent

---
 .../computation/analyze/GraphMeasure.java     | 106 +++++++++++++-----
 1 file changed, 75 insertions(+), 31 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index b2cd754da..ae31aeb65 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -59,29 +59,29 @@ import java.util.Set;
  * @version $Id: $Id
  */
 public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
-	
+
 	/** The graph. */
 	private final BioGraph<V, E> g;
-	
+
 	/** The number of edges. */
 	private double numberOfEdges;
-	
+
 	/** The number of vertex. */
 	private final double numberOfVertex;
-	
+
 	/** The number of connected component. */
 	private Integer numberOfConnectedComp;
-	
+
 	/** The diameter. */
 	private Double diameter;
-	
+
 	/** The length. */
 	private Double length;
-	
+
 	/** if the graph is directed */
 	private boolean directed = true;
-	
-	
+
+
 	/**
 	 * Instantiates a new graph measure.
 	 *
@@ -92,7 +92,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
         this.numberOfEdges = Integer.valueOf(g.edgeSet().size()).doubleValue();
         this.numberOfVertex = Integer.valueOf(g.vertexSet().size()).doubleValue();
 	}
-	
+
 	/**
 	 * Get list of set of BioMetabolite, each BioMetabolite in a set belong to the same connected component
 	 * @param <V> vertex class
@@ -104,7 +104,51 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public static <V extends BioEntity, E extends Edge<V>> List<Set<V>> getConnectedCompenent(BioGraph<V,E> g){
 		return new ConnectivityInspector<>(g).connectedSets();
 	}
-	
+	/**
+	 * Get the number of edges of the provided component
+	 * @param <V> vertex class
+	 * @param <E> edge class
+	 *
+	 * @param g the graph
+	 * @param comp the connected component
+	 * @return the number of edges in this component
+	 */
+	public static <V extends BioEntity, E extends Edge<V>> Integer getNumberEdgesOfComponent(BioGraph<V,E> g, Set<V> comp){
+		Integer n_edges = 0;
+		for(V v1 : comp) {
+			for(V v2 : comp) {
+				if((v1 != v2) && (g.containsEdge(v1, v2))) {
+					n_edges++;
+				}
+			}
+		}
+		return n_edges;
+	}
+	/**
+	 * Get the number of parallel edges of the provided component
+	 * @param <V> vertex class
+	 * @param <E> edge class
+	 *
+	 * @param g the graph
+	 * @param comp the connected component
+	 * @return a HashMap with the number of occurences of each edge in the component and in the graph g(called parallel edges)
+	 */
+	public static <V extends BioEntity, E extends Edge<V>> HashMap<String,Double> getNumberParallelEdgesOfComponent(BioGraph<V,E> g, Set<V> comp){
+		HashMap<String,Double> out_map = new HashMap<String,Double>();
+		out_map.put("N_edges", 0.0);
+		out_map.put("N_pedges", 0.0);
+		for(V v1 : comp) {
+			for(V v2 : comp) {
+				if((v1 != v2) && (g.containsEdge(v1, v2))) {
+					out_map.replace("N_edges", out_map.get("N_edges")+1);
+					//get number of parallel edges
+					out_map.replace("N_pedges", out_map.get("N_pedges")+g.getAllEdges(v1, v2).size());
+				}
+			}
+		}
+		//Store results in map
+		return out_map;
+	}
 	/**
 	 * Gets the number of connected component
 	 *
@@ -115,7 +159,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
         numberOfConnectedComp = getConnectedCompenent(g).size();
 		return numberOfConnectedComp;
 	}
-	
+
 	/**
 	 * Gets the number of cycle.
 	 *
@@ -127,7 +171,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		int numberOfVertex = g.vertexSet().size();
 		return numberOfEdges-numberOfVertex+numberOfConnectedComp;
 	}
-	
+
 	/**
 	 * Gets the diameter of the graph, i.e. the maximum length of a shortest path between two node in the graph
 	 * If the graph is disconnected, return the longest distance found in any connected component
@@ -155,7 +199,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		int diameter = (int) distStats.getMax();
 		return diameter;
 	}
-	
+
 	/**
 	 * Gets the gamma index of the graph, i.e. the ratio between the observed number of edges and the expected maximal number of possible edge, as measure of the level of connectivity
 	 *
@@ -166,7 +210,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		if(!directed) maxNumberOfEdges = maxNumberOfEdges*0.5;
 		return numberOfEdges /maxNumberOfEdges;
 	}
-	
+
 	/**
 	 * Gets the alpha index of the graph, i.e. the ratio between the observed number of cycle and the expected maximal number of possible cycle, as measure of the level of connectivity
 	 * cannot be computed on directed graph
@@ -179,7 +223,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		double maxNumberOfCycle = (numberOfVertex *(numberOfVertex -1))*0.5 - (numberOfVertex -1);
 		return (numberOfEdges -(numberOfVertex -1))/maxNumberOfCycle;
 	}
-	
+
 	/**
 	 * Gets the beta index of the graph, i.e. the ratio between the number of edges and the number of vertex as measure of the level of connectivity
 	 *
@@ -188,7 +232,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public double getBeta(){
 		return numberOfEdges / numberOfVertex;
 	}
-	
+
 	/**
 	 * Gets the total length of the graph, i.e. the sum of each edge weight
 	 *
@@ -202,7 +246,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		}
 		return length;
 	}
-	
+
 	/**
 	 * Gets the eta index, i.e. the mean length of edges.
 	 *
@@ -211,7 +255,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public double getEta(){
 		return getLength()/ numberOfEdges;
 	}
-	
+
 	/**
 	 * Gets the pi index, i.e. the ratio between the diameter of the graph and the total graph length.
 	 *
@@ -220,7 +264,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public double getPi(){
 		return getDiameter()/ getLength();
 	}
-	
+
 	/**
 	 * get the overall closeness centralization index (OCCI), according to Freeman,L.C. (1979) Centrality in social networks: Conceptual clarification. Social Networks, 1, 215–239.
 	 *
@@ -233,24 +277,24 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		PathBasedCentrality<V, E, BioGraph<V, E>> centralityComputor = new PathBasedCentrality<>(g);
 		Set<BioPath<V, E>> paths = centralityComputor.getAllShortestPaths();
 		Map<V, Double> closenessIndex = centralityComputor.getInCloseness(paths);
-		
+
 		double max = 0.0;
 		for(Double closeness : closenessIndex.values()){
 			if(closeness>max) max=closeness;
 		}
-		
+
 		double sum = 0.0;
 		for(Double closeness : closenessIndex.values()){
 			sum += (max - closeness);
 		}
 		//normalize centrality
 		sum = sum*(g.vertexSet().size()-1);
-		
+
 		double occi = (2* numberOfVertex - 3) * sum;
 		occi = occi/((numberOfVertex -1)*(numberOfVertex -2));
 		return occi;
 	}
-	
+
 	/**
 	 * get the overall closeness centralization index (OCCI), according to Freeman,L.C. (1979) Centrality in social networks: Conceptual clarification. Social Networks, 1, 215–239.
 	 *
@@ -263,23 +307,23 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public double getOCCI(Set<BioPath<V, E>> validPaths){
 		PathBasedCentrality<V, E, BioGraph<V, E>> centralityComputor = new PathBasedCentrality<>(g);
 		Map<V, Double> closenessIndex = centralityComputor.getCloseness(validPaths);
-		
+
 		double max = 0.0;
 		for(Double closeness : closenessIndex.values()){
 			if(closeness>max) max=closeness;
 		}
-		
+
 		double sum = 0.0;
 		for(Double closeness : closenessIndex.values()){
 			sum += (max - closeness);
 		}
-		
+
 		double occi = (2* numberOfVertex - 3) * sum;
 		occi = (occi / ((numberOfVertex -1)*(numberOfVertex -2)));
-		
+
 		return occi;
 	}
-	
+
 	/**
 	 * adjust the edge count for multigraph. Edges having the same source and target will be counted as one edge.
 	 */
@@ -290,7 +334,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		}
         this.numberOfEdges =links.size();
 	}
-	
+
 	/**
 	 * get whether or not the graph is considered as directed
 	 *
@@ -299,7 +343,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public boolean isDirected() {
 		return directed;
 	}
-	
+
 	/**
 	 * set whether or not the graph should be considered as directed
 	 * @param directed if the network should be considered as directed
-- 
GitLab


From 3fbb4dbeeff0936f0cea70a6aa28e5c42afd1dbd Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 12:42:50 +0200
Subject: [PATCH 03/25] add getConnectedSetOf (to discuss)

---
 .../computation/analyze/GraphMeasure.java           | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index ae31aeb65..72ffa7e65 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -104,6 +104,19 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public static <V extends BioEntity, E extends Edge<V>> List<Set<V>> getConnectedCompenent(BioGraph<V,E> g){
 		return new ConnectivityInspector<>(g).connectedSets();
 	}
+	/**
+	 * Get a set of all vertices that are in the maximally connected component together with the specified vertex.
+	 * @param <V> vertex class
+	 * @param <E> edge class
+	 *
+	 * @param g the graph
+	 * @param t the target vertex
+	 * @return the set of all vertices maximally connected to the target vertex
+	 */
+	//public static <V extends BioEntity, E extends Edge<V>,  BioEntity<T>> Set<V>> getConnectedSetOf(BioGraph<V,E> g, Vertex <T>){
+	public static <V extends BioEntity, E extends Edge<V>> Set<V> getConnectedSetOf(BioGraph<V,E> g, V t){
+		return new ConnectivityInspector<>(g).connectedSetOf(t);
+	}
 	/**
 	 * Get the number of edges of the provided component
 	 * @param <V> vertex class
-- 
GitLab


From fa7dd1702b2c79165558a8744cc4b2be69f3fe68 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 12:44:51 +0200
Subject: [PATCH 04/25] add isPartofNComponent (to discuss)

---
 .../computation/analyze/GraphMeasure.java     | 35 +++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index 72ffa7e65..993b44078 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -117,6 +117,41 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public static <V extends BioEntity, E extends Edge<V>> Set<V> getConnectedSetOf(BioGraph<V,E> g, V t){
 		return new ConnectivityInspector<>(g).connectedSetOf(t);
 	}
+	/**
+	 * Get a set of all vertices that are in the maximally connected component together with the specified vertex.
+	 * @param <V> vertex class
+	 * @param <E> edge class
+	 *
+	 * @param g the graph
+	 * @param t the target vertex
+	 * @return the set of all vertices maximally connected to the target vertex
+	 */
+	public static <V extends BioEntity, E extends Edge<V>> Set<V> isPartofNComponent(BioGraph<V,E> g, V t){
+		//init connectivity inspector
+		ConnectivityInspector CI  = new ConnectivityInspector<>(g);
+		//Sort the list of components by size
+		List<Set<V>> components = CI.connectedSets();
+		Collections.sort(components,new SizeComparator());
+		//Get the set of all vertices maximally connected to the target vertex
+		Set<V> SetOfT = CI.connectedSetOf(t);
+		int counter = 0;
+		for(Set s:components){
+			counter++;
+			if (s.containsAll(SetOfT)){
+				if (counter == 1){
+					System.out.println("Metabolite "+t.getName()+" is part of the "+counter+" st component");
+				}else if (counter == 2){
+					System.out.println("Metabolite "+t.getName()+" is part of the "+counter+" nd component");
+				}else if (counter == 3){
+					System.out.println("Metabolite "+t.getName()+" is part of the "+counter+" rd component");
+				}else{
+					System.out.println("Metabolite "+t.getName()+" is part of the "+counter+" th component");
+				}
+				return s;
+			}
+		}
+		return null;
+	}
 	/**
 	 * Get the number of edges of the provided component
 	 * @param <V> vertex class
-- 
GitLab


From 0b43e717a2b64dda358115efbc8bd7a95745255a Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 14:18:42 +0200
Subject: [PATCH 05/25] add met4j_core util : SizeComparator

---
 .../met4j_core/utils/SizeComparator.java      | 53 +++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java

diff --git a/met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java b/met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java
new file mode 100644
index 000000000..736b5eeec
--- /dev/null
+++ b/met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright INRAE (2021)
+ *
+ * contact-metexplore@inrae.fr
+ *
+ * This software is a computer program whose purpose is to [describe
+ * functionalities and technical features of your software].
+ *
+ * This software is governed by the CeCILL license under French law and
+ * abiding by the rules of distribution of free software.  You can  use,
+ * modify and/ or redistribute the software under the terms of the CeCILL
+ * license as circulated by CEA, CNRS and INRIA at the following URL
+ * "https://cecill.info/licences/Licence_CeCILL_V2.1-en.html".
+ *
+ * As a counterpart to the access to the source code and  rights to copy,
+ * modify and redistribute granted by the license, users are provided only
+ * with a limited warranty  and the software's author,  the holder of the
+ * economic rights,  and the successive licensors  have only  limited
+ * liability.
+ *
+ * In this respect, the user's attention is drawn to the risks associated
+ * with loading,  using,  modifying and/or developing or reproducing the
+ * software by the user in light of its specific status of free software,
+ * that may mean  that it is complicated to manipulate,  and  that  also
+ * therefore means  that it is reserved for developers  and  experienced
+ * professionals having in-depth computer knowledge. Users are therefore
+ * encouraged to load and test the software's suitability as regards their
+ * requirements in conditions enabling the security of their systems and/or
+ * data to be ensured and,  more generally, to use and operate it in the
+ * same conditions as regards security.
+ *
+ * The fact that you are presently reading this means that you have had
+ * knowledge of the CeCILL license and that you accept its terms.
+ *
+ */
+
+package fr.inrae.toulouse.metexplore.met4j_core.utils;
+
+import java.util.Set;
+import java.util.Comparator;
+import java.lang.Integer;
+public class SizeComparator implements Comparator<Set<?>> {
+	@Override
+	/**
+	*
+	* @param s1, the first {@link java.util.Set} object
+	* @param s2, the second {@link java.util.Set} object
+	*/
+	public int compare(Set<?> s1, Set<?> s2) {
+		//return Integer.valueOf(s1.size()).compareTo(s2.size());
+		return Integer.valueOf(s2.size()).compareTo(s1.size());
+	}
+	}
\ No newline at end of file
-- 
GitLab


From 3ac9a10c3e37579cb7391eddc57cd4e5429f6604 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 14:35:22 +0200
Subject: [PATCH 06/25] fix missing imports

---
 .../computation/analyze/GraphMeasure.java     |  4 ++
 .../computation/transform/GraphOperation.java | 48 ++++++++++++++-----
 2 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index 993b44078..fda12a106 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -36,12 +36,14 @@
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
+import fr.inrae.toulouse.metexplore.met4j_core.utils.SizeComparator;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.jgrapht.alg.connectivity.ConnectivityInspector;
 
@@ -49,6 +51,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Collections;
+import java.util.HashMap;
 
 /**
  * compute several measures of the level or connectivity, size or shape of a given graph using lazy builder to avoid redundant calculus
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index 69bc1cb1b..5af87c9db 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -35,10 +35,32 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.transform;
 
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.ShortestPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphLocalMeasure;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReactant;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 
 /**
  * Provide static method to compute some basic set operation on graph such as union or interesct.
@@ -192,7 +214,7 @@ public static <G extends CompoundGraph> Map<Set<BioMetabolite>,Double> getReacti
 		}
 	}
 	//Compute connex components
-	List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedComponent(rSubGraph);
+	List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(rSubGraph);
 	for(Set<BioMetabolite> component : cc) {
 		HashMap<String,Double> comp_stat = (GraphMeasure.getNumberParallelEdgesOfComponent(g,component));
 		reactionTransitions.put(component, comp_stat.get("N_edges")/comp_stat.get("N_pedges"));
@@ -243,18 +265,18 @@ public static <G extends CompoundGraph> void getTransitions(G g){
 							}
 						}
 					}
-				if(main_transition) {
-					//iterate over EdgesContainer
-					for(ReactionEdge edge : EdgesContainer) {
-						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Main");
-						}
-					main_transition = false;
-				}else {
-					//iterate over EdgesContainer
-					for(ReactionEdge edge : EdgesContainer) {
-						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Side");
-						}
-					}
+//				if(main_transition) {
+//					//iterate over EdgesContainer
+//					for(ReactionEdge edge : EdgesContainer) {
+//						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Main");
+//						}
+//					main_transition = false;
+//				}else {
+//					//iterate over EdgesContainer
+//					for(ReactionEdge edge : EdgesContainer) {
+//						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Side");
+//						}
+//					}
 				}
 			}
 		}
-- 
GitLab


From eee78784b409bc901084f72e92a2fe930056479a Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Fri, 1 Jul 2022 18:48:40 +0200
Subject: [PATCH 07/25] update GetTransitions

---
 .../computation/transform/GraphOperation.java | 82 ++++++++++++-------
 1 file changed, 54 insertions(+), 28 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index 5af87c9db..b16ac9cfb 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -50,12 +50,16 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import java.io.FileWriter;
+import java.io.IOException;
+
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReactant;
@@ -246,39 +250,61 @@ public static <G extends CompoundGraph> void getTransitions(G g){
 	for(ReactionEdge edge : g.edgeSet()) {
 		reactionList.add(edge.getReaction());
 	}
-	//For each reaction, get Reaction Transitions
-	for(BioReaction reaction : reactionList) {
-		Boolean main_transition = true;
-		System.out.println("Reaction = "+reaction.getId());
-		for(Entry<Set<BioMetabolite>, Double> transition : getReactionTransitions(g,reaction,true).entrySet()) {
-			//
-			System.out.println("Transition = "+transition);
-			if(transition !=null) {
-				Set<ReactionEdge> EdgesContainer = new HashSet<ReactionEdge>();
-				//iterate over component edges,add main attribute to g
-				for(BioMetabolite m1 : transition.getKey()) {
-					for(BioMetabolite m2 : transition.getKey()) {
-						ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
-						if((m1!=m2) && (g.containsEdge(tmp_redge))) {
-							// annotate edge
-							EdgesContainer.add(tmp_redge);
+	//init output file
+	try {
+	    FileWriter fw = new FileWriter("components_analysis.txt");
+	    fw.write("\tReactionID\tSideCpds\n");
+		//For each reaction, get Reaction Transitions
+		for(BioReaction reaction : reactionList) {
+			Boolean main_transition = true;
+			System.out.println("Reaction = "+reaction.getId());
+			String tmpStr = reaction.getId()+"\t";
+			Set<String> tmpSet = new HashSet<String>();
+			for(Entry<Set<BioMetabolite>, Double> transition : getReactionTransitions(g,reaction,true).entrySet()) {
+				//
+				System.out.println("Transition = "+transition);
+				if(transition !=null) {
+					Set<ReactionEdge> EdgesContainer = new LinkedHashSet<ReactionEdge>();
+					//iterate over component edges,add main attribute to g
+					for(BioMetabolite m1 : transition.getKey()) {
+						for(BioMetabolite m2 : transition.getKey()) {
+							ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
+							if((m1!=m2) && (g.containsEdge(tmp_redge))) {
+								// annotate edge
+								EdgesContainer.add(tmp_redge);
+								}
 							}
 						}
+					if(main_transition) {
+						main_transition = false;
+					}else {
+						for(ReactionEdge edge : EdgesContainer) {
+							tmpSet.add(edge.getV1().getId());
+							tmpSet.add(edge.getV2().getId());
+						}
+						for(String metId : tmpSet) {
+							tmpStr = tmpStr+"/"+metId;
+						}
 					}
-//				if(main_transition) {
-//					//iterate over EdgesContainer
-//					for(ReactionEdge edge : EdgesContainer) {
-//						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Main");
-//						}
-//					main_transition = false;
-//				}else {
-//					//iterate over EdgesContainer
-//					for(ReactionEdge edge : EdgesContainer) {
-//						g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Side");
+						//iterate over EdgesContainer
+//						for(ReactionEdge edge : EdgesContainer) {
+//							g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Main");
+//							}
+//						main_transition = false;
+//					}else {
+//						//iterate over EdgesContainer
+//						for(ReactionEdge edge : EdgesContainer) {
+//							g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Side");
+//							}
 //						}
-//					}
+					}
 				}
+				//write line in output file
+				fw.write(tmpStr+'\n');
 			}
+			System.out.println("Total number of reactions = "+reactionList.size());
+	}catch (IOException e) {
+		e.printStackTrace();
 		}
-	}
+}
 }
-- 
GitLab


From 04a7adc29305daf2ffa7fe0dec5fd9c3472ff4c1 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Mon, 4 Jul 2022 18:19:03 +0200
Subject: [PATCH 08/25] update getTransitions

---
 .../computation/transform/GraphOperation.java | 20 +++++++++----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index b16ac9cfb..16b28cf18 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -235,14 +235,7 @@ public static <G extends CompoundGraph> Map<Set<BioMetabolite>,Double> getReacti
 		return reactionTransitions;
 	}
 }
-/**
- * Get the transitions for each reaction of the graph
- * @param <G> the graph class
- *
- * @param g the cpd graph skeleton network
- * @return annotate the input graph edges
- */
-public static <G extends CompoundGraph> void getTransitions(G g){
+public static <G extends CompoundGraph> void getTransitions(G g, String outputFile){
 	//Init graphLocalMeasure
 	HashSet<BioReaction> reactionList = new HashSet<BioReaction>();
 	//First task : find all edges associated to a reaction
@@ -252,7 +245,7 @@ public static <G extends CompoundGraph> void getTransitions(G g){
 	}
 	//init output file
 	try {
-	    FileWriter fw = new FileWriter("components_analysis.txt");
+	    FileWriter fw = new FileWriter(outputFile);
 	    fw.write("\tReactionID\tSideCpds\n");
 		//For each reaction, get Reaction Transitions
 		for(BioReaction reaction : reactionList) {
@@ -285,6 +278,13 @@ public static <G extends CompoundGraph> void getTransitions(G g){
 						for(String metId : tmpSet) {
 							tmpStr = tmpStr+"/"+metId;
 						}
+					}
+					//write line in output file
+					//write reactions only if they have side compounds
+					if(!tmpStr.equals(reaction.getId()+"\t")){
+						System.out.println(tmpStr);
+						System.out.println(reaction.getId()+"\t");
+						fw.write(tmpStr.replaceFirst("/","")+"\n");
 					}
 						//iterate over EdgesContainer
 //						for(ReactionEdge edge : EdgesContainer) {
@@ -299,8 +299,6 @@ public static <G extends CompoundGraph> void getTransitions(G g){
 //						}
 					}
 				}
-				//write line in output file
-				fw.write(tmpStr+'\n');
 			}
 			System.out.println("Total number of reactions = "+reactionList.size());
 	}catch (IOException e) {
-- 
GitLab


From 25b9220c0ec8779a763b555a0bcc9fb67b3a9aa4 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Wed, 6 Jul 2022 17:11:25 +0200
Subject: [PATCH 09/25] update getTransitions

---
 .../computation/transform/GraphOperation.java | 82 ++++++++-----------
 1 file changed, 34 insertions(+), 48 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index 16b28cf18..e436176e3 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -245,62 +245,48 @@ public static <G extends CompoundGraph> void getTransitions(G g, String outputFi
 	}
 	//init output file
 	try {
-	    FileWriter fw = new FileWriter(outputFile);
+	    BufferedWriter fw = new BufferedWriter(new FileWriter(outputFile,false),8*1024);
 	    fw.write("\tReactionID\tSideCpds\n");
-		//For each reaction, get Reaction Transitions
-		for(BioReaction reaction : reactionList) {
-			Boolean main_transition = true;
-			System.out.println("Reaction = "+reaction.getId());
-			String tmpStr = reaction.getId()+"\t";
-			Set<String> tmpSet = new HashSet<String>();
-			for(Entry<Set<BioMetabolite>, Double> transition : getReactionTransitions(g,reaction,true).entrySet()) {
-				//
-				System.out.println("Transition = "+transition);
-				if(transition !=null) {
-					Set<ReactionEdge> EdgesContainer = new LinkedHashSet<ReactionEdge>();
-					//iterate over component edges,add main attribute to g
-					for(BioMetabolite m1 : transition.getKey()) {
-						for(BioMetabolite m2 : transition.getKey()) {
-							ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
-							if((m1!=m2) && (g.containsEdge(tmp_redge))) {
-								// annotate edge
-								EdgesContainer.add(tmp_redge);
+			//For each reaction, get Reaction Transitions
+			for(BioReaction reaction : reactionList) {
+				Boolean main_transition = true;
+				// String tmpStr = reaction.getId()+"\t";
+				Set<String> tmpSet = new HashSet<String>();
+				for(Entry<Set<BioMetabolite>, Double> transition : getReactionTransitions(g,reaction,true).entrySet()) {
+					//
+					if(transition !=null) {
+						Set<ReactionEdge> EdgesContainer = new LinkedHashSet<ReactionEdge>();
+						//iterate over component edges,add main attribute to g
+						for(BioMetabolite m1 : transition.getKey()) {
+							for(BioMetabolite m2 : transition.getKey()) {
+								ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
+								if((m1!=m2) && (g.containsEdge(tmp_redge))) {
+									// annotate edge
+									EdgesContainer.add(tmp_redge);
+									}
+								}
+							}
+						if(main_transition) {
+							main_transition = false;
+						}else {
+							for(ReactionEdge edge : EdgesContainer) {
+								tmpSet.add(edge.getV1().getId());
+								tmpSet.add(edge.getV2().getId());
+							}
+							if (tmpSet.size()>0) {
+								for(String metId : tmpSet) {
+									if (metId.length()>1) {
+										System.out.println(reaction.getId()+"\t"+metId+"\n");
+										fw.write(reaction.getId()+"\t"+metId+"\n");
+									}
 								}
 							}
 						}
-					if(main_transition) {
-						main_transition = false;
-					}else {
-						for(ReactionEdge edge : EdgesContainer) {
-							tmpSet.add(edge.getV1().getId());
-							tmpSet.add(edge.getV2().getId());
-						}
-						for(String metId : tmpSet) {
-							tmpStr = tmpStr+"/"+metId;
-						}
-					}
-					//write line in output file
-					//write reactions only if they have side compounds
-					if(!tmpStr.equals(reaction.getId()+"\t")){
-						System.out.println(tmpStr);
-						System.out.println(reaction.getId()+"\t");
-						fw.write(tmpStr.replaceFirst("/","")+"\n");
-					}
-						//iterate over EdgesContainer
-//						for(ReactionEdge edge : EdgesContainer) {
-//							g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Main");
-//							}
-//						main_transition = false;
-//					}else {
-//						//iterate over EdgesContainer
-//						for(ReactionEdge edge : EdgesContainer) {
-//							g.getEdge(edge.getV1().getId(), edge.getV2().getId(), reaction.getId()).setTransiton("Side");
-//							}
-//						}
 					}
 				}
 			}
 			System.out.println("Total number of reactions = "+reactionList.size());
+			fw.close();
 	}catch (IOException e) {
 		e.printStackTrace();
 		}
-- 
GitLab


From fc8c7124a761e80aa280b9883cfd82ed258470a0 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Wed, 6 Jul 2022 17:24:27 +0200
Subject: [PATCH 10/25] remove verbose in getTransitions

---
 .../met4j_graph/computation/transform/GraphOperation.java      | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index e436176e3..3826ac3a4 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -276,7 +276,6 @@ public static <G extends CompoundGraph> void getTransitions(G g, String outputFi
 							if (tmpSet.size()>0) {
 								for(String metId : tmpSet) {
 									if (metId.length()>1) {
-										System.out.println(reaction.getId()+"\t"+metId+"\n");
 										fw.write(reaction.getId()+"\t"+metId+"\n");
 									}
 								}
@@ -285,7 +284,7 @@ public static <G extends CompoundGraph> void getTransitions(G g, String outputFi
 					}
 				}
 			}
-			System.out.println("Total number of reactions = "+reactionList.size());
+			// System.out.println("Total number of reactions = "+reactionList.size());
 			fw.close();
 	}catch (IOException e) {
 		e.printStackTrace();
-- 
GitLab


From b725aa65664f1365719ffb3d6047c8e092416629 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Wed, 6 Jul 2022 17:26:01 +0200
Subject: [PATCH 11/25] update imports in GraphOperation

---
 .../computation/transform/GraphOperation.java         | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index 3826ac3a4..22ad3e8e0 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -47,17 +47,10 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphLocalMeasure;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.*;
 
 import java.io.FileWriter;
+import java.io.BufferedWriter;
 import java.io.IOException;
 
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-- 
GitLab


From 90f6e9614a847ee37c35df70a5f17d65bc0ab34a Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Wed, 6 Jul 2022 17:29:02 +0200
Subject: [PATCH 12/25] update imports in GraphOperation

---
 .../met4j_graph/computation/transform/GraphOperation.java       | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index 22ad3e8e0..fc6a152a2 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -48,6 +48,8 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphLocalMe
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
 
 import java.util.*;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 import java.io.FileWriter;
 import java.io.BufferedWriter;
-- 
GitLab


From c1aff0309d9690ed473774203471099ac38b0a37 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Tue, 19 Jul 2022 12:11:18 +0200
Subject: [PATCH 13/25] Add reactionSC option to the CarbonSkeletonNet app

---
 .../networkAnalysis/CarbonSkeletonNet.java           | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java
index 4d762bbf9..07e3c52c1 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java
@@ -8,6 +8,7 @@ import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.Re
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.EdgeMerger;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.VertexContraction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.utils.ComputeAdjacencyMatrix;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphOperation;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.Bionetwork2BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.io.ExportGraph;
@@ -20,6 +21,8 @@ import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.plugin.PackageParser;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.ExportMatrix;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.*;
+
+import org.apache.commons.lang3.StringUtils;
 import org.kohsuke.args4j.Option;
 
 import java.io.IOException;
@@ -66,6 +69,9 @@ public class CarbonSkeletonNet extends AbstractMet4jApplication {
     @Option(name = "-tp", aliases = {"--transitionproba"}, usage = "set transition probability as weight", required = false)
     public boolean computeWeight = false;
 
+    @Option(name = "-rsc", aliases = {"--reactionSC"}, usage = "Compute side compounds for each reaction", required = false)
+    public boolean reactionSC = false;
+
     @Option(name = "-am", aliases = {"--asmatrix"}, usage = "export as matrix (implies simple graph conversion). Default export as GML file", required = false)
     public boolean asMatrix = false;
 
@@ -165,6 +171,12 @@ public class CarbonSkeletonNet extends AbstractMet4jApplication {
             System.out.println(" Done.");
         }
 
+        //output reactions side compounds
+        if (reactionSC){
+            System.out.print("Compute reaction wise side-compounds..");
+            GraphOperation.getTransitions(graph,StringUtils.substringBefore(outputPath,".")+"reactions_side_cpds.txt");
+        }
+
         //merge parallel edges
         if (mergeEdges) {
             System.out.print("Merging edges...");
-- 
GitLab


From 8eac47cbca672a0e028959cab3503d64c8867b69 Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Fri, 29 Jul 2022 16:12:01 +0200
Subject: [PATCH 14/25] move reactionSideCompound methods in dedicated class

changed as weighting policy.
Todo: reactionSideCompound as app
---
 .../computation/analyze/GraphMeasure.java     |  26 +--
 .../connect/weighting/RPAIRSlikePolicy.java   | 217 ++++++++++++++++++
 .../computation/transform/GraphOperation.java | 100 --------
 3 files changed, 218 insertions(+), 125 deletions(-)
 create mode 100644 met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index fda12a106..3396dccb1 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -176,31 +176,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 		}
 		return n_edges;
 	}
-	/**
-	 * Get the number of parallel edges of the provided component
-	 * @param <V> vertex class
-	 * @param <E> edge class
-	 *
-	 * @param g the graph
-	 * @param comp the connected component
-	 * @return a HashMap with the number of occurences of each edge in the component and in the graph g(called parallel edges)
-	 */
-	public static <V extends BioEntity, E extends Edge<V>> HashMap<String,Double> getNumberParallelEdgesOfComponent(BioGraph<V,E> g, Set<V> comp){
-		HashMap<String,Double> out_map = new HashMap<String,Double>();
-		out_map.put("N_edges", 0.0);
-		out_map.put("N_pedges", 0.0);
-		for(V v1 : comp) {
-			for(V v2 : comp) {
-				if((v1 != v2) && (g.containsEdge(v1, v2))) {
-					out_map.replace("N_edges", out_map.get("N_edges")+1);
-					//get number of parallel edges
-					out_map.replace("N_pedges", out_map.get("N_pedges")+g.getAllEdges(v1, v2).size());
-				}
-			}
-		}
-		//Store results in map
-		return out_map;
-	}
+
 	/**
 	 * Gets the number of connected component
 	 *
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
new file mode 100644
index 000000000..15708d973
--- /dev/null
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -0,0 +1,217 @@
+package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
+
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReactant;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdge, CompoundGraph> {
+
+    AtomMappingWeightPolicy preprocess;
+    Double mainValue = 1.0;
+    Double sideValue = -1.0;
+    Boolean removeSide = false;
+
+    public RPAIRSlikePolicy(AtomMappingWeightPolicy aam){
+        preprocess=aam.removeEdgeWithoutMapping()
+                .removeEdgesWithoutConservedCarbon()
+                .binarize();
+    }
+
+    public RPAIRSlikePolicy removeSideTransition(){
+        removeSide=true;
+        return this;
+    }
+
+    @Override
+    public void setWeight(CompoundGraph compoundGraph) {
+        preprocess.setWeight(compoundGraph);
+        for(BioReaction reaction : compoundGraph.getBiochemicalReactionList().values()){
+            //Get Reaction subgraph
+            Boolean main_transition = true;
+            for(Map.Entry<Set<BioMetabolite>, Double> transition : rankReactionTransitions(compoundGraph,getReactionSubGraph(compoundGraph, reaction)).entrySet()) {
+                //
+                if (transition != null) {
+                    if (main_transition) {
+                        //iterate over component edges,add main attribute to g
+                        for (BioMetabolite m1 : transition.getKey()) {
+                            for (BioMetabolite m2 : transition.getKey()) {
+                                if (m1 != m2) {
+                                    ReactionEdge r = compoundGraph.getEdge(m1, m2, reaction);
+                                    if ((r != null)) {
+                                        compoundGraph.setEdgeWeight(r,mainValue);
+                                    }
+                                }
+                            }
+                        }
+                        main_transition = false;
+                    } else {
+                        for (BioMetabolite m1 : transition.getKey()) {
+                            for (BioMetabolite m2 : transition.getKey()) {
+                                if (m1 != m2) {
+                                    ReactionEdge r = compoundGraph.getEdge(m1, m2, reaction);
+                                    if ((r != null)) {
+                                        if(removeSide){
+                                            compoundGraph.removeEdge(r);
+                                        }else{
+                                            compoundGraph.setEdgeWeight(r,sideValue);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Compute the reaction subgraph
+     *
+     * @param g the cpd graph
+     * @param reaction the reaction to evaluate
+     * @return the reaction subgraph
+     */
+    public CompoundGraph getReactionSubGraph(CompoundGraph g, BioReaction reaction) {
+        //Create graph for the reaction
+        CompoundGraph rSubGraph = new CompoundGraph();
+        //Create all possible edges between left and right reactants
+        for (BioReactant lr : reaction.getLeftReactantsView()) {
+            for (BioReactant rr : reaction.getRightReactantsView()) {
+                if (lr != rr) {
+                    //create edge if exist in g (to avoid side transitions already filtered in the CSN)
+                    ReactionEdge tmp_edge = new ReactionEdge(lr.getMetabolite(), rr.getMetabolite(), reaction);
+                    if (g.containsEdge(tmp_edge)) {
+                        rSubGraph.addVertex(lr.getMetabolite());
+                        rSubGraph.addVertex(rr.getMetabolite());
+                        rSubGraph.addEdge(tmp_edge);
+                    }
+                }
+            }
+        }
+        return rSubGraph;
+    }
+
+    /**
+     * Compute the transition score for each connex component of a reaction subgraph
+     *
+     * @param g the cpd graph skeleton network
+     * @param rSubGraph the reaction subgraph
+     * @return the transitionScore
+     */
+    public Map<Set<BioMetabolite>,Double> rankReactionTransitions(CompoundGraph g, CompoundGraph rSubGraph){
+        Map<Set<BioMetabolite>, Double> reactionTransitions = new HashMap<Set<BioMetabolite>, Double>();
+
+       //Compute connex components
+        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(rSubGraph);
+        for(Set<BioMetabolite> component : cc) {
+            HashMap<String,Double> comp_stat = (getNumberParallelEdgesOfComponent(g,component));
+            reactionTransitions.put(component, comp_stat.get("N_edges")/comp_stat.get("N_pedges"));
+        }
+
+        //sort in descending order
+        Map<Set<BioMetabolite>,Double> reactionTransitionsSorted =
+                reactionTransitions.entrySet().stream()
+                        .sorted(Map.Entry.<Set<BioMetabolite>,Double>comparingByValue().reversed())
+                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
+                                (e1, e2) -> e1, LinkedHashMap::new));
+        return reactionTransitionsSorted;
+    }
+
+    /**
+     * Get the number of parallel edges of the provided component
+     * @param <V> vertex class
+     * @param <E> edge class
+     *
+     * @param g the graph
+     * @param comp the connected component
+     * @return a HashMap with the number of occurences of each edge in the component and in the graph g(called parallel edges)
+     */
+    public <V extends BioEntity, E extends Edge<V>> HashMap<String,Double> getNumberParallelEdgesOfComponent(CompoundGraph g, Set<BioMetabolite> comp){
+        HashMap<String,Double> out_map = new HashMap<String,Double>();
+        out_map.put("N_edges", 0.0);
+        out_map.put("N_pedges", 0.0);
+        for(BioMetabolite v1 : comp) {
+            for(BioMetabolite v2 : comp) {
+                if((v1 != v2) && (g.containsEdge(v1, v2))) {
+                    out_map.replace("N_edges", out_map.get("N_edges")+1);
+                    //get number of parallel edges
+                    out_map.replace("N_pedges", out_map.get("N_pedges")+g.getAllEdges(v1, v2).size());
+                }
+            }
+        }
+        //Store results in map
+        return out_map;
+    }
+
+
+
+//    public void getTransitions(CompoundGraph g, String outputFile){
+//        //Init graphLocalMeasure
+//        HashSet<BioReaction> reactionList = new HashSet<BioReaction>();
+//        //First task : find all edges associated to a reaction
+//        //find all reactions in the CSN
+//        for(ReactionEdge edge : g.edgeSet()) {
+//            reactionList.add(edge.getReaction());
+//        }
+//        //init output file
+//        try {
+//            BufferedWriter fw = new BufferedWriter(new FileWriter(outputFile,false),8*1024);
+//            fw.write("\tReactionID\tSideCpds\n");
+//            //For each reaction, get Reaction Transitions
+//            for(BioReaction reaction : reactionList) {
+//                Boolean main_transition = true;
+//                // String tmpStr = reaction.getId()+"\t";
+//                Set<String> tmpSet = new HashSet<String>();
+//                for(Map.Entry<Set<BioMetabolite>, Double> transition : rankReactionTransitions(g,getReactionSubGraph(g, reaction)).entrySet()) {
+//                    //
+//                    if(transition !=null) {
+//                        Set<ReactionEdge> EdgesContainer = new LinkedHashSet<ReactionEdge>();
+//                        //iterate over component edges,add main attribute to g
+//                        for(BioMetabolite m1 : transition.getKey()) {
+//                            for(BioMetabolite m2 : transition.getKey()) {
+//                                ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
+//                                if((m1!=m2) && (g.containsEdge(tmp_redge))) {
+//                                    // annotate edge
+//                                    EdgesContainer.add(tmp_redge);
+//                                }
+//                            }
+//                        }
+//                        if(main_transition) {
+//                            main_transition = false;
+//                        }else {
+//                            for(ReactionEdge edge : EdgesContainer) {
+//                                tmpSet.add(edge.getV1().getId());
+//                                tmpSet.add(edge.getV2().getId());
+//                            }
+//                            if (tmpSet.size()>0) {
+//                                for(String metId : tmpSet) {
+//                                    if (metId.length()>1) {
+//                                        fw.write(reaction.getId()+"\t"+metId+"\n");
+//                                    }
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//            // System.out.println("Total number of reactions = "+reactionList.size());
+//            fw.close();
+//        }catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//    }
+}
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index fc6a152a2..b1af55d31 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -185,104 +185,4 @@ public class GraphOperation {
 		return g1.vertexSet().size()+g2.vertexSet().size()- intersectOrder(g1, g2);
 	}
 
-	/**
- * Compute the transition score for each connex component of a reaction subgraph
- *
- * @param g the cpd graph skeleton network
- * @param reaction the reaction to evaluate
- * @param sort, if true return transitions in descending order
- * @return the transitionScore
- */
-public static <G extends CompoundGraph> Map<Set<BioMetabolite>,Double> getReactionTransitions(G g, BioReaction reaction,Boolean sort){
-	//TODO find a better place for this method
-	Map<Set<BioMetabolite>,Double> reactionTransitions = new HashMap<Set<BioMetabolite>,Double> ();
-	//Create graph for the reaction
-	CompoundGraph rSubGraph = new CompoundGraph();
-		//Create all possible edges between left and right reactants
-	for (BioReactant lr : reaction.getLeftReactantsView()) {
-		for(BioReactant rr : reaction.getRightReactantsView()) {
-			if(lr != rr) {
-				//create edge if exist in g (to avoid side transitions already filtered in the CSN)
-				ReactionEdge tmp_edge = new ReactionEdge(lr.getMetabolite(),rr.getMetabolite(),reaction);
-				if(g.containsEdge(tmp_edge)) {
-					rSubGraph.addVertex(lr.getMetabolite());
-					rSubGraph.addVertex(rr.getMetabolite());
-					rSubGraph.addEdge(tmp_edge);
-				}
-			}
-		}
-	}
-	//Compute connex components
-	List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(rSubGraph);
-	for(Set<BioMetabolite> component : cc) {
-		HashMap<String,Double> comp_stat = (GraphMeasure.getNumberParallelEdgesOfComponent(g,component));
-		reactionTransitions.put(component, comp_stat.get("N_edges")/comp_stat.get("N_pedges"));
-}
-	if(sort) {
-		//sort in descending order
-		Map<Set<BioMetabolite>,Double> reactionTransitionsSorted =
-				reactionTransitions.entrySet().stream()
-					.sorted(Entry.<Set<BioMetabolite>,Double>comparingByValue().reversed())
-					.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
-																		(e1, e2) -> e1, LinkedHashMap::new));
-		return reactionTransitionsSorted;
-	}else {
-		return reactionTransitions;
-	}
-}
-public static <G extends CompoundGraph> void getTransitions(G g, String outputFile){
-	//Init graphLocalMeasure
-	HashSet<BioReaction> reactionList = new HashSet<BioReaction>();
-	//First task : find all edges associated to a reaction
-	//find all reactions in the CSN
-	for(ReactionEdge edge : g.edgeSet()) {
-		reactionList.add(edge.getReaction());
-	}
-	//init output file
-	try {
-	    BufferedWriter fw = new BufferedWriter(new FileWriter(outputFile,false),8*1024);
-	    fw.write("\tReactionID\tSideCpds\n");
-			//For each reaction, get Reaction Transitions
-			for(BioReaction reaction : reactionList) {
-				Boolean main_transition = true;
-				// String tmpStr = reaction.getId()+"\t";
-				Set<String> tmpSet = new HashSet<String>();
-				for(Entry<Set<BioMetabolite>, Double> transition : getReactionTransitions(g,reaction,true).entrySet()) {
-					//
-					if(transition !=null) {
-						Set<ReactionEdge> EdgesContainer = new LinkedHashSet<ReactionEdge>();
-						//iterate over component edges,add main attribute to g
-						for(BioMetabolite m1 : transition.getKey()) {
-							for(BioMetabolite m2 : transition.getKey()) {
-								ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
-								if((m1!=m2) && (g.containsEdge(tmp_redge))) {
-									// annotate edge
-									EdgesContainer.add(tmp_redge);
-									}
-								}
-							}
-						if(main_transition) {
-							main_transition = false;
-						}else {
-							for(ReactionEdge edge : EdgesContainer) {
-								tmpSet.add(edge.getV1().getId());
-								tmpSet.add(edge.getV2().getId());
-							}
-							if (tmpSet.size()>0) {
-								for(String metId : tmpSet) {
-									if (metId.length()>1) {
-										fw.write(reaction.getId()+"\t"+metId+"\n");
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			// System.out.println("Total number of reactions = "+reactionList.size());
-			fw.close();
-	}catch (IOException e) {
-		e.printStackTrace();
-		}
-}
 }
-- 
GitLab


From da7f9e4b06a82049f4cd3d1835510f31a7adf912 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Mon, 1 Aug 2022 15:36:08 +0200
Subject: [PATCH 15/25] replace SizeComparator class by a lambda expression

---
 .../met4j_core/utils/SizeComparator.java      | 53 -------------------
 .../computation/analyze/GraphMeasure.java     | 18 ++++---
 2 files changed, 10 insertions(+), 61 deletions(-)
 delete mode 100644 met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java

diff --git a/met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java b/met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java
deleted file mode 100644
index 736b5eeec..000000000
--- a/met4j-core/src/main/java/fr/inrae/toulouse/metexplore/met4j_core/utils/SizeComparator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright INRAE (2021)
- *
- * contact-metexplore@inrae.fr
- *
- * This software is a computer program whose purpose is to [describe
- * functionalities and technical features of your software].
- *
- * This software is governed by the CeCILL license under French law and
- * abiding by the rules of distribution of free software.  You can  use,
- * modify and/ or redistribute the software under the terms of the CeCILL
- * license as circulated by CEA, CNRS and INRIA at the following URL
- * "https://cecill.info/licences/Licence_CeCILL_V2.1-en.html".
- *
- * As a counterpart to the access to the source code and  rights to copy,
- * modify and redistribute granted by the license, users are provided only
- * with a limited warranty  and the software's author,  the holder of the
- * economic rights,  and the successive licensors  have only  limited
- * liability.
- *
- * In this respect, the user's attention is drawn to the risks associated
- * with loading,  using,  modifying and/or developing or reproducing the
- * software by the user in light of its specific status of free software,
- * that may mean  that it is complicated to manipulate,  and  that  also
- * therefore means  that it is reserved for developers  and  experienced
- * professionals having in-depth computer knowledge. Users are therefore
- * encouraged to load and test the software's suitability as regards their
- * requirements in conditions enabling the security of their systems and/or
- * data to be ensured and,  more generally, to use and operate it in the
- * same conditions as regards security.
- *
- * The fact that you are presently reading this means that you have had
- * knowledge of the CeCILL license and that you accept its terms.
- *
- */
-
-package fr.inrae.toulouse.metexplore.met4j_core.utils;
-
-import java.util.Set;
-import java.util.Comparator;
-import java.lang.Integer;
-public class SizeComparator implements Comparator<Set<?>> {
-	@Override
-	/**
-	*
-	* @param s1, the first {@link java.util.Set} object
-	* @param s2, the second {@link java.util.Set} object
-	*/
-	public int compare(Set<?> s1, Set<?> s2) {
-		//return Integer.valueOf(s1.size()).compareTo(s2.size());
-		return Integer.valueOf(s2.size()).compareTo(s1.size());
-	}
-	}
\ No newline at end of file
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index 3396dccb1..c737577ed 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -36,14 +36,12 @@
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze;
 
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.FloydWarshall;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.centrality.PathBasedCentrality;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
-import fr.inrae.toulouse.metexplore.met4j_core.utils.SizeComparator;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.jgrapht.alg.connectivity.ConnectivityInspector;
 
@@ -51,8 +49,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.stream.Collectors;
+import java.util.Comparator;
 
 /**
  * compute several measures of the level or connectivity, size or shape of a given graph using lazy builder to avoid redundant calculus
@@ -121,25 +119,29 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	public static <V extends BioEntity, E extends Edge<V>> Set<V> getConnectedSetOf(BioGraph<V,E> g, V t){
 		return new ConnectivityInspector<>(g).connectedSetOf(t);
 	}
+
 	/**
-	 * Get a set of all vertices that are in the maximally connected component together with the specified vertex.
+	 * Get the position of the component (ordered by size) for a given vertex
 	 * @param <V> vertex class
 	 * @param <E> edge class
 	 *
 	 * @param g the graph
 	 * @param t the target vertex
-	 * @return the set of all vertices maximally connected to the target vertex
+	 * @return the component containing the vertex and output component ranking in the console.
 	 */
 	public static <V extends BioEntity, E extends Edge<V>> Set<V> isPartofNComponent(BioGraph<V,E> g, V t){
 		//init connectivity inspector
 		ConnectivityInspector CI  = new ConnectivityInspector<>(g);
 		//Sort the list of components by size
 		List<Set<V>> components = CI.connectedSets();
-		Collections.sort(components,new SizeComparator());
+		//sort with lambdafunction
+		Comparator<Set<V>> reversedComparator = (s1,s2) -> Integer.valueOf(s2.size()).compareTo(s1.size());
+		List<Set<V>> componentsReverseOrder = components.stream().sorted(reversedComparator).collect(Collectors.toList());
+		// Collections.sort(components,Comparator.reverseOrder());
 		//Get the set of all vertices maximally connected to the target vertex
 		Set<V> SetOfT = CI.connectedSetOf(t);
 		int counter = 0;
-		for(Set s:components){
+		for(Set s:componentsReverseOrder){
 			counter++;
 			if (s.containsAll(SetOfT)){
 				if (counter == 1){
-- 
GitLab


From e51a78780afc937806471fae4592a3a4a4527414 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Mon, 1 Aug 2022 15:36:38 +0200
Subject: [PATCH 16/25] remove the reaction-wise side compounds feature

---
 .../met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java
index 07e3c52c1..f4e3e9074 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/CarbonSkeletonNet.java
@@ -69,9 +69,6 @@ public class CarbonSkeletonNet extends AbstractMet4jApplication {
     @Option(name = "-tp", aliases = {"--transitionproba"}, usage = "set transition probability as weight", required = false)
     public boolean computeWeight = false;
 
-    @Option(name = "-rsc", aliases = {"--reactionSC"}, usage = "Compute side compounds for each reaction", required = false)
-    public boolean reactionSC = false;
-
     @Option(name = "-am", aliases = {"--asmatrix"}, usage = "export as matrix (implies simple graph conversion). Default export as GML file", required = false)
     public boolean asMatrix = false;
 
@@ -171,12 +168,6 @@ public class CarbonSkeletonNet extends AbstractMet4jApplication {
             System.out.println(" Done.");
         }
 
-        //output reactions side compounds
-        if (reactionSC){
-            System.out.print("Compute reaction wise side-compounds..");
-            GraphOperation.getTransitions(graph,StringUtils.substringBefore(outputPath,".")+"reactions_side_cpds.txt");
-        }
-
         //merge parallel edges
         if (mergeEdges) {
             System.out.print("Merging edges...");
-- 
GitLab


From 80b9f290786c71cac50d19243c8db3fa5c3a4581 Mon Sep 17 00:00:00 2001
From: LouisonF <fresnaislouison@gmail.com>
Date: Mon, 1 Aug 2022 15:37:13 +0200
Subject: [PATCH 17/25] remove many unused imports in GraphOperation

---
 .../computation/transform/GraphOperation.java | 21 -------------------
 1 file changed, 21 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
index b1af55d31..be5c8da30 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/transform/GraphOperation.java
@@ -35,31 +35,10 @@
  */
 package fr.inrae.toulouse.metexplore.met4j_graph.computation.transform;
 
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.ShortestPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.BioPath;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.CompoundEdge;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.reaction.ReactionGraph;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphLocalMeasure;
-import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
-
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-
-import java.io.FileWriter;
-import java.io.BufferedWriter;
-import java.io.IOException;
-
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReactant;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection;
 
 /**
  * Provide static method to compute some basic set operation on graph such as union or interesct.
-- 
GitLab


From d0df52f22d84c4cf8c2d22be7766997cfd5d6edb Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 25 Aug 2022 15:08:27 +0200
Subject: [PATCH 18/25] Optimization (?) makes wp looping on edges and check
 source/target rather than multiple map lookup.

Get rid of score map, get directly 'best' component. However, downside is that the component extractor is called multiple times for the same reactions, which might (should) be improved.
---
 .../connect/weighting/RPAIRSlikePolicy.java   | 88 ++++++-------------
 1 file changed, 29 insertions(+), 59 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index 15708d973..54f01bdc7 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -5,17 +5,16 @@ import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReactant;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
-import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphFilter;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 
-import java.io.BufferedWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdge, CompoundGraph> {
 
@@ -38,44 +37,18 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
     @Override
     public void setWeight(CompoundGraph compoundGraph) {
         preprocess.setWeight(compoundGraph);
-        for(BioReaction reaction : compoundGraph.getBiochemicalReactionList().values()){
-            //Get Reaction subgraph
-            Boolean main_transition = true;
-            for(Map.Entry<Set<BioMetabolite>, Double> transition : rankReactionTransitions(compoundGraph,getReactionSubGraph(compoundGraph, reaction)).entrySet()) {
-                //
-                if (transition != null) {
-                    if (main_transition) {
-                        //iterate over component edges,add main attribute to g
-                        for (BioMetabolite m1 : transition.getKey()) {
-                            for (BioMetabolite m2 : transition.getKey()) {
-                                if (m1 != m2) {
-                                    ReactionEdge r = compoundGraph.getEdge(m1, m2, reaction);
-                                    if ((r != null)) {
-                                        compoundGraph.setEdgeWeight(r,mainValue);
-                                    }
-                                }
-                            }
-                        }
-                        main_transition = false;
-                    } else {
-                        for (BioMetabolite m1 : transition.getKey()) {
-                            for (BioMetabolite m2 : transition.getKey()) {
-                                if (m1 != m2) {
-                                    ReactionEdge r = compoundGraph.getEdge(m1, m2, reaction);
-                                    if ((r != null)) {
-                                        if(removeSide){
-                                            compoundGraph.removeEdge(r);
-                                        }else{
-                                            compoundGraph.setEdgeWeight(r,sideValue);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
+        for(ReactionEdge e : compoundGraph.edgeSet()){
+            Set<BioMetabolite> mainCC = getMainComponent(compoundGraph,e.getReaction());
+            if(mainCC.contains(e.getV1()) && mainCC.contains(e.getV2())){
+                compoundGraph.setEdgeWeight(e,mainValue);
+            }else{
+                compoundGraph.setEdgeWeight(e,sideValue);
             }
         }
+        if(removeSide){
+            GraphFilter.weightFilter(compoundGraph,sideValue,GraphFilter.EQUALITY);
+            compoundGraph.removeIsolatedNodes();
+        }
     }
 
     /**
@@ -106,29 +79,26 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
     }
 
     /**
-     * Compute the transition score for each connex component of a reaction subgraph
+     * Compute the highest scored connected component of a reaction subgraph
      *
      * @param g the cpd graph skeleton network
-     * @param rSubGraph the reaction subgraph
-     * @return the transitionScore
+     * @param reaction the reaction
+     * @return a set of compounds in the best connected component
      */
-    public Map<Set<BioMetabolite>,Double> rankReactionTransitions(CompoundGraph g, CompoundGraph rSubGraph){
-        Map<Set<BioMetabolite>, Double> reactionTransitions = new HashMap<Set<BioMetabolite>, Double>();
-
-       //Compute connex components
-        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(rSubGraph);
+    public Set<BioMetabolite> getMainComponent(CompoundGraph g, BioReaction reaction){
+       //Compute connected components
+        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(getReactionSubGraph(g,reaction));
+        Double bestScore = 0.0;
+        Set<BioMetabolite> mainCC = null;
         for(Set<BioMetabolite> component : cc) {
             HashMap<String,Double> comp_stat = (getNumberParallelEdgesOfComponent(g,component));
-            reactionTransitions.put(component, comp_stat.get("N_edges")/comp_stat.get("N_pedges"));
+            Double score = comp_stat.get("N_edges")/comp_stat.get("N_pedges");
+            if(score>bestScore){
+                bestScore = score;
+                mainCC = component;
+            }
         }
-
-        //sort in descending order
-        Map<Set<BioMetabolite>,Double> reactionTransitionsSorted =
-                reactionTransitions.entrySet().stream()
-                        .sorted(Map.Entry.<Set<BioMetabolite>,Double>comparingByValue().reversed())
-                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
-                                (e1, e2) -> e1, LinkedHashMap::new));
-        return reactionTransitionsSorted;
+        return mainCC;
     }
 
     /**
-- 
GitLab


From 0c2d16ff05aa9fbbe3044361ba720a7383d68fb0 Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 25 Aug 2022 15:34:34 +0200
Subject: [PATCH 19/25] fix bug for inconsistant reaction annotation

If a compound graph has reactions annotated on edges that have reactant/products that do not match the graph topology -> this cause the cc to not being a subgraph of the original graph
---
 .../connect/weighting/RPAIRSlikePolicy.java      | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index 54f01bdc7..f0a5dea29 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -62,18 +62,10 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
         //Create graph for the reaction
         CompoundGraph rSubGraph = new CompoundGraph();
         //Create all possible edges between left and right reactants
-        for (BioReactant lr : reaction.getLeftReactantsView()) {
-            for (BioReactant rr : reaction.getRightReactantsView()) {
-                if (lr != rr) {
-                    //create edge if exist in g (to avoid side transitions already filtered in the CSN)
-                    ReactionEdge tmp_edge = new ReactionEdge(lr.getMetabolite(), rr.getMetabolite(), reaction);
-                    if (g.containsEdge(tmp_edge)) {
-                        rSubGraph.addVertex(lr.getMetabolite());
-                        rSubGraph.addVertex(rr.getMetabolite());
-                        rSubGraph.addEdge(tmp_edge);
-                    }
-                }
-            }
+        for(ReactionEdge e : g.getEdgesFromReaction(reaction.getId())){
+            rSubGraph.addVertex(e.getV1());
+            rSubGraph.addVertex(e.getV2());
+            rSubGraph.addEdge(e);
         }
         return rSubGraph;
     }
-- 
GitLab


From 4b2c692527158879e09913db4d1c08d97c386075 Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 25 Aug 2022 15:35:11 +0200
Subject: [PATCH 20/25] add unit test for RPAIRSlike

---
 .../met4j_graph/TestRPAIRSlikePolicy.java     | 185 ++++++++++++++++++
 1 file changed, 185 insertions(+)
 create mode 100644 met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java

diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
new file mode 100644
index 000000000..f8950a912
--- /dev/null
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
@@ -0,0 +1,185 @@
+package fr.inrae.toulouse.metexplore.met4j_graph;
+
+import fr.inrae.toulouse.metexplore.met4j_chemUtils.chemicalSimilarity.FingerprintBuilder;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
+import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.AtomMappingWeightPolicy;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.DefaultWeightPolicy;
+import fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting.RPAIRSlikePolicy;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openscience.cdk.exception.CDKException;
+import org.openscience.cdk.similarity.Tanimoto;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class TestRPAIRSlikePolicy {
+
+    public static CompoundGraph g;
+
+    public static BioMetabolite m1sm,m1ss,m1ps,m1pm;
+    public static BioMetabolite m2sm1,m2sm2,m2ss,m2pm,m2ps1,m2ps2;
+    public static Map<BioMetabolite, Map<BioMetabolite,Integer>> aam;
+    public static ReactionEdge t1m,t1s1,t1sp1,t1sp2;
+    public static ReactionEdge t2sp1,t2sp2,t2sp3,t2sp4,t2sp5,t2sp6,t2s1,t2m1,t2m2;
+
+    public static BioReaction r1,r2;
+
+    @BeforeClass
+    public static void init(){
+        //create graph
+        g = new CompoundGraph();
+
+        //create reaction 1
+        r1 = new BioReaction("1");
+        aam = new HashMap<BioMetabolite, Map<BioMetabolite,Integer>>();
+        //add substrate metabolites
+        m1sm = new BioMetabolite("glucose","glucose");
+            g.addVertex(m1sm);
+            aam.put(m1sm,new HashMap<>());
+        m1ss = new BioMetabolite("atp","atp");
+            g.addVertex(m1ss);
+            aam.put(m1ss,new HashMap<>());
+        //add product metabolites
+        m1ps = new BioMetabolite("adp","adp");
+            g.addVertex(m1ps);
+        m1pm = new BioMetabolite("glucose6p","glucose-6-P");
+            g.addVertex(m1pm);
+        //add edges
+            //main
+        t1m = new ReactionEdge(m1sm,m1pm,r1);
+            g.addEdge(m1sm,m1pm,t1m);
+            aam.get(m1sm).put(m1pm,6);
+            //side
+        t1s1 = new ReactionEdge(m1ss,m1ps,r1);
+            g.addEdge(m1ss,m1ps,t1s1);
+            aam.get(m1ss).put(m1ps,10);
+            //spurious
+        t1sp1 = new ReactionEdge(m1sm,m1ps,r1);
+            g.addEdge(m1sm,m1ps,t1sp1);
+            aam.get(m1sm).put(m1ps,0);
+        t1sp2 = new ReactionEdge(m1ss,m1pm,r1);
+            g.addEdge(m1ss,m1pm,t1sp2);
+            aam.get(m1ss).put(m1pm,0);
+
+        //create reaction 2
+        r2 = new BioReaction("2");
+        //add substrate metabolites
+        m2sm1 = new BioMetabolite("propanoate","propanoate");
+            g.addVertex(m2sm1);
+            aam.put(m2sm1,new HashMap<>());
+        m2sm2 = new BioMetabolite("coa","coa");
+            g.addVertex(m2sm2);
+            aam.put(m2sm2,new HashMap<>());
+        m2ss = m1ss;
+            aam.put(m2ss,new HashMap<>());
+        //add product metabolites
+        m2pm = new BioMetabolite("propanoylcoa","propanoyl-COA");
+            g.addVertex(m2pm);
+        m2ps1 = new BioMetabolite("pi","pi");
+            g.addVertex(m2ps1);
+        m2ps2 = m1ps;
+        //add edges
+            //main
+        t2m1 = new ReactionEdge(m2sm1,m2pm,r2);
+            g.addEdge(m2sm1,m2pm,t2m1);
+            aam.get(m2sm1).put(m2pm,3);
+        t2m2 = new ReactionEdge(m2sm2,m2pm,r2);
+            g.addEdge(m2sm2,m2pm,t2m2);
+            aam.get(m2sm2).put(m2pm,21);
+            //side
+        t2s1 = new ReactionEdge(m2ss,m2ps2,r2);
+        g.addEdge(m2ss,m2ps2,t2s1);
+        aam.get(m2ss).put(m2ps2,10);
+            //spurious
+        t2sp1 = new ReactionEdge(m2sm1,m2ps1,r2);
+            g.addEdge(m2sm1,m2ps1,t2sp1);
+            aam.get(m2sm1).put(m2ps1,0);
+        t2sp2 = new ReactionEdge(m2sm1,m2ps2,r2);
+            g.addEdge(m2sm1,m2ps2,t2sp2);
+            aam.get(m2sm1).put(m2ps2,0);
+        t2sp3 = new ReactionEdge(m2sm2,m2ps1,r2);
+            g.addEdge(m2sm2,m2ps1,t2sp3);
+            aam.get(m2sm2).put(m2ps1,0);
+        t2sp4 = new ReactionEdge(m2sm2,m2ps2,r2);
+            g.addEdge(m2sm2,m2ps2,t2sp4);
+            aam.get(m2sm2).put(m2ps2,0);
+        t2sp5 = new ReactionEdge(m2ss,m2pm,r2);
+            g.addEdge(m2ss,m2pm,t2sp5);
+            aam.get(m2ss).put(m2pm,0);
+        t2sp6 = new ReactionEdge(m2ss,m2ps1,r2);
+            g.addEdge(m2ss,m2ps1,t2sp6);
+            aam.get(m2ss).put(m2ps1,0);
+    }
+
+    /**
+     * Reset weight.
+     */
+    @After
+    public void resetWeight(){
+        for(ReactionEdge e : g.edgeSet()){
+            g.setEdgeWeight(e, 0.0);
+        }
+    }
+
+    @Test
+    public void testRPAIRSlikeWeightPolicy() {
+        AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
+        RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess);
+        wp.setWeight(g);
+
+        assertEquals(1.0,g.getEdgeWeight(t1m),Double.MIN_VALUE);
+        assertEquals(1.0,g.getEdgeWeight(t2m1),Double.MIN_VALUE);
+        assertEquals(1.0,g.getEdgeWeight(t2m2),Double.MIN_VALUE);
+
+        assertEquals(-1.0,g.getEdgeWeight(t1s1),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2s1),Double.MIN_VALUE);
+
+        assertTrue(!g.containsEdge(t1sp1));
+        assertTrue(!g.containsEdge(t1sp2));
+        assertTrue(!g.containsEdge(t2sp1));
+        assertTrue(!g.containsEdge(t2sp2));
+        assertTrue(!g.containsEdge(t2sp3));
+        assertTrue(!g.containsEdge(t2sp4));
+        assertTrue(!g.containsEdge(t2sp5));
+        assertTrue(!g.containsEdge(t2sp6));
+
+    }
+
+    @Test
+    public void testGetMainComponent() {
+        AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
+        RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess);
+        Set<BioMetabolite> cc = wp.getMainComponent(g,r1);
+        assertTrue(cc.contains(m1sm));
+        assertTrue(cc.contains(m1pm));
+
+        Set<BioMetabolite> cc2 = wp.getMainComponent(g,r2);
+        assertTrue(cc2.contains(m2sm1));
+        assertTrue(cc2.contains(m2sm2));
+        assertTrue(cc2.contains(m2pm));
+    }
+
+    @Test
+    public void testGetReactionSubGraph() {
+        AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
+        RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess);
+        CompoundGraph gr1 = wp.getReactionSubGraph(g,r1);
+        assertEquals(4, gr1.vertexSet().size());
+        assertEquals(4, gr1.edgeSet().size());
+
+        CompoundGraph gr2 = wp.getReactionSubGraph(g,r2);
+        assertEquals(6, gr2.vertexSet().size());
+        assertEquals(9, gr2.edgeSet().size());
+    }
+
+}
\ No newline at end of file
-- 
GitLab


From e9d7d42c8ac020a16ac76516982e5d0a7b5d55d9 Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 1 Sep 2022 17:31:16 +0200
Subject: [PATCH 21/25] Allows to keep 'spurious' edges

keep track of edges that are usually removed when creating CSN, i.e. edges with no carbon mapped
---
 .../connect/weighting/RPAIRSlikePolicy.java   | 63 +++++++++++----
 .../met4j_graph/TestRPAIRSlikePolicy.java     | 77 ++++++++++++++++---
 2 files changed, 115 insertions(+), 25 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index f0a5dea29..dd3bacf9a 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -11,44 +11,70 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdge, CompoundGraph> {
 
     AtomMappingWeightPolicy preprocess;
     Double mainValue = 1.0;
-    Double sideValue = -1.0;
+    Double sideValue = 0.0;
+
+    Double spuriousValue = -1.0;
     Boolean removeSide = false;
+    Boolean removeSpurious = false;
 
     public RPAIRSlikePolicy(AtomMappingWeightPolicy aam){
-        preprocess=aam.removeEdgeWithoutMapping()
-                .removeEdgesWithoutConservedCarbon()
-                .binarize();
+        preprocess=aam.binarize();
+        preprocess.removeNoCC=false;
+        preprocess.removeNotFound=false;
     }
 
-    public RPAIRSlikePolicy removeSideTransition(){
+    public RPAIRSlikePolicy removeSideTransitions(){
         removeSide=true;
+        removeSpurious=true;
+        return this;
+    }
+
+    public RPAIRSlikePolicy removeSpuriousTransitions(){
+        removeSpurious=true;
         return this;
     }
 
     @Override
     public void setWeight(CompoundGraph compoundGraph) {
         preprocess.setWeight(compoundGraph);
+        Set<ReactionEdge> spuriousEdges = new HashSet<>();
+        Set<ReactionEdge> validEdges = new HashSet<>();
+
+        //spurious edges are not directly tagged but stored in first step, to avoid conflict if spuriousValue match with some AtomMappingWeightPolicy weights
         for(ReactionEdge e : compoundGraph.edgeSet()){
-            Set<BioMetabolite> mainCC = getMainComponent(compoundGraph,e.getReaction());
+            if(Double.isNaN(compoundGraph.getEdgeWeight(e)) || compoundGraph.getEdgeWeight(e)==0.0){
+                spuriousEdges.add(e);
+            }else {
+                validEdges.add(e);
+            }
+        }
+
+        for(ReactionEdge e : validEdges){
+            Set<BioMetabolite> mainCC = getMainComponent(compoundGraph,e.getReaction(), spuriousEdges);
             if(mainCC.contains(e.getV1()) && mainCC.contains(e.getV2())){
                 compoundGraph.setEdgeWeight(e,mainValue);
             }else{
                 compoundGraph.setEdgeWeight(e,sideValue);
             }
         }
+
         if(removeSide){
             GraphFilter.weightFilter(compoundGraph,sideValue,GraphFilter.EQUALITY);
-            compoundGraph.removeIsolatedNodes();
         }
+        if(removeSpurious){
+           compoundGraph.removeAllEdges(spuriousEdges);
+        }else{
+            for(ReactionEdge e : spuriousEdges){
+                compoundGraph.setEdgeWeight(e,spuriousValue);
+            }
+        }
+        if(removeSpurious || removeSide) compoundGraph.removeIsolatedNodes();
     }
 
     /**
@@ -77,9 +103,18 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
      * @param reaction the reaction
      * @return a set of compounds in the best connected component
      */
-    public Set<BioMetabolite> getMainComponent(CompoundGraph g, BioReaction reaction){
-       //Compute connected components
-        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(getReactionSubGraph(g,reaction));
+    public Set<BioMetabolite> getMainComponent(CompoundGraph g, BioReaction reaction, Set<ReactionEdge> spuriousEdges){
+        //Compute reaction subgraph
+        CompoundGraph rG = getReactionSubGraph(g,reaction);
+
+        //remove spurious edges
+        Set<ReactionEdge> edgesToRemove = new HashSet<>(rG.edgeSet());
+        edgesToRemove.retainAll(spuriousEdges);
+        rG.removeAllEdges(edgesToRemove);
+        if(rG.edgeSet().size()==0) return new HashSet<>();
+
+        //Compute connected components
+        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(rG);
         Double bestScore = 0.0;
         Set<BioMetabolite> mainCC = null;
         for(Set<BioMetabolite> component : cc) {
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
index f8950a912..e3935151b 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
@@ -16,6 +16,7 @@ import org.openscience.cdk.exception.CDKException;
 import org.openscience.cdk.similarity.Tanimoto;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -70,7 +71,6 @@ public class TestRPAIRSlikePolicy {
         t1sp2 = new ReactionEdge(m1ss,m1pm,r1);
             g.addEdge(m1ss,m1pm,t1sp2);
             aam.get(m1ss).put(m1pm,0);
-
         //create reaction 2
         r2 = new BioReaction("2");
         //add substrate metabolites
@@ -81,7 +81,6 @@ public class TestRPAIRSlikePolicy {
             g.addVertex(m2sm2);
             aam.put(m2sm2,new HashMap<>());
         m2ss = m1ss;
-            aam.put(m2ss,new HashMap<>());
         //add product metabolites
         m2pm = new BioMetabolite("propanoylcoa","propanoyl-COA");
             g.addVertex(m2pm);
@@ -98,8 +97,8 @@ public class TestRPAIRSlikePolicy {
             aam.get(m2sm2).put(m2pm,21);
             //side
         t2s1 = new ReactionEdge(m2ss,m2ps2,r2);
-        g.addEdge(m2ss,m2ps2,t2s1);
-        aam.get(m2ss).put(m2ps2,10);
+            g.addEdge(m2ss,m2ps2,t2s1);
+            aam.get(m2ss).put(m2ps2,10);
             //spurious
         t2sp1 = new ReactionEdge(m2sm1,m2ps1,r2);
             g.addEdge(m2sm1,m2ps1,t2sp1);
@@ -126,13 +125,35 @@ public class TestRPAIRSlikePolicy {
      */
     @After
     public void resetWeight(){
-        for(ReactionEdge e : g.edgeSet()){
-            g.setEdgeWeight(e, 0.0);
-        }
+        init();
     }
 
     @Test
     public void testRPAIRSlikeWeightPolicy() {
+        AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
+        RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess).removeSpuriousTransitions();
+        wp.setWeight(g);
+
+        assertEquals(1.0,g.getEdgeWeight(t1m),Double.MIN_VALUE);
+        assertEquals(1.0,g.getEdgeWeight(t2m1),Double.MIN_VALUE);
+        assertEquals(1.0,g.getEdgeWeight(t2m2),Double.MIN_VALUE);
+
+        assertEquals(0.0,g.getEdgeWeight(t1s1),Double.MIN_VALUE);
+        assertEquals(0.0,g.getEdgeWeight(t2s1),Double.MIN_VALUE);
+
+        assertTrue(!g.containsEdge(t1sp1));
+        assertTrue(!g.containsEdge(t1sp2));
+        assertTrue(!g.containsEdge(t2sp1));
+        assertTrue(!g.containsEdge(t2sp2));
+        assertTrue(!g.containsEdge(t2sp3));
+        assertTrue(!g.containsEdge(t2sp4));
+        assertTrue(!g.containsEdge(t2sp5));
+        assertTrue(!g.containsEdge(t2sp6));
+
+    }
+
+    @Test
+    public void testRPAIRSlikeWeightPolicyII() {
         AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
         RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess);
         wp.setWeight(g);
@@ -141,8 +162,32 @@ public class TestRPAIRSlikePolicy {
         assertEquals(1.0,g.getEdgeWeight(t2m1),Double.MIN_VALUE);
         assertEquals(1.0,g.getEdgeWeight(t2m2),Double.MIN_VALUE);
 
-        assertEquals(-1.0,g.getEdgeWeight(t1s1),Double.MIN_VALUE);
-        assertEquals(-1.0,g.getEdgeWeight(t2s1),Double.MIN_VALUE);
+        assertEquals(0.0,g.getEdgeWeight(t1s1),Double.MIN_VALUE);
+        assertEquals(0.0,g.getEdgeWeight(t2s1),Double.MIN_VALUE);
+
+        assertEquals(-1.0,g.getEdgeWeight(t1sp1),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t1sp2),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2sp1),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2sp2),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2sp3),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2sp4),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2sp5),Double.MIN_VALUE);
+        assertEquals(-1.0,g.getEdgeWeight(t2sp6),Double.MIN_VALUE);
+
+    }
+
+    @Test
+    public void testRPAIRSlikeWeightPolicyIII() {
+        AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
+        RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess).removeSideTransitions();
+        wp.setWeight(g);
+
+        assertEquals(1.0,g.getEdgeWeight(t1m),Double.MIN_VALUE);
+        assertEquals(1.0,g.getEdgeWeight(t2m1),Double.MIN_VALUE);
+        assertEquals(1.0,g.getEdgeWeight(t2m2),Double.MIN_VALUE);
+
+        assertTrue(!g.containsEdge(t1s1));
+        assertTrue(!g.containsEdge(t2s1));
 
         assertTrue(!g.containsEdge(t1sp1));
         assertTrue(!g.containsEdge(t1sp2));
@@ -159,11 +204,21 @@ public class TestRPAIRSlikePolicy {
     public void testGetMainComponent() {
         AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
         RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess);
-        Set<BioMetabolite> cc = wp.getMainComponent(g,r1);
+        Set<ReactionEdge> spuriousEdges = new HashSet<>();
+        spuriousEdges.add(t1sp1);
+        spuriousEdges.add(t1sp2);
+        spuriousEdges.add(t2sp1);
+        spuriousEdges.add(t2sp2);
+        spuriousEdges.add(t2sp3);
+        spuriousEdges.add(t2sp4);
+        spuriousEdges.add(t2sp5);
+        spuriousEdges.add(t2sp6);
+
+        Set<BioMetabolite> cc = wp.getMainComponent(g,r1, spuriousEdges);
         assertTrue(cc.contains(m1sm));
         assertTrue(cc.contains(m1pm));
 
-        Set<BioMetabolite> cc2 = wp.getMainComponent(g,r2);
+        Set<BioMetabolite> cc2 = wp.getMainComponent(g,r2, spuriousEdges);
         assertTrue(cc2.contains(m2sm1));
         assertTrue(cc2.contains(m2sm2));
         assertTrue(cc2.contains(m2pm));
-- 
GitLab


From abb2f62e623c79b9b14811524c715780ce80267a Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 15 Sep 2022 16:48:21 +0200
Subject: [PATCH 22/25] move extract reaction subgraph as compoundGraph
 function

---
 .../connect/weighting/RPAIRSlikePolicy.java   | 21 +------------------
 .../core/compound/CompoundGraph.java          | 18 ++++++++++++++++
 .../met4j_graph/TestCompoundGraph.java        | 16 ++++++++++++++
 .../met4j_graph/TestRPAIRSlikePolicy.java     | 13 ------------
 4 files changed, 35 insertions(+), 33 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index dd3bacf9a..83bbfcecf 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -77,25 +77,6 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
         if(removeSpurious || removeSide) compoundGraph.removeIsolatedNodes();
     }
 
-    /**
-     * Compute the reaction subgraph
-     *
-     * @param g the cpd graph
-     * @param reaction the reaction to evaluate
-     * @return the reaction subgraph
-     */
-    public CompoundGraph getReactionSubGraph(CompoundGraph g, BioReaction reaction) {
-        //Create graph for the reaction
-        CompoundGraph rSubGraph = new CompoundGraph();
-        //Create all possible edges between left and right reactants
-        for(ReactionEdge e : g.getEdgesFromReaction(reaction.getId())){
-            rSubGraph.addVertex(e.getV1());
-            rSubGraph.addVertex(e.getV2());
-            rSubGraph.addEdge(e);
-        }
-        return rSubGraph;
-    }
-
     /**
      * Compute the highest scored connected component of a reaction subgraph
      *
@@ -105,7 +86,7 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
      */
     public Set<BioMetabolite> getMainComponent(CompoundGraph g, BioReaction reaction, Set<ReactionEdge> spuriousEdges){
         //Compute reaction subgraph
-        CompoundGraph rG = getReactionSubGraph(g,reaction);
+        CompoundGraph rG = g.getReactionSubGraph(reaction);
 
         //remove spurious edges
         Set<ReactionEdge> edgesToRemove = new HashSet<>(rG.edgeSet());
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/CompoundGraph.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/CompoundGraph.java
index 260ef34c8..5ec7f0202 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/CompoundGraph.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/core/compound/CompoundGraph.java
@@ -106,6 +106,24 @@ public class CompoundGraph extends BioGraph<BioMetabolite, ReactionEdge> {
 		}
 		return edgeList;
 	}
+
+	/**
+	 * Compute the reaction subgraph
+	 *
+	 * @param reaction the reaction to evaluate
+	 * @return the reaction subgraph
+	 */
+	public CompoundGraph getReactionSubGraph(BioReaction reaction) {
+		//Create graph for the reaction
+		CompoundGraph rSubGraph = new CompoundGraph();
+		//Create all possible edges between left and right reactants
+		for(ReactionEdge e : this.getEdgesFromReaction(reaction.getId())){
+			rSubGraph.addVertex(e.getV1());
+			rSubGraph.addVertex(e.getV2());
+			rSubGraph.addEdge(e);
+		}
+		return rSubGraph;
+	}
 	
 	/**
 	 * Gets the biochemical reaction list.
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java
index 790f81c4f..d9608c79e 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestCompoundGraph.java
@@ -186,4 +186,20 @@ public class TestCompoundGraph {
 		assertEquals(0,cg.getEdgesFromCompartment(bn, comp2).size());
 		assertTrue(cg.getEdgesFromCompartment(bn, comp).contains(e1));
 	}
+
+
+	@Test
+	public void testGetReactionSubGraph() {
+		CompoundGraph gr1 = cg.getReactionSubGraph(r1);
+		assertEquals(2, gr1.vertexSet().size());
+		assertEquals(1, gr1.edgeSet().size());
+		assertTrue(gr1.containsVertex(v1));
+		assertTrue(gr1.containsVertex(v2));
+
+		CompoundGraph gr2 = cg.getReactionSubGraph(r2);
+		assertEquals(2, gr2.vertexSet().size());
+		assertEquals(1, gr2.edgeSet().size());
+		assertTrue(gr2.containsVertex(v2));
+		assertTrue(gr2.containsVertex(v3));
+	}
 }
diff --git a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
index e3935151b..4a1be9dbb 100644
--- a/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
+++ b/met4j-graph/src/test/java/fr/inrae/toulouse/metexplore/met4j_graph/TestRPAIRSlikePolicy.java
@@ -224,17 +224,4 @@ public class TestRPAIRSlikePolicy {
         assertTrue(cc2.contains(m2pm));
     }
 
-    @Test
-    public void testGetReactionSubGraph() {
-        AtomMappingWeightPolicy preprocess = new AtomMappingWeightPolicy().fromNumberOfConservedCarbons(aam);
-        RPAIRSlikePolicy wp = new RPAIRSlikePolicy(preprocess);
-        CompoundGraph gr1 = wp.getReactionSubGraph(g,r1);
-        assertEquals(4, gr1.vertexSet().size());
-        assertEquals(4, gr1.edgeSet().size());
-
-        CompoundGraph gr2 = wp.getReactionSubGraph(g,r2);
-        assertEquals(6, gr2.vertexSet().size());
-        assertEquals(9, gr2.edgeSet().size());
-    }
-
 }
\ No newline at end of file
-- 
GitLab


From b60134ee6ee8cc3d06c089882030740048693bf2 Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 15 Sep 2022 17:14:57 +0200
Subject: [PATCH 23/25] Directly compute cc score and use cc subgraph + fix
 typo

---
 .../computation/analyze/GraphMeasure.java     |  4 +-
 .../connect/weighting/RPAIRSlikePolicy.java   | 97 ++++---------------
 .../networkAnalysis/NetworkSummary.java       |  3 +-
 3 files changed, 21 insertions(+), 83 deletions(-)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
index c737577ed..e4d2de394 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/analyze/GraphMeasure.java
@@ -103,7 +103,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	 * @param g the graph
 	 * @return the connected component
 	 */
-	public static <V extends BioEntity, E extends Edge<V>> List<Set<V>> getConnectedCompenent(BioGraph<V,E> g){
+	public static <V extends BioEntity, E extends Edge<V>> List<Set<V>> getConnectedComponents(BioGraph<V,E> g){
 		return new ConnectivityInspector<>(g).connectedSets();
 	}
 	/**
@@ -186,7 +186,7 @@ public class GraphMeasure<V extends BioEntity, E extends Edge<V>> {
 	 */
 	public int getNumberOfConnectedComponent(){
 		if(numberOfConnectedComp !=null) return numberOfConnectedComp;
-        numberOfConnectedComp = getConnectedCompenent(g).size();
+        numberOfConnectedComp = getConnectedComponents(g).size();
 		return numberOfConnectedComp;
 	}
 
diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index 83bbfcecf..ce1a8c731 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -2,11 +2,12 @@ package fr.inrae.toulouse.metexplore.met4j_graph.computation.connect.weighting;
 
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioMetabolite;
-import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReactant;
 import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioReaction;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.analyze.GraphMeasure;
 import fr.inrae.toulouse.metexplore.met4j_graph.computation.transform.GraphFilter;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.BioGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.Edge;
+import fr.inrae.toulouse.metexplore.met4j_graph.core.GraphFactory;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.WeightingPolicy;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.CompoundGraph;
 import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
@@ -95,12 +96,13 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
         if(rG.edgeSet().size()==0) return new HashSet<>();
 
         //Compute connected components
-        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(rG);
+        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedComponents(rG);
         Double bestScore = 0.0;
         Set<BioMetabolite> mainCC = null;
+
         for(Set<BioMetabolite> component : cc) {
-            HashMap<String,Double> comp_stat = (getNumberParallelEdgesOfComponent(g,component));
-            Double score = comp_stat.get("N_edges")/comp_stat.get("N_pedges");
+            CompoundGraph ccSubGraph = CompoundGraph.getFactory().createSubGraph(rG,component);
+            Double score = getComponentScore(g,ccSubGraph);
             if(score>bestScore){
                 bestScore = score;
                 mainCC = component;
@@ -114,82 +116,19 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
      * @param <V> vertex class
      * @param <E> edge class
      *
-     * @param g the graph
-     * @param comp the connected component
-     * @return a HashMap with the number of occurences of each edge in the component and in the graph g(called parallel edges)
+     * @param wholeG the complete graph
+     * @param subG the reaction connected component
+     * @return the redundancy score, i.e. estimation of how many other reactions share the same edges as the component
      */
-    public <V extends BioEntity, E extends Edge<V>> HashMap<String,Double> getNumberParallelEdgesOfComponent(CompoundGraph g, Set<BioMetabolite> comp){
-        HashMap<String,Double> out_map = new HashMap<String,Double>();
-        out_map.put("N_edges", 0.0);
-        out_map.put("N_pedges", 0.0);
-        for(BioMetabolite v1 : comp) {
-            for(BioMetabolite v2 : comp) {
-                if((v1 != v2) && (g.containsEdge(v1, v2))) {
-                    out_map.replace("N_edges", out_map.get("N_edges")+1);
-                    //get number of parallel edges
-                    out_map.replace("N_pedges", out_map.get("N_pedges")+g.getAllEdges(v1, v2).size());
-                }
-            }
+    private <V extends BioEntity, E extends Edge<V>> Double getComponentScore(CompoundGraph wholeG, CompoundGraph subG){
+        Double Nedge = Double.valueOf(subG.edgeSet().size());
+        Double NPedge = 0.0;
+        for(ReactionEdge e : subG.edgeSet()){
+            BioMetabolite v1 = e.getV1();
+            BioMetabolite v2 = e.getV2();
+            Integer redundancy = wholeG.getAllEdges(v1,v2).size();
+            NPedge = NPedge + Double.valueOf(redundancy);
         }
-        //Store results in map
-        return out_map;
+        return Nedge/NPedge;
     }
-
-
-
-//    public void getTransitions(CompoundGraph g, String outputFile){
-//        //Init graphLocalMeasure
-//        HashSet<BioReaction> reactionList = new HashSet<BioReaction>();
-//        //First task : find all edges associated to a reaction
-//        //find all reactions in the CSN
-//        for(ReactionEdge edge : g.edgeSet()) {
-//            reactionList.add(edge.getReaction());
-//        }
-//        //init output file
-//        try {
-//            BufferedWriter fw = new BufferedWriter(new FileWriter(outputFile,false),8*1024);
-//            fw.write("\tReactionID\tSideCpds\n");
-//            //For each reaction, get Reaction Transitions
-//            for(BioReaction reaction : reactionList) {
-//                Boolean main_transition = true;
-//                // String tmpStr = reaction.getId()+"\t";
-//                Set<String> tmpSet = new HashSet<String>();
-//                for(Map.Entry<Set<BioMetabolite>, Double> transition : rankReactionTransitions(g,getReactionSubGraph(g, reaction)).entrySet()) {
-//                    //
-//                    if(transition !=null) {
-//                        Set<ReactionEdge> EdgesContainer = new LinkedHashSet<ReactionEdge>();
-//                        //iterate over component edges,add main attribute to g
-//                        for(BioMetabolite m1 : transition.getKey()) {
-//                            for(BioMetabolite m2 : transition.getKey()) {
-//                                ReactionEdge tmp_redge = new ReactionEdge(m1,m2,reaction);
-//                                if((m1!=m2) && (g.containsEdge(tmp_redge))) {
-//                                    // annotate edge
-//                                    EdgesContainer.add(tmp_redge);
-//                                }
-//                            }
-//                        }
-//                        if(main_transition) {
-//                            main_transition = false;
-//                        }else {
-//                            for(ReactionEdge edge : EdgesContainer) {
-//                                tmpSet.add(edge.getV1().getId());
-//                                tmpSet.add(edge.getV2().getId());
-//                            }
-//                            if (tmpSet.size()>0) {
-//                                for(String metId : tmpSet) {
-//                                    if (metId.length()>1) {
-//                                        fw.write(reaction.getId()+"\t"+metId+"\n");
-//                                    }
-//                                }
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-//            // System.out.println("Total number of reactions = "+reactionList.size());
-//            fw.close();
-//        }catch (IOException e) {
-//            e.printStackTrace();
-//        }
-//    }
 }
diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java
index 31784aa8c..342ad6ae3 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java
@@ -18,7 +18,6 @@ import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.JsbmlReader;
 import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.Met4jSbmlReaderException;
 import fr.inrae.toulouse.metexplore.met4j_mathUtils.matrix.BioMatrix;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication;
-import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.EnumFormats;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.Format;
 import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.annotations.ParameterType;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
@@ -120,7 +119,7 @@ public class NetworkSummary extends AbstractMet4jApplication {
 
         //connectivity
         System.err.println("extract connected component...");
-        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(graph);
+        List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedComponents(graph);
         fw.write("Number of connected component:\t" + cc.size() + "\n");
         Map<Integer, Integer> ccSizes = cc.stream().collect(Collectors.groupingBy(Set::size))
                 .entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, (e -> e.getValue().size())));
-- 
GitLab


From 9438251a4f43292f00f11c96a5690bbc75ea6a6c Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Thu, 15 Sep 2022 17:21:56 +0200
Subject: [PATCH 24/25] add Javadoc

---
 .../connect/weighting/RPAIRSlikePolicy.java          | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
index ce1a8c731..269cbcf03 100644
--- a/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
+++ b/met4j-graph/src/main/java/fr/inrae/toulouse/metexplore/met4j_graph/computation/connect/weighting/RPAIRSlikePolicy.java
@@ -14,6 +14,10 @@ import fr.inrae.toulouse.metexplore.met4j_graph.core.compound.ReactionEdge;
 
 import java.util.*;
 
+/**
+ * Weighting policy that mimic RPAIRS's now discontinued tags. Define Main and Side transitions within each reaction.
+ * This 'main' tag also include the RPAIRS 'trans' tag.
+ */
 public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdge, CompoundGraph> {
 
     AtomMappingWeightPolicy preprocess;
@@ -30,12 +34,20 @@ public class RPAIRSlikePolicy extends WeightingPolicy<BioMetabolite, ReactionEdg
         preprocess.removeNotFound=false;
     }
 
+    /**
+     * remove side transitions , estimated from edge redundancy
+     * @return
+     */
     public RPAIRSlikePolicy removeSideTransitions(){
         removeSide=true;
         removeSpurious=true;
         return this;
     }
 
+    /**
+     * remove spurious transitions, which don't appear in the carbon skeleton graph (not involving at least two C)
+     * @return this instance
+     */
     public RPAIRSlikePolicy removeSpuriousTransitions(){
         removeSpurious=true;
         return this;
-- 
GitLab


From ac99c008e4e0d046f6f481a6db20d7eb5b24b5ef Mon Sep 17 00:00:00 2001
From: cfrainay <clement.frainay@inrae.fr>
Date: Fri, 16 Sep 2022 14:13:59 +0200
Subject: [PATCH 25/25] fix typo

---
 .../met4j_toolbox/networkAnalysis/NetworkSummary.java           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java
index af8831d26..0c41e4bf2 100644
--- a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java
+++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/networkAnalysis/NetworkSummary.java
@@ -134,7 +134,7 @@ public class NetworkSummary extends AbstractMet4jApplication {
 
             //connectivity
             System.err.println("extract connected component...");
-            List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedCompenent(graph);
+            List<Set<BioMetabolite>> cc = GraphMeasure.getConnectedComponents(graph);
             fw.write("Number of connected component:\t" + cc.size() + "\n");
             Map<Integer, Integer> ccSizes = cc.stream().collect(Collectors.groupingBy(Set::size))
                     .entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, (e -> e.getValue().size())));
-- 
GitLab