Skip to content

Commit c461dfe

Browse files
committed
Add problem fetching from files for tests and configs
Merge circuit execution files
1 parent a76802f commit c461dfe

15 files changed

Lines changed: 236 additions & 174 deletions

File tree

solvers/circuitprocessing/circuitexecution/aer-noisy/aer_noisy_executor.py

Lines changed: 0 additions & 34 deletions
This file was deleted.

solvers/circuitprocessing/circuitexecution/default-executor/default_executor.py

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import sys
2+
from pytket.qasm import circuit_from_qasm_str
3+
4+
input_path = sys.argv[1]
5+
num_runs = int(sys.argv[2])
6+
backend_name = sys.argv[3]
7+
8+
with open(input_path, 'r') as input_file:
9+
text = input_file.read()
10+
11+
try:
12+
circuit = circuit_from_qasm_str(text)
13+
except Exception as e:
14+
print("Was not able to convert to OpenQASM: ", e)
15+
sys.exit(1)
16+
17+
if backend_name == "aer":
18+
from pytket.extensions.qiskit import AerBackend
19+
backend = AerBackend()
20+
elif backend_name == "qulacs":
21+
from pytket.extensions.qulacs import QulacsBackend
22+
backend = QulacsBackend()
23+
elif backend_name == "aer_noisy":
24+
from pytket.extensions.qiskit import AerBackend
25+
from qiskit_aer.noise import NoiseModel
26+
from qiskit_aer.noise.errors import depolarizing_error
27+
# https://docs.quantinuum.com/tket/user-guide/manual/manual_noise.html
28+
noise_model = NoiseModel()
29+
noise_model.add_readout_error([[0.9, 0.1], [0.1, 0.9]], [0])
30+
noise_model.add_readout_error([[0.95, 0.05], [0.05, 0.95]], [1])
31+
noise_model.add_quantum_error(depolarizing_error(0.1, 2), ["cx"], [0, 1])
32+
backend = AerBackend(noise_model)
33+
else:
34+
print(f"Unknown backend: {backend_name}", file=sys.stderr)
35+
sys.exit(1)
36+
37+
c = backend.get_compiled_circuit(circuit)
38+
handle = backend.process_circuit(c, n_shots=num_runs)
39+
counts = backend.get_result(handle).get_counts()
40+
print(counts)

solvers/circuitprocessing/circuitexecution/qulacs-executor/qulacs_executor.py

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package edu.kit.provideq.toolbox.circuit.processing;
22

3+
import edu.kit.provideq.toolbox.ResourceProvider;
34
import edu.kit.provideq.toolbox.circuit.processing.solver.MoveToExecutionSolver;
45
import edu.kit.provideq.toolbox.circuit.processing.solver.MoveToMitigationSolver;
56
import edu.kit.provideq.toolbox.circuit.processing.solver.MoveToOptimizationSolver;
7+
import edu.kit.provideq.toolbox.exception.MissingExampleException;
68
import edu.kit.provideq.toolbox.meta.Problem;
79
import edu.kit.provideq.toolbox.meta.ProblemManager;
810
import edu.kit.provideq.toolbox.meta.ProblemType;
11+
import java.io.IOException;
12+
import java.util.HashSet;
13+
import java.util.Objects;
914
import java.util.Set;
1015
import org.springframework.context.annotation.Bean;
1116
import org.springframework.context.annotation.Configuration;
@@ -22,36 +27,36 @@ public class CircuitProcessingConfiguration {
2227

2328
@Bean
2429
ProblemManager<String, String> getCircuitProcessingManager(
30+
ResourceProvider provider,
2531
MoveToExecutionSolver moveToExecutionSolver,
2632
MoveToOptimizationSolver moveToOptimizationSolver,
2733
MoveToMitigationSolver moveToMitigationSolver
2834
) {
29-
Problem<String, String> demo = new Problem<>(CIRCUIT_PROCESSING);
30-
demo.setInput("""
31-
OPENQASM 2.0;
32-
include "qelib1.inc";
33-
qreg q[2];
34-
creg c[2];
35-
h q[0];
36-
cx q[0],q[1];
37-
measure q[0] -> c[0];
38-
measure q[1] -> c[1];""");
39-
Problem<String, String> secondDemo = new Problem<>(CIRCUIT_PROCESSING);
40-
secondDemo.setInput("""
41-
OPENQASM 2.0;
42-
include "qelib1.inc";
43-
qreg q[3];
44-
crz(0.5) q[0], q[1];
45-
t q[2];
46-
cswap q[2], q[0], q[1];""");
4735
return new ProblemManager<>(
4836
CIRCUIT_PROCESSING,
4937
Set.of(
5038
moveToExecutionSolver,
5139
moveToOptimizationSolver,
5240
moveToMitigationSolver
5341
),
54-
Set.of(demo, secondDemo)
42+
loadExampleProblems(provider)
5543
);
5644
}
45+
46+
private Set<Problem<String, String>> loadExampleProblems(ResourceProvider provider) {
47+
try {
48+
String[] problemNames = new String[] {"bell-state.qasm", "cswap.qasm"};
49+
var problemSet = new HashSet<Problem<String, String>>();
50+
for (var problemName : problemNames) {
51+
var problemStream = Objects.requireNonNull(
52+
getClass().getResourceAsStream(problemName), "Problem " + problemName + " not found");
53+
var problem = new Problem<>(CIRCUIT_PROCESSING);
54+
problem.setInput(provider.readStream(problemStream));
55+
problemSet.add(problem);
56+
}
57+
return problemSet;
58+
} catch (IOException e) {
59+
throw new MissingExampleException(CIRCUIT_PROCESSING, e);
60+
}
61+
}
5762
}

