diff --git a/.gitignore b/.gitignore index fe3b334e6..cf7ab2bce 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,13 @@ # *.iml # *.ipr +# Maven target +/target/ +**/target/** + +# VSCode +/.vscode + # CMake cmake-build-*/ diff --git a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantum/iQuantumExample8.java b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantum/iQuantumExample8.java index 3d9df4070..3d8a355fc 100644 --- a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantum/iQuantumExample8.java +++ b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantum/iQuantumExample8.java @@ -1,5 +1,5 @@ /** - * iQuantum Example 5 + * iQuantum Example 8 * This example shows how to create a QDatacenter with two 27-qubit quantum nodes following the topology of * IBM Hanoi and IBM Geneva automatically from the datasheet. Then, it creates a QBroker and four QTasks to * be submitted to the QBroker. Finally, it starts the simulation and prints the results. @@ -17,7 +17,11 @@ import org.iquantum.policies.qtasks.QTaskSchedulerFCFSMQ; import org.iquantum.tasks.QTask; import org.iquantum.utils.Log; +import org.iquantum.utils.QTaskExporter; import org.iquantum.utils.QTaskImporter; +import org.iquantum.utils.GraphicalTopoRepr; +import org.iquantum.utils.QTaskListGui; + import java.io.IOException; import java.nio.file.Path; @@ -38,6 +42,7 @@ public static void main(String[] args) throws IOException { Calendar calendar = Calendar.getInstance(); boolean trace_flag = true; // trace events iQuantum.init(num_user, calendar, trace_flag); + String exampleName = "QExample-8"; // Step 2: Create a QDatacenter and two quantum nodes (IBM Hanoi and IBM Geneva) QDatacenterExtended qDatacenter = createQDatacenter("QDatacenter_0"); @@ -59,7 +64,11 @@ public static void main(String[] args) throws IOException { // // // Step 8: Print the results when simulation is over List newList = qBroker.getQTaskReceivedList(); - printQTaskList(newList); + // printQTaskList(newList); + QTaskListGui.showQTaskListInGUI(newList); + // Formatting output for better aligned list. + QTaskExporter.printQTaskList(QTaskList); + QTaskExporter.extractQTaskListToCSV(newList, exampleName); Log.printLine("iQuantum MultiQPU Example finished!"); } @@ -80,6 +89,11 @@ private static List createQTaskList(QDatacenterExtended qDatacenter, QBro QTask.setQNodeId(qNodeList.get(random.nextInt(qNodeList.size())).getId()); QTaskList.add(QTask); } + // Sorting the QTasks [List] based on Least Executable Circuit Layers First + QTaskList.sort(Comparator.comparingInt(QTask::getNumECL)); + + /** Graphical representation of a Qtask topology */ + GraphicalTopoRepr.repr(QTasks.get(0).getQubitTopology()); } catch (IOException e) { System.err.println("Error reading CSV file: " + e.getMessage()); } @@ -111,7 +125,11 @@ private static QDatacenterExtended createQDatacenter(String name) { // Automatically create two quantum nodes (IBM Hanoi and IBM Cairo) from the dataset QNodeMQ qNode1 = IBMQNodeMQ.createNode(0,"ibm_cairo",new QTaskSchedulerFCFSMQ()); QNodeMQ qNode2 = IBMQNodeMQ.createNode(1,"ibm_hanoi",new QTaskSchedulerFCFSMQ()); -// QubitTopology.printTopology(qNode1.getQubitTopology()); + //QubitTopology.printTopology(qNode1.getQubitTopology()); + + /** Graphical representation of a Qnode topology */ + GraphicalTopoRepr.repr(qNode1.getQPUList().getQubitTopologyOfQPUById(0)); + // GraphicalTopoRepr.repr(qNode2.getQPUList().getQubitTopologyOfQPUById(0)); qNodeList = new ArrayList<>(); qNodeList.addAll(Arrays.asList(qNode1, qNode2)); double timeZone = 0.0; diff --git a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/FCFS_HCF.java b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/FCFS_HCF.java new file mode 100644 index 000000000..9d692c3e5 --- /dev/null +++ b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/FCFS_HCF.java @@ -0,0 +1,143 @@ +package org.iquantum.examples.quantumExpr; + +import org.iquantum.backends.quantum.IBMQNodeMQ; +import org.iquantum.backends.quantum.QNodeMQ; +import org.iquantum.brokers.QBrokerMQ; +import org.iquantum.core.iQuantum; +import org.iquantum.datacenters.QDatacenterCharacteristicsExtended; +import org.iquantum.datacenters.QDatacenterExtended; +import org.iquantum.policies.qtasks.QTaskSchedulerFCFSMQ; +import org.iquantum.tasks.QTask; +import org.iquantum.utils.Log; +import org.iquantum.utils.QTaskExporter; +import org.iquantum.utils.QTaskImporter; +import org.iquantum.utils.QTaskListGui; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +public class FCFS_HCF { + + private static List QTaskList; + + private static List qNodeList; + + public static void main(String[] args) throws IOException { + System.out.println("Start the iQuantum Multi QPU Example 1..."); + + // Step 1: Initialize the core simulation package. It should be called before creating any entities. + int num_user = 1; + Calendar calendar = Calendar.getInstance(); + boolean trace_flag = true; // trace events + iQuantum.init(num_user, calendar, trace_flag); + String exampleName = "FCFS_HCF"; + + // Step 2: Create a QDatacenter and two quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterExtended qDatacenter = createQDatacenter("QDatacenter_0"); + + // Step 3: Create a QBroker + QBrokerMQ qBroker = createQBroker(); + + // Step 4: Create a QTask + QTaskList = createQTaskList(qDatacenter, qBroker); + +// // Step 5: Submit QTask to the QBroker + qBroker.submitQTaskList(QTaskList); + +// // Step 6: Start the simulation + iQuantum.startSimulation(); + +// // Step 7: Stop the simulation + iQuantum.stopSimulation(); + +// // Step 8: Print the results when simulation is over + List newList = qBroker.getQTaskReceivedList(); + // printQTaskList(newList); + QTaskListGui.showQTaskListInGUI(newList); + // Formatting output for better aligned list. + QTaskExporter.printQTaskList(QTaskList); + QTaskExporter.extractQTaskListToCSV(newList, exampleName); + + Log.printLine("iQuantum MultiQPU Example finished!"); + } + + private static List createQTaskList(QDatacenterExtended qDatacenter, QBrokerMQ qBroker) { + List QTaskList = new ArrayList<>(); + String folderPath = "dataset/iquantum/MQT-Set01-298-10-27-IBMQ27-Opt3-Extra.csv"; + Path datasetPath = Paths.get(System.getProperty("user.dir"), folderPath); + QTaskImporter QTaskImporter = new QTaskImporter(); + try { + List QTasks = QTaskImporter.importQTasksFromCsv(datasetPath.toString()); + List qNodes = (List) qDatacenter.getCharacteristics().getQNodeList(); + + int id = 0; + int numQnode = qNodes.size(); + // Sort QNode list by CLOPS Descending + qNodes.sort(Comparator.comparing( + qNode -> qNode.getTotalClops())); + qNodes.reversed(); + + for (QTask QT : QTasks) { + + QT.setBrokerId(qBroker.getId()); + QT.setQNodeId(qNodes.get(id).getId()); + QTaskList.add(QT); + id = (id + 1) % numQnode; + } + + } catch (IOException e) { + System.err.println("Error reading CSV file: " + e.getMessage()); + } + + return QTaskList; + } + + /** + * Create a QBroker + * + * @return QBroker + */ + private static QBrokerMQ createQBroker() { + QBrokerMQ qBroker = null; + try { + qBroker = new QBrokerMQ("QBroker"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return qBroker; + } + + /** + * Create a QDatacenter with two quantum nodes (IBM Hanoi and IBM Geneva) + * + * @param name name of the QDatacenter + * @return QDatacenter + */ + private static QDatacenterExtended createQDatacenter(String name) { + // Automatically create two quantum nodes (IBM Hanoi and IBM Cairo) from the dataset + QNodeMQ qNode1 = IBMQNodeMQ.createNode(0, "ibm_auckland", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode2 = IBMQNodeMQ.createNode(1, "ibm_cairo", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode3 = IBMQNodeMQ.createNode(2, "ibm_hanoi", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode4 = IBMQNodeMQ.createNode(3, "ibmq_kolkata", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode5 = IBMQNodeMQ.createNode(4, "ibm_geneva", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode6 = IBMQNodeMQ.createNode(5, "ibmq_mumbai", new QTaskSchedulerFCFSMQ()); + + //QubitTopology.printTopology(qNode1.getQubitTopology()); + /** + * Graphical representation of a Qnode topology + */ + // GraphicalTopoRepr.repr(qNode1.getQPUList().getQubitTopologyOfQPUById(0)); + // GraphicalTopoRepr.repr(qNode2.getQPUList().getQubitTopologyOfQPUById(0)); + qNodeList = new ArrayList<>(); + qNodeList.addAll(Arrays.asList(qNode1, qNode2, qNode3, qNode4, qNode5, qNode6)); + double timeZone = 0.0; + double costPerSec = 3.0; + + // Create a QDatacenter with two 7-qubit quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterCharacteristicsExtended characteristics = new QDatacenterCharacteristicsExtended(qNodeList, timeZone, costPerSec); + QDatacenterExtended qDatacenter = new QDatacenterExtended(name, characteristics); + return qDatacenter; + } +} diff --git a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/FCFS_LCF.java b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/FCFS_LCF.java new file mode 100644 index 000000000..0d16f3757 --- /dev/null +++ b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/FCFS_LCF.java @@ -0,0 +1,144 @@ +package org.iquantum.examples.quantumExpr; + +import org.iquantum.backends.quantum.IBMQNodeMQ; +import org.iquantum.backends.quantum.QNodeMQ; +import org.iquantum.brokers.QBrokerMQ; +import org.iquantum.core.iQuantum; +import org.iquantum.datacenters.QDatacenterCharacteristicsExtended; +import org.iquantum.datacenters.QDatacenterExtended; +import org.iquantum.policies.qtasks.QTaskSchedulerFCFSMQ; +import org.iquantum.tasks.QTask; +import org.iquantum.utils.Log; +import org.iquantum.utils.QTaskExporter; +import org.iquantum.utils.QTaskImporter; +import org.iquantum.utils.QTaskListGui; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DecimalFormat; +import java.util.*; + +public class FCFS_LCF { + + private static List QTaskList; + + private static List qNodeList; + + public static void main(String[] args) throws IOException { + System.out.println("Start the iQuantum Multi QPU Example 1..."); + + // Step 1: Initialize the core simulation package. It should be called before creating any entities. + int num_user = 1; + Calendar calendar = Calendar.getInstance(); + boolean trace_flag = true; // trace events + iQuantum.init(num_user, calendar, trace_flag); + String exampleName = "FCFS_LCF"; + + // Step 2: Create a QDatacenter and two quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterExtended qDatacenter = createQDatacenter("QDatacenter_0"); + + // Step 3: Create a QBroker + QBrokerMQ qBroker = createQBroker(); + + // Step 4: Create a QTask + QTaskList = createQTaskList(qDatacenter, qBroker); + // + // // Step 5: Submit QTask to the QBroker + qBroker.submitQTaskList(QTaskList); + // + // // Step 6: Start the simulation + iQuantum.startSimulation(); + // + // // Step 7: Stop the simulation + iQuantum.stopSimulation(); + // + // // Step 8: Print the results when simulation is over + List newList = qBroker.getQTaskReceivedList(); + // printQTaskList(newList); + QTaskListGui.showQTaskListInGUI(newList); + // Formatting output for better aligned list. + // QTaskExporter.printQTaskList(QTaskList); + QTaskExporter.extractQTaskListToCSV(newList, exampleName); + + Log.printLine("iQuantum MultiQPU Example finished!"); + } + + private static List createQTaskList(QDatacenterExtended qDatacenter, QBrokerMQ qBroker) { + List QTaskList = new ArrayList<>(); + String folderPath = "dataset/iquantum/MQT-Set01-298-10-27-IBMQ27-Opt3-Extra.csv"; + Path datasetPath = Paths.get(System.getProperty("user.dir"), folderPath); + QTaskImporter QTaskImporter = new QTaskImporter(); + try { + // Get Qtasks + List QTasks + = QTaskImporter.importQTasksFromCsv( + datasetPath.toString()); + // Get QNodes + @SuppressWarnings("unchecked") + List qNodes + = (List) qDatacenter + .getCharacteristics() + .getQNodeList(); + + int id = 0; + int numQnode = qNodes.size(); + // Sort QNode list by CLOPS Ascending + qNodes.sort(Comparator.comparing( + qNode -> qNode.getTotalClops())); + + for (QTask QT : QTasks) { + + QT.setBrokerId(qBroker.getId()); + QT.setQNodeId(qNodes.get(id).getId()); + QTaskList.add(QT); + id = (id + 1) % numQnode; + } + } catch (IOException e) { + System.err.println("Error reading CSV file: " + e.getMessage()); + } + + return QTaskList; + } + + /** + * Create a QBroker + * + * @return QBroker + */ + private static QBrokerMQ createQBroker() { + QBrokerMQ qBroker; + try { + qBroker = new QBrokerMQ("QBroker"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return qBroker; + } + + /** + * Create a QDatacenter with two quantum nodes (IBM Hanoi and IBM Geneva) + * + * @param name name of the QDatacenter + * @return QDatacenter + */ + private static QDatacenterExtended createQDatacenter(String name) { + // Automatically create six quantum nodes from the dataset + QNodeMQ qNode1 = IBMQNodeMQ.createNode(0, "ibmq_mumbai", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode2 = IBMQNodeMQ.createNode(1, "ibm_geneva", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode3 = IBMQNodeMQ.createNode(2, "ibmq_kolkata", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode4 = IBMQNodeMQ.createNode(3, "ibm_hanoi", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode5 = IBMQNodeMQ.createNode(4, "ibm_cairo", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode6 = IBMQNodeMQ.createNode(5, "ibm_auckland", new QTaskSchedulerFCFSMQ()); + qNodeList = new ArrayList<>(); + qNodeList.addAll(Arrays.asList(qNode1, qNode2, qNode3, qNode4, qNode5, qNode6)); + double timeZone = 0.0; + double costPerSec = 3.0; + + // Create a QDatacenter with six 7-qubit quantum nodes. + QDatacenterCharacteristicsExtended characteristics = new QDatacenterCharacteristicsExtended(qNodeList, timeZone, costPerSec); + QDatacenterExtended qDatacenter = new QDatacenterExtended(name, characteristics); + return qDatacenter; + } +} diff --git a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/LECLF_HCF.java b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/LECLF_HCF.java new file mode 100644 index 000000000..cbf0a0cb4 --- /dev/null +++ b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/LECLF_HCF.java @@ -0,0 +1,141 @@ +package org.iquantum.examples.quantumExpr; + +import org.iquantum.backends.quantum.IBMQNodeMQ; +import org.iquantum.backends.quantum.QNodeMQ; +import org.iquantum.brokers.QBrokerMQ; +import org.iquantum.core.iQuantum; +import org.iquantum.datacenters.QDatacenterCharacteristicsExtended; +import org.iquantum.datacenters.QDatacenterExtended; +import org.iquantum.policies.qtasks.QTaskSchedulerFCFSMQ; +import org.iquantum.tasks.QTask; +import org.iquantum.utils.Log; +import org.iquantum.utils.QTaskExporter; +import org.iquantum.utils.QTaskImporter; +import org.iquantum.utils.GraphicalTopoRepr; +import org.iquantum.utils.QTaskListGui; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DecimalFormat; +import java.util.*; + +public class LECLF_HCF { + + private static List QTaskList; + + private static List qNodeList; + + public static void main(String[] args) throws IOException { + System.out.println("Start the iQuantum Multi QPU Example 1..."); + + // Step 1: Initialize the core simulation package. It should be called before creating any entities. + int num_user = 1; + Calendar calendar = Calendar.getInstance(); + boolean trace_flag = true; // trace events + iQuantum.init(num_user, calendar, trace_flag); + String exampleName = "LECLF_HCF"; + + // Step 2: Create a QDatacenter and two quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterExtended qDatacenter = createQDatacenter("QDatacenter_0"); + + // Step 3: Create a QBroker + QBrokerMQ qBroker = createQBroker(); + + // Step 4: Create a QTask + QTaskList = createQTaskList(qDatacenter, qBroker); +// +// // Step 5: Submit QTask to the QBroker + qBroker.submitQTaskList(QTaskList); +// +// // Step 6: Start the simulation + iQuantum.startSimulation(); +// +// // Step 7: Stop the simulation + iQuantum.stopSimulation(); +// +// // Step 8: Print the results when simulation is over + List newList = qBroker.getQTaskReceivedList(); + // printQTaskList(newList); + QTaskListGui.showQTaskListInGUI(newList); + // Formatting output for better aligned list. + QTaskExporter.printQTaskList(QTaskList); + QTaskExporter.extractQTaskListToCSV(newList, exampleName); + + Log.printLine("iQuantum MultiQPU Example finished!"); + } + + private static List createQTaskList(QDatacenterExtended qDatacenter, QBrokerMQ qBroker) { + List QTaskList = new ArrayList<>(); + String folderPath = "dataset/iquantum/MQT-Set01-298-10-27-IBMQ27-Opt3-Extra.csv"; + Path datasetPath = Paths.get(System.getProperty("user.dir"), folderPath); + QTaskImporter QTaskImporter = new QTaskImporter(); + try { + List QTasks = QTaskImporter.importQTasksFromCsv(datasetPath.toString()); + List qNodes = (List) qDatacenter.getCharacteristics().getQNodeList(); + + int id = 0; + int numQnode = qNodes.size(); + // Sort QNode list by CLOPS Descending + qNodes.sort(Comparator.comparing(qNode -> qNode.getTotalClops())); + qNodes.reversed(); + + for (QTask QT : QTasks) { + + QT.setBrokerId(qBroker.getId()); + QT.setQNodeId(qNodes.get(id).getId()); + QTaskList.add(QT); + id = (id + 1) % numQnode; + } + // Sorting the QTasks [List] based on Least Executable Circuit Layers First + QTaskList.sort(Comparator.comparingInt(QTask::getNumECL)); + + } catch (IOException e) { + System.err.println("Error reading CSV file: " + e.getMessage()); + } + + return QTaskList; + } + + /** + * Create a QBroker + * + * @return QBroker + */ + private static QBrokerMQ createQBroker() { + QBrokerMQ qBroker = null; + try { + qBroker = new QBrokerMQ("QBroker"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return qBroker; + } + + /** + * Create a QDatacenter with six quantum nodes + * + * @param name name of the QDatacenter + * @return QDatacenter + */ + private static QDatacenterExtended createQDatacenter(String name) { + // Automatically create six quantum nodes from the dataset + QNodeMQ qNode1 = IBMQNodeMQ.createNode(0, "ibm_auckland", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode2 = IBMQNodeMQ.createNode(1, "ibm_cairo", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode3 = IBMQNodeMQ.createNode(2, "ibm_hanoi", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode4 = IBMQNodeMQ.createNode(3, "ibmq_kolkata", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode5 = IBMQNodeMQ.createNode(4, "ibm_geneva", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode6 = IBMQNodeMQ.createNode(5, "ibmq_mumbai", new QTaskSchedulerFCFSMQ()); + + qNodeList = new ArrayList<>(); + qNodeList.addAll(Arrays.asList(qNode1, qNode2, qNode3, qNode4, qNode5, qNode6)); + double timeZone = 0.0; + double costPerSec = 3.0; + + // Create a QDatacenter with six 7-qubit quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterCharacteristicsExtended characteristics = new QDatacenterCharacteristicsExtended(qNodeList, timeZone, costPerSec); + QDatacenterExtended qDatacenter = new QDatacenterExtended(name, characteristics); + return qDatacenter; + } +} diff --git a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/LECLF_LCF.java b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/LECLF_LCF.java new file mode 100644 index 000000000..fcb94c0c4 --- /dev/null +++ b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/LECLF_LCF.java @@ -0,0 +1,149 @@ +package org.iquantum.examples.quantumExpr; + +import org.iquantum.backends.quantum.IBMQNodeMQ; +import org.iquantum.backends.quantum.QNodeMQ; +import org.iquantum.brokers.QBrokerMQ; +import org.iquantum.core.iQuantum; +import org.iquantum.datacenters.QDatacenterCharacteristicsExtended; +import org.iquantum.datacenters.QDatacenterExtended; +import org.iquantum.policies.qtasks.QTaskSchedulerFCFSMQ; +import org.iquantum.tasks.QTask; +import org.iquantum.utils.Log; +import org.iquantum.utils.QTaskExporter; +import org.iquantum.utils.QTaskImporter; +import org.iquantum.utils.GraphicalTopoRepr; +import org.iquantum.utils.QTaskListGui; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DecimalFormat; +import java.util.*; + +public class LECLF_LCF { + + private static List QTaskList; + + private static List qNodeList; + + public static void main(String[] args) throws IOException { + System.out.println("Start the iQuantum Multi QPU Example 1..."); + + // Step 1: Initialize the core simulation package. It should be called before creating any entities. + int num_user = 1; + Calendar calendar = Calendar.getInstance(); + boolean trace_flag = true; // trace events + iQuantum.init(num_user, calendar, trace_flag); + String exampleName = "LECLF_LCF"; + + // Step 2: Create a QDatacenter and two quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterExtended qDatacenter = createQDatacenter("QDatacenter_0"); + + // Step 3: Create a QBroker + QBrokerMQ qBroker = createQBroker(); + + // Step 4: Create a QTask + QTaskList = createQTaskList(qDatacenter, qBroker); + // + // // Step 5: Submit QTask to the QBroker + qBroker.submitQTaskList(QTaskList); + // + // // Step 6: Start the simulation + iQuantum.startSimulation(); + // + // // Step 7: Stop the simulation + iQuantum.stopSimulation(); + // + // // Step 8: Print the results when simulation is over + List newList = qBroker.getQTaskReceivedList(); + // printQTaskList(newList); + QTaskListGui.showQTaskListInGUI(newList); + // Formatting output for better aligned list. + // QTaskExporter.printQTaskList(QTaskList); + QTaskExporter.extractQTaskListToCSV(newList, exampleName); + + Log.printLine("iQuantum MultiQPU Example finished!"); + } + + private static List createQTaskList(QDatacenterExtended qDatacenter, QBrokerMQ qBroker) { + List QTaskList = new ArrayList<>(); + String folderPath = "dataset/iquantum/MQT-Set01-298-10-27-IBMQ27-Opt3-Extra.csv"; + Path datasetPath = Paths.get(System.getProperty("user.dir"), folderPath); + QTaskImporter QTaskImporter = new QTaskImporter(); + try { + // Get Qtasks + List QTasks + = QTaskImporter.importQTasksFromCsv( + datasetPath.toString()); + // Get QNodes + @SuppressWarnings("unchecked") + List qNodes + = (List) qDatacenter + .getCharacteristics() + .getQNodeList(); + + int id = 0; + int numQnode = qNodes.size(); + // Sort QNode list by CLOPS Ascending + qNodes.sort(Comparator.comparing( + qNode -> qNode.getTotalClops())); + + for (QTask QT : QTasks) { + + QT.setBrokerId(qBroker.getId()); + QT.setQNodeId(qNodes.get(id).getId()); + QTaskList.add(QT); + id = (id + 1) % numQnode; + } + + // Sorting the QTasks [List] based on Least Executable Circuit Layers First + QTaskList.sort(Comparator.comparingInt(QTask::getNumECL)); + + } catch (IOException e) { + System.err.println("Error reading CSV file: " + e.getMessage()); + } + + return QTaskList; + } + + /** + * Create a QBroker + * + * @return QBroker + */ + private static QBrokerMQ createQBroker() { + QBrokerMQ qBroker; + try { + qBroker = new QBrokerMQ("QBroker"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return qBroker; + } + + /** + * Create a QDatacenter with two quantum nodes (IBM Hanoi and IBM Geneva) + * + * @param name name of the QDatacenter + * @return QDatacenter + */ + private static QDatacenterExtended createQDatacenter(String name) { + // Automatically create six quantum nodes from the dataset + QNodeMQ qNode1 = IBMQNodeMQ.createNode(0, "ibmq_mumbai", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode2 = IBMQNodeMQ.createNode(1, "ibm_geneva", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode3 = IBMQNodeMQ.createNode(2, "ibmq_kolkata", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode4 = IBMQNodeMQ.createNode(3, "ibm_hanoi", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode5 = IBMQNodeMQ.createNode(4, "ibm_cairo", new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode6 = IBMQNodeMQ.createNode(5, "ibm_auckland", new QTaskSchedulerFCFSMQ()); + qNodeList = new ArrayList<>(); + qNodeList.addAll(Arrays.asList(qNode1, qNode2, qNode3, qNode4, qNode5, qNode6)); + double timeZone = 0.0; + double costPerSec = 3.0; + + // Create a QDatacenter with six 7-qubit quantum nodes. + QDatacenterCharacteristicsExtended characteristics = new QDatacenterCharacteristicsExtended(qNodeList, timeZone, costPerSec); + QDatacenterExtended qDatacenter = new QDatacenterExtended(name, characteristics); + return qDatacenter; + } +} diff --git a/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/randomsjn.java b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/randomsjn.java new file mode 100644 index 000000000..9b24d88c8 --- /dev/null +++ b/modules/iquantum-examples/src/main/java/org/iquantum/examples/quantumExpr/randomsjn.java @@ -0,0 +1,136 @@ +package org.iquantum.examples.quantumExpr; + +import org.iquantum.backends.quantum.IBMQNodeMQ; +import org.iquantum.backends.quantum.QNodeMQ; +import org.iquantum.brokers.QBrokerMQ; +import org.iquantum.core.iQuantum; +import org.iquantum.datacenters.QDatacenterCharacteristicsExtended; +import org.iquantum.datacenters.QDatacenterExtended; +import org.iquantum.policies.qtasks.QTaskSchedulerFCFSMQ; +import org.iquantum.tasks.QTask; +import org.iquantum.utils.Log; +import org.iquantum.utils.QTaskExporter; +import org.iquantum.utils.QTaskImporter; +import org.iquantum.utils.GraphicalTopoRepr; +import org.iquantum.utils.QTaskListGui; + + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +// import java.text.DecimalFormat; +import java.util.*; + +public class randomsjn { + private static List QTaskList; + + private static List qNodeList; + + public static void main(String[] args) throws IOException { + System.out.println("Start the iQuantum Multi QPU Example 1..."); + + // Step 1: Initialize the core simulation package. It should be called before creating any entities. + int num_user = 1; + Calendar calendar = Calendar.getInstance(); + boolean trace_flag = true; // trace events + iQuantum.init(num_user, calendar, trace_flag); + String exampleName = "randomsjn"; + + // Step 2: Create a QDatacenter and two quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterExtended qDatacenter = createQDatacenter("QDatacenter_0"); + + // Step 3: Create a QBroker + QBrokerMQ qBroker = createQBroker(); + + // Step 4: Create a QTask + QTaskList = createQTaskList(qDatacenter, qBroker); +// +// // Step 5: Submit QTask to the QBroker + qBroker.submitQTaskList(QTaskList); +// +// // Step 6: Start the simulation + iQuantum.startSimulation(); +// +// // Step 7: Stop the simulation + iQuantum.stopSimulation(); +// +// // Step 8: Print the results when simulation is over + List newList = qBroker.getQTaskReceivedList(); + // printQTaskList(newList); + QTaskListGui.showQTaskListInGUI(newList); + // Formatting output for better aligned list. + QTaskExporter.printQTaskList(QTaskList); + QTaskExporter.extractQTaskListToCSV(newList, exampleName); + + Log.printLine("iQuantum randomsjn Example finished!"); + } + + private static List createQTaskList(QDatacenterExtended qDatacenter, QBrokerMQ qBroker) { + List QTL = new ArrayList<>(); + String folderPath = "dataset/iquantum/MQT-Set04-7-127-AllOpt-IBMMapped-Extra.csv"; + Path datasetPath = Paths.get(System.getProperty("user.dir"), folderPath); + QTaskImporter QTaskImporter = new QTaskImporter(); + try { + List QTasks = QTaskImporter.importQTasksFromCsv(datasetPath.toString()); + List qNodeList = (List) qDatacenter.getCharacteristics().getQNodeList(); + // Assign random QNode to each QTask + Random random = new Random(); + + for (QTask QTask : QTasks) { + QTask.setBrokerId(qBroker.getId()); + QTask.setQNodeId(qNodeList.get(random.nextInt(qNodeList.size())).getId()); + QTL.add(QTask); + } + // Sorting the QTasks [List] based on Least Executable Circuit Layers First + QTL.sort(Comparator.comparingInt(QTask::getNumECL)); + + /** Graphical representation of a Qtask topology */ + GraphicalTopoRepr.repr(QTasks.get(0).getQubitTopology()); + } catch (IOException e) { + System.err.println("Error reading CSV file: " + e.getMessage()); + } + + return QTL; + } + + /** + * Create a QBroker + * @return QBroker + */ + private static QBrokerMQ createQBroker() { + QBrokerMQ qBroker; + try { + qBroker = new QBrokerMQ("QBroker"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return qBroker; + } + + /** + * Create a QDatacenter with two quantum nodes (IBM Hanoi and IBM Geneva) + * @param name name of the QDatacenter + * @return QDatacenter + */ + private static QDatacenterExtended createQDatacenter(String name) { + // Automatically create two quantum nodes (IBM Hanoi and IBM Cairo) from the dataset + QNodeMQ qNode1 = IBMQNodeMQ.createNode(0,"ibm_washington",new QTaskSchedulerFCFSMQ()); + QNodeMQ qNode2 = IBMQNodeMQ.createNode(1,"ibm_sherbrooke",new QTaskSchedulerFCFSMQ()); + //QubitTopology.printTopology(qNode1.getQubitTopology()); + + /** Graphical representation of a Qnode topology */ + GraphicalTopoRepr.repr(qNode1.getQPUList().getQubitTopologyOfQPUById(0)); + // GraphicalTopoRepr.repr(qNode2.getQPUList().getQubitTopologyOfQPUById(0)); + qNodeList = new ArrayList<>(); + qNodeList.addAll(Arrays.asList(qNode1, qNode2)); + double timeZone = 0.0; + double costPerSec = 3.0; + + // Create a QDatacenter with two 7-qubit quantum nodes (IBM Hanoi and IBM Geneva) + QDatacenterCharacteristicsExtended characteristics = new QDatacenterCharacteristicsExtended(qNodeList, timeZone, costPerSec); + QDatacenterExtended qDatacenter = new QDatacenterExtended(name, characteristics); + return qDatacenter; + } +} + diff --git a/modules/iquantum/pom.xml b/modules/iquantum/pom.xml index 9229d109a..b5eb238a8 100644 --- a/modules/iquantum/pom.xml +++ b/modules/iquantum/pom.xml @@ -118,6 +118,21 @@ commons-csv 1.10.0 + + org.graphstream + gs-core + 2.0 + + + org.graphstream + gs-ui-swing + 2.0 + + + org.jgrapht + jgrapht-core + 1.5.1 + diff --git a/modules/iquantum/src/main/java/org/iquantum/tasks/QTask.java b/modules/iquantum/src/main/java/org/iquantum/tasks/QTask.java index 15aa0daf3..1a592dcb1 100644 --- a/modules/iquantum/src/main/java/org/iquantum/tasks/QTask.java +++ b/modules/iquantum/src/main/java/org/iquantum/tasks/QTask.java @@ -67,7 +67,10 @@ public class QTask { * it starts and finishes executing in a single cloud resource, without * being migrated, this list will have only one item. */ + private final List resList; + /** The total Executable Circuit Layer of qlet */ + private int ECL; /** * The index of the last resource where the qulet was executed. If the @@ -167,6 +170,7 @@ public QTask(final int quletId, final int numQubits, final int numLayers, this.applicationName = null; this.record = iQuantum.getTraceFlag(); this.cost = 0.0; + this.ECL = numShots * numLayers; execStartTime = 0.0; execFinishTime = -1.0; qNodeId = -1; @@ -180,6 +184,7 @@ public QTask(final int quletId, final int numQubits, final int numLayers, * @param numQubits: the number of qubits in the QTask * @param numLayers: the number of circuit layers in the QTask * @param numShots: the number of shots the QTask is to be executed + * @param ECL: the number of total Executable Circuit Layers * @param gateSet: the list of all gate set in the QTask * @param qubitTopology: the topology of the qubits in the QTask * @param preferredBackend: the preferred backend type to execute the QTask @@ -199,11 +204,13 @@ public QTask(final int quletId, final int numQubits, final int numLayers, this.preferredBackend = preferredBackend; this.applicationName = applicationName; this.record = iQuantum.getTraceFlag(); + this.ECL = numShots * numLayers; execStartTime = 0.0; execFinishTime = -1.0; qNodeId = -1; resList = new ArrayList(2); index = -1; + } /** @@ -262,6 +269,10 @@ public int getNumLayers() { return numLayers; } + public int getNumECL() { + return ECL; + } + public int getNumShots() { return numShots; } @@ -298,6 +309,10 @@ public void setPreferredBackend(final String backend) { public String getPreferredBackend() { return preferredBackend; } + + public void setECL(int numLayers, int numShots) { + this.ECL = numLayers * numShots; + } public void setApplicationName(final String applicationName) { this.applicationName = applicationName; diff --git a/modules/iquantum/src/main/java/org/iquantum/utils/GraphicalTopoRepr.java b/modules/iquantum/src/main/java/org/iquantum/utils/GraphicalTopoRepr.java new file mode 100644 index 000000000..22339fbf2 --- /dev/null +++ b/modules/iquantum/src/main/java/org/iquantum/utils/GraphicalTopoRepr.java @@ -0,0 +1,54 @@ +package org.iquantum.utils; + +import java.util.ArrayList; +import java.util.List; + +import org.graphstream.graph.Graph; +import org.graphstream.graph.Node; +import org.graphstream.graph.implementations.SingleGraph; +import org.iquantum.backends.quantum.qubittopologies.QubitTopology; + +public class GraphicalTopoRepr { + public QubitTopology qubitTopology; + + // public GraphicalTopoRepr() { + // // qubitTopology = qbt; + // // repr(qubitTopology); + // } + + public static void repr(QubitTopology qbt) { + + int nodesSize = qbt.getNumQubits(); + System.setProperty("org.graphstream.ui", "swing"); + Graph graph = new SingleGraph("Graph"); + List edgeIds = new ArrayList<>(); + List qubits = qbt.getQubits(); + for (QubitTopology.Node node : qubits) { + graph.addNode(String.valueOf(node.getQubitIndex())); + } + for (int i = 0; i < nodesSize; i++) { + String bNodeIndex = String.valueOf(qbt.getQubits().get(i).getQubitIndex()); + int neighborsSize = qbt.getQubits().get(i).getNeighbors().size(); + // graph.addNode(bNodeIndex); + for (int j = 0; j < neighborsSize; j++) { + String nNodeIndex = String.valueOf(qbt.getQubits().get(i).getNeighbors().get(j).getQubitIndex()); + String s1 = bNodeIndex.concat(nNodeIndex); + String s2 = nNodeIndex.concat(bNodeIndex); + if (!edgeIds.contains(s1)) { + graph.addEdge(s1, bNodeIndex, nNodeIndex); + edgeIds.add(s1); + edgeIds.add(s2); + } + } + } + + for (Node node : graph) { + node.setAttribute("ui.label", node.getId()); + } + graph.setAttribute("ui.stylesheet", "node {text-alignment: above; text-size: 15px; text-color: Black; }"); + graph.setAttribute("ui.quality"); + graph.setAttribute("ui.antialias"); + graph.display(); + } + +} diff --git a/modules/iquantum/src/main/java/org/iquantum/utils/QTaskExporter.java b/modules/iquantum/src/main/java/org/iquantum/utils/QTaskExporter.java index b2596f352..4e712bdcd 100644 --- a/modules/iquantum/src/main/java/org/iquantum/utils/QTaskExporter.java +++ b/modules/iquantum/src/main/java/org/iquantum/utils/QTaskExporter.java @@ -1,7 +1,5 @@ package org.iquantum.utils; -import org.iquantum.tasks.QTask; - import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; @@ -12,45 +10,55 @@ import java.util.Date; import java.util.List; +import org.iquantum.tasks.QTask; + public class QTaskExporter { public static void printQTaskList(List list) { int size = list.size(); QTask QTask; - String indent = " "; - Log.printLine("========== OUTPUT =========="); - Log.printLine("QTask ID" + indent + "Status" + indent - + "QDCenter" + indent + "QNode ID" + indent + "Execution Time" + indent - + "Start Time" + indent + "Finish Time" + indent + "No.Qubits" + indent + "No.Layers" + indent + "No.Shots" + indent + "Cost ($)" + indent + "Application"); + String indent = " "; + Log.printLine("\n============= OUTPUT =============\n"); + Log.printLine("ID" + indent+ indent + "Status" + indent + indent + + "DCenID" + indent + "NodeID" + indent + "Exec Time" + indent + + "Start Time" + indent + "Finish Time" + indent + "No.Qubits" + indent + "No.Layers" + indent + + "No.Shots" + indent + "Cost ($)" + indent + "Application"); DecimalFormat dft = new DecimalFormat("###.##"); for (int i = 0; i < size; i++) { QTask = list.get(i); - Log.print(indent + QTask.getQTaskId() + indent + indent); + Log.print(formatter(QTask.getQTaskId(),6)); if (QTask.getQTaskStatus() == QTask.SUCCESS) { - Log.print("SUCCESS"); - Log.printLine(indent + indent + QTask.getResourceId() - + indent + indent + indent + QTask.getQNodeId() - + indent + indent + indent + dft.format(QTask.getActualQPUTime()) - + indent + indent + indent + indent + dft.format(QTask.getExecStartTime()) - + indent + indent + indent + dft.format(QTask.getFinishTime()) - + indent + indent + indent + QTask.getNumQubits() - + indent + indent + indent + QTask.getNumLayers() - + indent + indent + indent + QTask.getNumShots() - + indent + indent + indent + dft.format(QTask.getCost()) - + indent + indent + indent + QTask.getApplicationName() - ); + Log.print("SUCCESS "); + Log.printLine(formatter(QTask.getResourceId(),8) + + formatter(QTask.getQNodeId(),8) + + formatter( dft.format(QTask.getActualQPUTime()),11) + + formatter(dft.format(QTask.getExecStartTime()),12) + + formatter(dft.format(QTask.getFinishTime()),13) + + formatter(QTask.getNumQubits(),11) + + formatter(QTask.getNumLayers(),11) + + formatter(QTask.getNumShots(),10) + + formatter(dft.format(QTask.getCost()),10) + + formatter(QTask.getApplicationName(),10)); - } - else { + } else { Log.print("FAILED"); - Log.printLine(indent + indent + QTask.getResourceId() - + indent + indent + indent + QTask.getQNodeId() - + indent + indent + indent + QTask.getQTaskStatusString()); + Log.printLine(formatter(QTask.getResourceId(),10) + + formatter( QTask.getQNodeId(),10) + + formatter(QTask.getQTaskStatusString(),10)); } } } + + public static String formatter(String input,int size) { + return String.format("%-" + size + "s", input); + } + + public static String formatter(int input, int size) { + return String.format("%-" + size + "s", String.valueOf(input)); + } + public static void extractQTaskListToCSV(List list, String fileName) { try { Path outputFolderPath = Paths.get("output"); @@ -65,11 +73,12 @@ public static void extractQTaskListToCSV(List list, String fileName) { QTask QTask; String indent = " "; - String header = "QTask_ID,Status,QDCenter,QNode_ID,Execution_Time,Start_Time,Finish_Time,No_Qubits,No_Layers,Shots,Cost,Application"; + String header = "QTask_ID,Status,QDCenter,QNode_ID,Execution_Time,Start_Time,Finish_Time,Waiting_Time,No_Qubits,No_Layers,Shots,ECL,Cost,Application,Total_waiting_time"; writer.write(header); writer.write(System.lineSeparator()); DecimalFormat dft = new DecimalFormat("###.##"); + double totalWaitingTime = 0; for (int i = 0; i < size; i++) { QTask = list.get(i); StringBuilder lineBuilder = new StringBuilder(); @@ -80,16 +89,29 @@ public static void extractQTaskListToCSV(List list, String fileName) { .append(dft.format(QTask.getActualQPUTime())).append(",") .append(dft.format(QTask.getExecStartTime())).append(",") .append(dft.format(QTask.getFinishTime())).append(",") + .append(dft.format(QTask.getWaitingTime())).append(",") .append(QTask.getNumQubits()).append(",") .append(QTask.getNumLayers()).append(",") .append(QTask.getNumShots()).append(",") + .append(QTask.getNumECL()).append(",") .append(dft.format(QTask.getCost())).append(",") .append(QTask.getApplicationName()); writer.write(lineBuilder.toString()); writer.write(System.lineSeparator()); + // Calculating Total_Waiting_Time + totalWaitingTime += QTask.getWaitingTime(); } - + // writer.append(",,,,,,,,,,,,,,"+String.valueOf(totalWaitingTime)); + // writer.write(System.lineSeparator()); writer.flush(); + // Reading file to add Post_Simulation data + List lines = Files.readAllLines(Paths.get(outputFilePath)); + String firstline = lines.get(1); + lines.set(1, firstline + "," + dft.format(totalWaitingTime)); + Files.write(Paths.get(outputFilePath), lines); + + + } catch (IOException e) { e.printStackTrace(); } diff --git a/modules/iquantum/src/main/java/org/iquantum/utils/QTaskListGui.java b/modules/iquantum/src/main/java/org/iquantum/utils/QTaskListGui.java new file mode 100644 index 000000000..34e3cfdfd --- /dev/null +++ b/modules/iquantum/src/main/java/org/iquantum/utils/QTaskListGui.java @@ -0,0 +1,64 @@ +package org.iquantum.utils; + +import java.text.DecimalFormat; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +import org.iquantum.tasks.QTask; +; + +public class QTaskListGui { + + /** + * Represents the list of QTasks after the simulation + * @param list list of QTasks + */ + public static void showQTaskListInGUI(List list) { + // Column names for the table + String[] columnNames = { + "QTask ID", "Status", "QDCenter", "QNode ID","ECL", + "Execution Time", "Start Time", "Finish Time","Waiting_Time","Total Waiting Time" + }; + + // Prepare table data + DecimalFormat dft = new DecimalFormat("###.##"); + String[][] data = new String[list.size()+1][columnNames.length]; + + long totalWaitingTime = 0; + for (int i = 0; i < list.size(); i++) { + QTask task = list.get(i); + data[i][0] = String.valueOf(task.getQTaskId()); + data[i][1] = (task.getQTaskStatus() == QTask.SUCCESS) ? "SUCCESS" : task.getQTaskStatusString(); + data[i][2] = (task.getResourceId() != 0) ? String.valueOf(task.getResourceId()) : "-"; + data[i][3] = String.valueOf(task.getQNodeId()); + data[i][4] = dft.format(task.getNumECL()); + data[i][5] = dft.format(task.getActualQPUTime()); + data[i][6] = dft.format(task.getExecStartTime()); + data[i][7] = dft.format(task.getFinishTime()); + data[i][8] = dft.format(task.getWaitingTime()); + int arrivalTime = 0; + totalWaitingTime += task.getExecStartTime() - arrivalTime; + } + data[0][9] = dft.format(totalWaitingTime); + + // Create the table model and table + DefaultTableModel tableModel = new DefaultTableModel(data, columnNames); + JTable table = new JTable(tableModel); + + // Create a scroll pane for the table + JScrollPane scrollPane = new JScrollPane(table); + + // Create the main frame + JFrame frame = new JFrame("QTask List"); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frame.setSize(800, 900); + frame.add(scrollPane); + frame.setVisible(true); + frame.setResizable(true); + } + +}