112 lines
5.1 KiB
Java
112 lines
5.1 KiB
Java
import org.jgrapht.graph.DefaultWeightedEdge;
|
|
import org.jgrapht.graph.SimpleWeightedGraph;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
public interface GraphModificationFunctions {
|
|
|
|
//remove over- and under-weight edges
|
|
static List<Integer[]> filterByOverlapThresholds(SimpleWeightedGraph<Integer, DefaultWeightedEdge> graph,
|
|
int low, int high, boolean saveEdges) {
|
|
List<Integer[]> removedEdges = new ArrayList<>();
|
|
for (DefaultWeightedEdge e : graph.edgeSet()) {
|
|
if ((graph.getEdgeWeight(e) > high) || (graph.getEdgeWeight(e) < low)) {
|
|
if(saveEdges) {
|
|
Integer source = graph.getEdgeSource(e);
|
|
Integer target = graph.getEdgeTarget(e);
|
|
Integer weight = (int) graph.getEdgeWeight(e);
|
|
Integer[] edge = {source, target, weight};
|
|
removedEdges.add(edge);
|
|
}
|
|
else {
|
|
graph.setEdgeWeight(e, 0.0);
|
|
}
|
|
}
|
|
}
|
|
if(saveEdges) {
|
|
for (Integer[] edge : removedEdges) {
|
|
graph.removeEdge(edge[0], edge[1]);
|
|
}
|
|
}
|
|
return removedEdges;
|
|
}
|
|
|
|
//Remove edges for pairs with large occupancy discrepancy
|
|
static List<Integer[]> filterByRelativeOccupancy(SimpleWeightedGraph<Integer, DefaultWeightedEdge> graph,
|
|
Map<Integer, Integer> alphaWellCounts,
|
|
Map<Integer, Integer> betaWellCounts,
|
|
Map<Integer, Integer> plateVtoAMap,
|
|
Map<Integer, Integer> plateVtoBMap,
|
|
Integer maxOccupancyDifference, boolean saveEdges) {
|
|
List<Integer[]> removedEdges = new ArrayList<>();
|
|
for (DefaultWeightedEdge e : graph.edgeSet()) {
|
|
Integer alphaOcc = alphaWellCounts.get(plateVtoAMap.get(graph.getEdgeSource(e)));
|
|
Integer betaOcc = betaWellCounts.get(plateVtoBMap.get(graph.getEdgeTarget(e)));
|
|
if (Math.abs(alphaOcc - betaOcc) >= maxOccupancyDifference) {
|
|
if (saveEdges) {
|
|
Integer source = graph.getEdgeSource(e);
|
|
Integer target = graph.getEdgeTarget(e);
|
|
Integer weight = (int) graph.getEdgeWeight(e);
|
|
Integer[] edge = {source, target, weight};
|
|
removedEdges.add(edge);
|
|
}
|
|
else {
|
|
graph.setEdgeWeight(e, 0.0);
|
|
}
|
|
}
|
|
}
|
|
if(saveEdges) {
|
|
for (Integer[] edge : removedEdges) {
|
|
graph.removeEdge(edge[0], edge[1]);
|
|
}
|
|
}
|
|
return removedEdges;
|
|
}
|
|
|
|
//Remove edges for pairs where overlap size is significantly lower than the well occupancy
|
|
static List<Integer[]> filterByOverlapPercent(SimpleWeightedGraph<Integer, DefaultWeightedEdge> graph,
|
|
Map<Integer, Integer> alphaWellCounts,
|
|
Map<Integer, Integer> betaWellCounts,
|
|
Map<Integer, Integer> plateVtoAMap,
|
|
Map<Integer, Integer> plateVtoBMap,
|
|
Integer minOverlapPercent,
|
|
boolean saveEdges) {
|
|
List<Integer[]> removedEdges = new ArrayList<>();
|
|
for (DefaultWeightedEdge e : graph.edgeSet()) {
|
|
Integer alphaOcc = alphaWellCounts.get(plateVtoAMap.get(graph.getEdgeSource(e)));
|
|
Integer betaOcc = betaWellCounts.get(plateVtoBMap.get(graph.getEdgeTarget(e)));
|
|
double weight = graph.getEdgeWeight(e);
|
|
double min = minOverlapPercent / 100.0;
|
|
if ((weight / alphaOcc < min) || (weight / betaOcc < min)) {
|
|
if(saveEdges) {
|
|
Integer source = graph.getEdgeSource(e);
|
|
Integer target = graph.getEdgeTarget(e);
|
|
Integer intWeight = (int) graph.getEdgeWeight(e);
|
|
Integer[] edge = {source, target, intWeight};
|
|
removedEdges.add(edge);
|
|
}
|
|
else {
|
|
graph.setEdgeWeight(e, 0.0);
|
|
}
|
|
}
|
|
}
|
|
if(saveEdges) {
|
|
for (Integer[] edge : removedEdges) {
|
|
graph.removeEdge(edge[0], edge[1]);
|
|
}
|
|
}
|
|
return removedEdges;
|
|
}
|
|
|
|
static void addRemovedEdges(SimpleWeightedGraph<Integer, DefaultWeightedEdge> graph,
|
|
List<Integer[]> removedEdges) {
|
|
for (Integer[] edge : removedEdges) {
|
|
DefaultWeightedEdge e = graph.addEdge(edge[0], edge[1]);
|
|
graph.setEdgeWeight(e, (double) edge[2]);
|
|
}
|
|
}
|
|
|
|
}
|