Added heap type selection, fixed error handling

This commit is contained in:
2022-02-24 14:48:19 -06:00
parent 2829b88689
commit 8edd89d784
4 changed files with 70 additions and 8 deletions

View File

@@ -39,7 +39,7 @@ in practice.
[Download the current version of BiGpairSEQ_Sim.](https://gitea.ejsf.synology.me/efischer/BiGpairSEQ/releases) [Download the current version of BiGpairSEQ_Sim.](https://gitea.ejsf.synology.me/efischer/BiGpairSEQ/releases)
BiGpairSEQ_Sim is an executable .jar file. Requires Java 11 or higher. [OpenJDK 17](https://jdk.java.net/17/) BiGpairSEQ_Sim is an executable .jar file. Requires Java 14 or higher. [OpenJDK 17](https://jdk.java.net/17/)
recommended. recommended.
Run with the command: Run with the command:

View File

@@ -13,6 +13,7 @@ public class BiGpairSEQ {
private static boolean cacheCells = false; private static boolean cacheCells = false;
private static boolean cachePlate = false; private static boolean cachePlate = false;
private static boolean cacheGraph = true; private static boolean cacheGraph = true;
private static String priorityQueueHeapType = "PAIRING";
public static void main(String[] args) { public static void main(String[] args) {
if (args.length == 0) { if (args.length == 0) {
@@ -151,4 +152,16 @@ public class BiGpairSEQ {
} }
BiGpairSEQ.cacheGraph = cacheGraph; BiGpairSEQ.cacheGraph = cacheGraph;
} }
public static String getPriorityQueueHeapType() {
return priorityQueueHeapType;
}
public static void setPairingHeap() {
priorityQueueHeapType = "PAIRING";
}
public static void setFibonacciHeap() {
priorityQueueHeapType = "FIBONACCI";
}
} }

View File

@@ -38,10 +38,10 @@ public class InteractiveInterface {
case 3 -> makeCDR3Graph(); case 3 -> makeCDR3Graph();
case 4 -> matchCDR3s(); case 4 -> matchCDR3s();
//case 6 -> matchCellsCDR1(); //case 6 -> matchCellsCDR1();
case 8 -> options(); case 8 -> mainOptions();
case 9 -> acknowledge(); case 9 -> acknowledge();
case 0 -> quit = true; case 0 -> quit = true;
default -> throw new InputMismatchException("Invalid input."); default -> System.out.println("Invalid input.");
} }
} catch (InputMismatchException | IOException ex) { } catch (InputMismatchException | IOException ex) {
System.out.println(ex); System.out.println(ex);
@@ -493,13 +493,14 @@ public class InteractiveInterface {
// } // }
// } // }
private static void options(){ private static void mainOptions(){
boolean backToMain = false; boolean backToMain = false;
while(!backToMain) { while(!backToMain) {
System.out.println("\n--------------OPTIONS---------------"); System.out.println("\n--------------OPTIONS---------------");
System.out.println("1) Turn " + getOnOff(!BiGpairSEQ.cacheCells()) + " cell sample file caching"); System.out.println("1) Turn " + getOnOff(!BiGpairSEQ.cacheCells()) + " cell sample file caching");
System.out.println("2) Turn " + getOnOff(!BiGpairSEQ.cachePlate()) + " plate file caching"); System.out.println("2) Turn " + getOnOff(!BiGpairSEQ.cachePlate()) + " plate file caching");
System.out.println("3) Turn " + getOnOff(!BiGpairSEQ.cacheGraph()) + " graph/data file caching"); System.out.println("3) Turn " + getOnOff(!BiGpairSEQ.cacheGraph()) + " graph/data file caching");
System.out.println("4) Maximum weight matching algorithm options");
System.out.println("0) Return to main menu"); System.out.println("0) Return to main menu");
try { try {
input = sc.nextInt(); input = sc.nextInt();
@@ -508,7 +509,7 @@ public class InteractiveInterface {
case 2 -> BiGpairSEQ.setCachePlate(!BiGpairSEQ.cachePlate()); case 2 -> BiGpairSEQ.setCachePlate(!BiGpairSEQ.cachePlate());
case 3 -> BiGpairSEQ.setCacheGraph(!BiGpairSEQ.cacheGraph()); case 3 -> BiGpairSEQ.setCacheGraph(!BiGpairSEQ.cacheGraph());
case 0 -> backToMain = true; case 0 -> backToMain = true;
default -> throw new InputMismatchException("Invalid input."); default -> System.out.println("Invalid input");
} }
} catch (InputMismatchException ex) { } catch (InputMismatchException ex) {
System.out.println(ex); System.out.println(ex);
@@ -517,11 +518,41 @@ public class InteractiveInterface {
} }
} }
/**
* Helper function for printing menu items in mainOptions(). Returns a string based on the value of parameter.
*
* @param b - a boolean value
* @return String "on" if b is true, "off" if b is false
*/
private static String getOnOff(boolean b) { private static String getOnOff(boolean b) {
if (b) { return "on";} if (b) { return "on";}
else { return "off"; } else { return "off"; }
} }
private static void algorithmOptions(){
boolean backToOptions = false;
while(!backToOptions) {
System.out.println("\n---------ALGORITHM OPTIONS----------");
System.out.println("1) Use scaling algorithm by Duan and Su.");
System.out.println("2) Use Hungarian algorithm with Fibonacci heap priority queue");
System.out.println("3) Use Hungarian algorithm with pairing heap priority queue");
System.out.println("0) Return to Options menu");
try {
input = sc.nextInt();
switch (input) {
case 1 -> System.out.println("This option is not yet implemented. Choose another.");
case 2 -> BiGpairSEQ.setFibonacciHeap();
case 3 -> BiGpairSEQ.setPairingHeap();
case 0 -> backToOptions = true;
default -> System.out.println("Invalid input");
}
} catch (InputMismatchException ex) {
System.out.println(ex);
sc.next();
}
}
}
private static void acknowledge(){ private static void acknowledge(){
System.out.println("This program simulates BiGpairSEQ, a graph theory based adaptation"); System.out.println("This program simulates BiGpairSEQ, a graph theory based adaptation");
System.out.println("of the pairSEQ algorithm for pairing T cell receptor sequences."); System.out.println("of the pairSEQ algorithm for pairing T cell receptor sequences.");

View File

@@ -3,6 +3,7 @@ import org.jgrapht.alg.matching.MaximumWeightBipartiteMatching;
import org.jgrapht.generate.SimpleWeightedBipartiteGraphMatrixGenerator; import org.jgrapht.generate.SimpleWeightedBipartiteGraphMatrixGenerator;
import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleWeightedGraph; import org.jgrapht.graph.SimpleWeightedGraph;
import org.jheaps.tree.FibonacciHeap;
import org.jheaps.tree.PairingHeap; import org.jheaps.tree.PairingHeap;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -181,12 +182,29 @@ public class Simulator {
//Find Maximum Weighted Matching //Find Maximum Weighted Matching
//using jheaps library class PairingHeap for improved efficiency //using jheaps library class PairingHeap for improved efficiency
if(verbose){System.out.println("Finding maximum weighted matching");} if(verbose){System.out.println("Finding maximum weighted matching");}
//Attempting to use addressable heap to improve performance MaximumWeightBipartiteMatching maxWeightMatching;
MaximumWeightBipartiteMatching maxWeightMatching = //Use correct heap type for priority queue
new MaximumWeightBipartiteMatching(graph, String heapType = BiGpairSEQ.getPriorityQueueHeapType();
switch (heapType) {
case "PAIRING" -> {
maxWeightMatching = new MaximumWeightBipartiteMatching(graph,
plateVtoAMap.keySet(), plateVtoAMap.keySet(),
plateVtoBMap.keySet(), plateVtoBMap.keySet(),
i -> new PairingHeap(Comparator.naturalOrder())); i -> new PairingHeap(Comparator.naturalOrder()));
}
case "FIBONACCI" -> {
maxWeightMatching = new MaximumWeightBipartiteMatching(graph,
plateVtoAMap.keySet(),
plateVtoBMap.keySet(),
i -> new FibonacciHeap(Comparator.naturalOrder()));
}
default -> {
maxWeightMatching = new MaximumWeightBipartiteMatching(graph,
plateVtoAMap.keySet(),
plateVtoBMap.keySet());
}
}
//get the matching
MatchingAlgorithm.Matching<String, DefaultWeightedEdge> graphMatching = maxWeightMatching.getMatching(); MatchingAlgorithm.Matching<String, DefaultWeightedEdge> graphMatching = maxWeightMatching.getMatching();
if(verbose){System.out.println("Matching completed");} if(verbose){System.out.println("Matching completed");}
Instant stop = Instant.now(); Instant stop = Instant.now();