src/main/java/edu/kit/provideq/toolbox/circuit/processing/solver/executor/ExecutionSolver.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ public Mono<Solution<ExecutionResult>> solve(
8787
.orElse(DEFAULT_SIMULATOR);
8888

8989
var processResult = context
90-
.getBean(PythonProcessRunner.class, scriptPath + selectedSimulator.getScriptPath(), venv)
90+
.getBean(PythonProcessRunner.class, scriptPath + "executor.py", venv)
9191
.withArguments(
9292
ProcessRunner.INPUT_FILE_PATH,
93-
String.valueOf(shotNumber)
93+
String.valueOf(shotNumber),
94+
selectedSimulator.getBackendKey()
9495
)
9596
.writeInputFile(input)
9697
.readOutputString()
@@ -112,25 +113,25 @@ public ProblemType<String, ExecutionResult> getProblemType() {
112113
}
113114

114115
enum QuantumSimulator {
115-
AER("AerBackend", "default-executor/default_executor.py"),
116-
// PROJECTQ("ProjectQBackend", "projectq-executor/projectq_executor.py"),
117-
QULACS("QulacsBackend", "qulacs-executor/qulacs_executor.py"),
118-
AER_NOISY("Aer Noisy Backend (max. 2 qubits)", "aer-noisy/aer_noisy_executor.py");
116+
AER("AerBackend", "aer"),
117+
// PROJECTQ("ProjectQBackend", "projectq"),
118+
QULACS("QulacsBackend", "qulacs"),
119+
AER_NOISY("Aer Noisy Backend (max. 2 qubits)", "aer_noisy");
119120

120121
private final String value;
121-
private final String scriptPath;
122+
private final String backendKey;
122123

123-
QuantumSimulator(String value, String scriptPath) {
124+
QuantumSimulator(String value, String backendKey) {
124125
this.value = value;
125-
this.scriptPath = scriptPath;
126+
this.backendKey = backendKey;
126127
}
127128

128129
public String getValue() {
129130
return value;
130131
}
131132

132-
public String getScriptPath() {
133-
return scriptPath;
133+
public String getBackendKey() {
134+
return backendKey;
134135
}
135136

136137
public static QuantumSimulator fromValue(String value) {

src/main/java/edu/kit/provideq/toolbox/circuit/processing/solver/executor/ExecutorConfiguration.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package edu.kit.provideq.toolbox.circuit.processing.solver.executor;
22

3+
import edu.kit.provideq.toolbox.ResourceProvider;
4+
import edu.kit.provideq.toolbox.exception.MissingExampleException;
35
import edu.kit.provideq.toolbox.meta.Problem;
46
import edu.kit.provideq.toolbox.meta.ProblemManager;
57
import edu.kit.provideq.toolbox.meta.ProblemType;
8+
import java.io.IOException;
9+
import java.util.Objects;
610
import java.util.Set;
711
import org.springframework.context.annotation.Bean;
812
import org.springframework.context.annotation.Configuration;
@@ -19,14 +23,25 @@ public class ExecutorConfiguration {
1923

2024
@Bean
2125
ProblemManager<String, ExecutionResult> getExecutorProblemManager(
26+
ResourceProvider provider,
2227
ExecutionSolver executionSolver
2328
) {
2429
return new ProblemManager<>(
2530
EXECUTOR_CONFIG,
26-
Set.of(
27-
executionSolver
28-
),
29-
Set.of(new Problem<>(EXECUTOR_CONFIG))
31+
Set.of(executionSolver),
32+
loadExampleProblems(provider)
3033
);
3134
}
35+
36+
private Set<Problem<String, ExecutionResult>> loadExampleProblems(ResourceProvider provider) {
37+
try {
38+
var problemStream = Objects.requireNonNull(
39+
getClass().getResourceAsStream("../../bell-state.qasm"), "Problem bell-state.qasm not found");
40+
var problem = new Problem<>(EXECUTOR_CONFIG);
41+
problem.setInput(provider.readStream(problemStream));
42+
return Set.of(problem);
43+
} catch (IOException e) {
44+
throw new MissingExampleException(EXECUTOR_CONFIG, e);
45+
}
46+
}
3247
}

src/main/java/edu/kit/provideq/toolbox/circuit/processing/solver/mitigation/ErrorMitigationConfiguration.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package edu.kit.provideq.toolbox.circuit.processing.solver.mitigation;
22

3+
import edu.kit.provideq.toolbox.ResourceProvider;
4+
import edu.kit.provideq.toolbox.exception.MissingExampleException;
35
import edu.kit.provideq.toolbox.meta.Problem;
46
import edu.kit.provideq.toolbox.meta.ProblemManager;
57
import edu.kit.provideq.toolbox.meta.ProblemType;
8+
import java.io.IOException;
9+
import java.util.Objects;
610
import java.util.Set;
711
import org.springframework.context.annotation.Bean;
812
import org.springframework.context.annotation.Configuration;
@@ -19,14 +23,25 @@ public class ErrorMitigationConfiguration {
1923

2024
@Bean
2125
ProblemManager<String, String> getMitigationProblemManager(
26+
ResourceProvider provider,
2227
ErrorMitigationSolver errorMitigationSolver
2328
) {
2429
return new ProblemManager<>(
2530
MITIGATION_CONFIG,
26-
Set.of(
27-
errorMitigationSolver
28-
),
29-
Set.of(new Problem<>(MITIGATION_CONFIG))
31+
Set.of(errorMitigationSolver),
32+
loadExampleProblems(provider)
3033
);
3134
}
35+
36+
private Set<Problem<String, String>> loadExampleProblems(ResourceProvider provider) {
37+
try {
38+
var problemStream = Objects.requireNonNull(
39+
getClass().getResourceAsStream("../../bell-state.qasm"), "Problem bell-state.qasm not found");
40+
var problem = new Problem<>(MITIGATION_CONFIG);
41+
problem.setInput(provider.readStream(problemStream));
42+
return Set.of(problem);
43+
} catch (IOException e) {
44+
throw new MissingExampleException(MITIGATION_CONFIG, e);
45+
}
46+
}
3247
}

src/main/java/edu/kit/provideq/toolbox/circuit/processing/solver/optimization/OptimizationConfiguration.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package edu.kit.provideq.toolbox.circuit.processing.solver.optimization;
22

3+
import edu.kit.provideq.toolbox.ResourceProvider;
4+
import edu.kit.provideq.toolbox.exception.MissingExampleException;
35
import edu.kit.provideq.toolbox.meta.Problem;
46
import edu.kit.provideq.toolbox.meta.ProblemManager;
57
import edu.kit.provideq.toolbox.meta.ProblemType;
8+
import java.io.IOException;
9+
import java.util.Objects;
610
import java.util.Set;
711
import org.springframework.context.annotation.Bean;
812
import org.springframework.context.annotation.Configuration;
@@ -19,14 +23,25 @@ public class OptimizationConfiguration {
1923

2024
@Bean
2125
ProblemManager<String, String> getOptimizationProblemManager(
26+
ResourceProvider provider,
2227
OptimizationSolver optimizationSolver
2328
) {
2429
return new ProblemManager<>(
2530
OPTIMIZATION_CONFIG,
26-
Set.of(
27-
optimizationSolver
28-
),
29-
Set.of(new Problem<>(OPTIMIZATION_CONFIG))
31+
Set.of(optimizationSolver),
32+
loadExampleProblems(provider)
3033
);
3134
}
35+
36+
private Set<Problem<String, String>> loadExampleProblems(ResourceProvider provider) {
37+
try {
38+
var problemStream = Objects.requireNonNull(
39+
getClass().getResourceAsStream("../../bell-state.qasm"), "Problem bell-state.qasm not found");
40+
var problem = new Problem<>(OPTIMIZATION_CONFIG);
41+
problem.setInput(provider.readStream(problemStream));
42+
return Set.of(problem);
43+
} catch (IOException e) {
44+
throw new MissingExampleException(OPTIMIZATION_CONFIG, e);
45+
}
46+
}
3247
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
OPENQASM 2.0;
2+
include "qelib1.inc";
3+
qreg q[2];
4+
creg c[2];
5+
h q[0];
6+
cx q[0],q[1];
7+
measure q[0] -> c[0];
8+
measure q[1] -> c[1];

0 commit comments

Comments
 (0)