Skip to content

Commit 5734d7e

Browse files
authored
Merge pull request #69 from harshangrjn/minor_updates
Updates: QFT3 added and minor bug fixes
2 parents 946f9c0 + 86cadae commit 5734d7e

15 files changed

+252
-179
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
QuantumCircuitOpt.jl Change Log
22
===============================
33

4+
### v0.5.9
5+
- Catch error in `data.jl` if `set_cnot_lower_bound` > `maximum_depth`
6+
- Feasibility switching warning moved to the correct condition in objective.jl
7+
- Renamed function `get_full_sized_gate` -> `get_unitary`
8+
- Added 3-qubit `QFT3Gate` to gates.jl
9+
- Added `QFT3` circuit using controlled-phase gates in examples
10+
- Updated docs and unit tests to reflect above changes
11+
412
### v0.5.8
513
- Readme update for dark/light theme logo display
614
- Fixed Docs compile issue

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "QuantumCircuitOpt"
22
uuid = "88128e30-b60a-4e54-ab02-1050a5f92a36"
33
authors = ["Harsha Nagarajan"]
4-
version = "0.5.8"
4+
version = "0.5.9"
55

66
[deps]
77
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"

examples/2qubit_gates.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function hadamard()
77
"num_qubits" => 2,
88
"maximum_depth" => 3,
99
"elementary_gates" => ["U3_1", "CNot_1_2", "Identity"],
10-
"target_gate" => QCOpt.get_full_sized_gate("H_1", 2),
10+
"target_gate" => QCOpt.get_unitary("H_1", 2),
1111
"objective" => "minimize_depth",
1212
"decomposition_type" => "exact_optimal",
1313

@@ -152,7 +152,7 @@ function S_using_U3()
152152
"num_qubits" => 2,
153153
"maximum_depth" => 3,
154154
"elementary_gates" => ["U3_1", "U3_2", "CNot_1_2", "Identity"],
155-
"target_gate" => QCOpt.get_full_sized_gate("S_1", 2),
155+
"target_gate" => QCOpt.get_unitary("S_1", 2),
156156
"objective" => "minimize_depth",
157157
"decomposition_type" => "exact_optimal",
158158

@@ -378,9 +378,9 @@ end
378378
function GR_using_R()
379379
println(">>>>> GRGate testing <<<<<")
380380

381-
GR1 = QCOpt.get_full_sized_gate("GR", 2; angle =/6, π/3])
382-
# GR2 = QCOpt.get_full_sized_gate("GR", 2; angle = [π/3, π/6])
383-
CNot_1_2 = QCOpt.get_full_sized_gate("CNot_1_2", 2)
381+
GR1 = QCOpt.get_unitary("GR", 2; angle =/6, π/3])
382+
# GR2 = QCOpt.get_unitary("GR", 2; angle = [π/3, π/6])
383+
CNot_1_2 = QCOpt.get_unitary("CNot_1_2", 2)
384384
T = QCOpt.round_complex_values(GR1 * CNot_1_2)
385385

386386
return Dict{String, Any}(
@@ -405,7 +405,7 @@ function X_using_GR()
405405
"num_qubits" => 2,
406406
"maximum_depth" => 5,
407407
"elementary_gates" => ["GR", "R_1", "R_2", "CZ_1_2", "Identity"],
408-
"target_gate" => QCOpt.get_full_sized_gate("X_1", 2),
408+
"target_gate" => QCOpt.get_unitary("X_1", 2),
409409
"objective" => "minimize_depth",
410410
"decomposition_type" => "exact_optimal",
411411
"GR_θ_discretization" => [-π, -π/2, 0, π/2, π],

examples/3qubit_gates.jl

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ function RX_on_q3()
33
println(">>>>> RX Gate on third qubit using U3Gate <<<<<")
44

55
return Dict{String, Any}(
6-
76
"num_qubits" => 3,
87
"maximum_depth" => 3,
98
"elementary_gates" => ["U3_3", "Identity"],
@@ -42,7 +41,6 @@ function toffoli()
4241
println(">>>>> Toffoli gate <<<<<")
4342

4443
return Dict{String, Any}(
45-
4644
"num_qubits" => 3,
4745
"maximum_depth" => 15,
4846
"elementary_gates" => ["T_1", "T_2", "T_3", "H_3", "CNot_1_2", "CNot_1_3", "CNot_2_3", "Tdagger_1", "Tdagger_2", "Tdagger_3", "Identity"],
@@ -61,7 +59,6 @@ function toffoli_using_kronecker()
6159
println(">>>>> Toffoli gate using Kronecker <<<<<")
6260

6361
return Dict{String, Any}(
64-
6562
"num_qubits" => 3,
6663
"maximum_depth" => 12,
6764
"elementary_gates" => ["T_3", "H_3", "CNot_1_2", "CNot_1_3", "CNot_2_3", "Tdagger_3", "I_1xT_2xT_3", "CNot_1_2xH_3", "T_1xTdagger_2xI_3", "Identity"],
@@ -79,7 +76,6 @@ function toffoli_using_2qubit_gates()
7976
println(">>>>> Toffoli gate with controlled gates <<<<<")
8077

8178
return Dict{String, Any}(
82-
8379
"num_qubits" => 3,
8480
"maximum_depth" => 5,
8581
"elementary_gates" => ["CV_1_3", "CV_2_3", "CV_1_2", "CVdagger_1_3", "CVdagger_2_3", "CVdagger_1_2", "CNot_2_1", "CNot_1_2", "Identity"],
@@ -92,12 +88,11 @@ end
9288
function CNot_1_3()
9389

9490
return Dict{String, Any}(
95-
9691
"num_qubits" => 3,
9792
"maximum_depth" => 8,
9893
# "elementary_gates" => ["CNot_1_2", "CNot_2_3", "Identity"],
9994
"elementary_gates" => ["H_1", "H_3", "H_2", "CNot_2_1", "CNot_3_2", "Identity"],
100-
"target_gate" => QCOpt.get_full_sized_gate("CNot_1_3", 3),
95+
"target_gate" => QCOpt.get_unitary("CNot_1_3", 3),
10196
"objective" => "minimize_depth",
10297
)
10398
end
@@ -132,17 +127,16 @@ function toffoli_left()
132127
# Reference: https://arxiv.org/pdf/0803.2316.pdf
133128

134129
function target_gate()
135-
H_3 = QCOpt.get_full_sized_gate("H_3", 3)
136-
Tdagger_3 = QCOpt.get_full_sized_gate("Tdagger_3", 3)
137-
T_3 = QCOpt.get_full_sized_gate("T_3", 3)
138-
cnot_23 = QCOpt.get_full_sized_gate("CNot_2_3", 3)
139-
CNot_1_3 = QCOpt.get_full_sized_gate("CNot_1_3", 3)
130+
H_3 = QCOpt.get_unitary("H_3", 3)
131+
Tdagger_3 = QCOpt.get_unitary("Tdagger_3", 3)
132+
T_3 = QCOpt.get_unitary("T_3", 3)
133+
cnot_23 = QCOpt.get_unitary("CNot_2_3", 3)
134+
CNot_1_3 = QCOpt.get_unitary("CNot_1_3", 3)
140135

141136
return H_3 * cnot_23 * Tdagger_3 * CNot_1_3 * T_3 * cnot_23 * Tdagger_3
142137
end
143138

144139
return Dict{String, Any}(
145-
146140
"num_qubits" => 3,
147141
"maximum_depth" => 7,
148142
"elementary_gates" => ["H_3", "T_1", "T_2", "T_3", "Tdagger_1", "Tdagger_2", "Tdagger_3", "CNot_1_2", "CNot_2_3", "CNot_1_3", "Identity"],
@@ -157,19 +151,18 @@ function toffoli_right()
157151
# Reference: https://arxiv.org/pdf/0803.2316.pdf
158152

159153
function target_gate()
160-
H_3 = QCOpt.get_full_sized_gate("H_3", 3)
161-
Tdagger_2 = QCOpt.get_full_sized_gate("Tdagger_2", 3)
162-
T_1 = QCOpt.get_full_sized_gate("T_1", 3)
163-
T_2 = QCOpt.get_full_sized_gate("T_2", 3)
164-
T_3 = QCOpt.get_full_sized_gate("T_3", 3)
165-
CNot_1_2 = QCOpt.get_full_sized_gate("CNot_1_2", 3)
166-
CNot_1_3 = QCOpt.get_full_sized_gate("CNot_1_3", 3)
154+
H_3 = QCOpt.get_unitary("H_3", 3)
155+
Tdagger_2 = QCOpt.get_unitary("Tdagger_2", 3)
156+
T_1 = QCOpt.get_unitary("T_1", 3)
157+
T_2 = QCOpt.get_unitary("T_2", 3)
158+
T_3 = QCOpt.get_unitary("T_3", 3)
159+
CNot_1_2 = QCOpt.get_unitary("CNot_1_2", 3)
160+
CNot_1_3 = QCOpt.get_unitary("CNot_1_3", 3)
167161

168162
return CNot_1_3 * T_2 * T_3 * CNot_1_2 * H_3 * T_1 * Tdagger_2 * CNot_1_2
169163
end
170164

171165
return Dict{String, Any}(
172-
173166
"num_qubits" => 3,
174167
"maximum_depth" => 8,
175168
"elementary_gates" => ["H_3", "T_1", "T_2", "T_3", "Tdagger_1", "Tdagger_2", "Tdagger_3", "CNot_1_2", "CNot_2_3", "CNot_1_3", "Identity"],
@@ -182,18 +175,17 @@ function miller()
182175
# Reference: https://doi.org/10.1109/TCAD.2005.858352
183176

184177
function target_gate()
185-
CV_1_3 = QCOpt.get_full_sized_gate("CV_1_3", 3)
186-
CV_2_3 = QCOpt.get_full_sized_gate("CV_2_3", 3)
187-
CVdagger_2_3 = QCOpt.get_full_sized_gate("CVdagger_2_3", 3)
188-
CNot_1_2 = QCOpt.get_full_sized_gate("CNot_1_2", 3)
189-
CNot_3_1 = QCOpt.get_full_sized_gate("CNot_3_1", 3)
190-
CNot_3_2 = QCOpt.get_full_sized_gate("CNot_3_2", 3)
178+
CV_1_3 = QCOpt.get_unitary("CV_1_3", 3)
179+
CV_2_3 = QCOpt.get_unitary("CV_2_3", 3)
180+
CVdagger_2_3 = QCOpt.get_unitary("CVdagger_2_3", 3)
181+
CNot_1_2 = QCOpt.get_unitary("CNot_1_2", 3)
182+
CNot_3_1 = QCOpt.get_unitary("CNot_3_1", 3)
183+
CNot_3_2 = QCOpt.get_unitary("CNot_3_2", 3)
191184

192185
return CNot_3_1 * CNot_3_2 * CV_2_3 * CNot_1_2 * CVdagger_2_3 * CV_1_3 * CNot_3_1 * CNot_1_2
193186
end
194187

195188
return Dict{String, Any}(
196-
197189
"num_qubits" => 3,
198190
"maximum_depth" => 8,
199191
"elementary_gates" => ["CV_1_3", "CV_2_3", "CVdagger_2_3", "CNot_1_2", "CNot_3_1", "CNot_3_2", "Identity"],
@@ -206,7 +198,6 @@ function relative_toffoli()
206198
#Reference: https://arxiv.org/pdf/1508.03273.pdf
207199

208200
return Dict{String, Any}(
209-
210201
"num_qubits" => 3,
211202
"maximum_depth" => 9,
212203
"elementary_gates" => ["H_3", "T_3", "Tdagger_3", "CNot_1_2", "CNot_2_3", "CNot_1_3", "Identity"],
@@ -221,7 +212,6 @@ function margolus()
221212
#Reference: https://arxiv.org/pdf/quant-ph/0312225.pdf
222213

223214
return Dict{String, Any}(
224-
225215
"num_qubits" => 3,
226216
"maximum_depth" => 7,
227217
"elementary_gates" => ["RY_3", "CNot_1_2", "CNot_2_3", "CNot_1_3", "Identity"],
@@ -238,12 +228,28 @@ function CiSwap()
238228
#Reference: https://doi.org/10.1103/PhysRevResearch.2.033097
239229

240230
return Dict{String, Any}(
241-
242231
"num_qubits" => 3,
243232
"maximum_depth" => 12,
244233
"elementary_gates" => ["H_3", "T_3", "Tdagger_3", "CNot_3_2", "CNot_2_3", "CNot_1_3", "Identity"],
245234
"target_gate" => QCOpt.CiSwapGate(),
246235
"objective" => "minimize_depth",
247236
"decomposition_type" => "exact_optimal",
248237
)
238+
end
239+
240+
function QFT3()
241+
242+
# QFT3 circuit using Controlled-Phase gates
243+
return Dict{String, Any}(
244+
"num_qubits" => 3,
245+
"maximum_depth" => 7,
246+
# "elementary_gates" => ["H_1", "H_2", "H_3", "CS_2_1", "CS_3_2", "CT_3_1", "Swap_1_3", "Identity"],
247+
"elementary_gates" => ["H_1", "H_2", "H_3", "CU3_2_1", "CU3_3_2", "CU3_3_1", "Swap_1_3", "Identity"],
248+
"CU3_θ_discretization" => [0],
249+
"CU3_ϕ_discretization" => [0],
250+
"CU3_λ_discretization" =>/2, π/4],
251+
"target_gate" => QCOpt.QFT3Gate(),
252+
"objective" => "minimize_depth",
253+
"decomposition_type" => "exact_optimal",
254+
)
249255
end

examples/4qubit_gates.jl

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ function CNot_41()
66
"num_qubits" => 4,
77
"maximum_depth" => 10,
88
"elementary_gates" => ["H_1", "H_2", "H_3", "CNot_1_3", "CNot_4_3", "Identity"],
9-
"target_gate" => QCOpt.get_full_sized_gate("CNot_4_1", 4),
9+
"target_gate" => QCOpt.get_unitary("CNot_4_1", 4),
1010
"objective" => "minimize_depth",
1111
"decomposition_type" => "exact_optimal"
1212
)
@@ -20,13 +20,13 @@ function quantum_fulladder()
2020

2121
function target_gate_1()
2222

23-
CV_1_2 = QCOpt.get_full_sized_gate("CV_1_2", num_qubits);
24-
CV_4_2 = QCOpt.get_full_sized_gate("CV_4_2", num_qubits);
25-
CVdagger_1_2 = QCOpt.get_full_sized_gate("CVdagger_1_2", num_qubits);
26-
CVdagger_3_2 = QCOpt.get_full_sized_gate("CVdagger_3_2", num_qubits);
27-
CNot_3_1 = QCOpt.get_full_sized_gate("CNot_3_1", num_qubits);
28-
CNot_4_3 = QCOpt.get_full_sized_gate("CNot_4_3", num_qubits);
29-
CNot_2_4 = QCOpt.get_full_sized_gate("CNot_2_4", num_qubits);
23+
CV_1_2 = QCOpt.get_unitary("CV_1_2", num_qubits);
24+
CV_4_2 = QCOpt.get_unitary("CV_4_2", num_qubits);
25+
CVdagger_1_2 = QCOpt.get_unitary("CVdagger_1_2", num_qubits);
26+
CVdagger_3_2 = QCOpt.get_unitary("CVdagger_3_2", num_qubits);
27+
CNot_3_1 = QCOpt.get_unitary("CNot_3_1", num_qubits);
28+
CNot_4_3 = QCOpt.get_unitary("CNot_4_3", num_qubits);
29+
CNot_2_4 = QCOpt.get_unitary("CNot_2_4", num_qubits);
3030

3131
return CNot_2_4 * CV_4_2 * CVdagger_1_2 * CVdagger_3_2 * CNot_4_3 * CNot_3_1 * CV_1_2
3232
end
@@ -49,11 +49,11 @@ function double_toffoli()
4949
num_qubits = 4
5050

5151
function target_gate()
52-
CV_3_4 = QCOpt.get_full_sized_gate("CV_3_4", num_qubits);
53-
CV_2_4 = QCOpt.get_full_sized_gate("CV_2_4", num_qubits);
54-
CVdagger_2_4 = QCOpt.get_full_sized_gate("CVdagger_2_4", num_qubits);
55-
CNot_1_3 = QCOpt.get_full_sized_gate("CNot_1_3", num_qubits);
56-
CNot_3_2 = QCOpt.get_full_sized_gate("CNot_3_2", num_qubits);
52+
CV_3_4 = QCOpt.get_unitary("CV_3_4", num_qubits);
53+
CV_2_4 = QCOpt.get_unitary("CV_2_4", num_qubits);
54+
CVdagger_2_4 = QCOpt.get_unitary("CVdagger_2_4", num_qubits);
55+
CNot_1_3 = QCOpt.get_unitary("CNot_1_3", num_qubits);
56+
CNot_3_2 = QCOpt.get_unitary("CNot_3_2", num_qubits);
5757

5858
return CV_2_4 * CNot_1_3 * CNot_3_2 * CV_3_4 * CVdagger_2_4 * CNot_3_2 * CNot_1_3
5959
end
@@ -76,12 +76,12 @@ function double_peres()
7676
num_qubits = 4
7777

7878
function target_gate()
79-
CV_1_4 = QCOpt.get_full_sized_gate("CV_1_4", num_qubits);
80-
CV_2_4 = QCOpt.get_full_sized_gate("CV_2_4", num_qubits);
81-
CV_3_4 = QCOpt.get_full_sized_gate("CV_3_4", num_qubits);
82-
CVdagger_3_4 = QCOpt.get_full_sized_gate("CVdagger_3_4", num_qubits);
83-
CNot_1_2 = QCOpt.get_full_sized_gate("CNot_1_2", num_qubits);
84-
CNot_2_3 = QCOpt.get_full_sized_gate("CNot_2_3", num_qubits);
79+
CV_1_4 = QCOpt.get_unitary("CV_1_4", num_qubits);
80+
CV_2_4 = QCOpt.get_unitary("CV_2_4", num_qubits);
81+
CV_3_4 = QCOpt.get_unitary("CV_3_4", num_qubits);
82+
CVdagger_3_4 = QCOpt.get_unitary("CVdagger_3_4", num_qubits);
83+
CNot_1_2 = QCOpt.get_unitary("CNot_1_2", num_qubits);
84+
CNot_2_3 = QCOpt.get_unitary("CNot_2_3", num_qubits);
8585

8686
return CV_2_4 * CNot_1_2 * CV_3_4 * CV_1_4 * CNot_2_3 * CVdagger_3_4
8787
end

examples/gates_sc21.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,11 @@ function double_toffoli()
201201
num_qubits = 4
202202

203203
function target_gate()
204-
CV_3_4 = QCOpt.get_full_sized_gate("CV_3_4", num_qubits);
205-
CV_2_4 = QCOpt.get_full_sized_gate("CV_2_4", num_qubits);
206-
CVdagger_2_4 = QCOpt.get_full_sized_gate("CVdagger_2_4", num_qubits);
207-
CNot_1_3 = QCOpt.get_full_sized_gate("CNot_1_3", num_qubits);
208-
CNot_3_2 = QCOpt.get_full_sized_gate("CNot_3_2", num_qubits);
204+
CV_3_4 = QCOpt.get_unitary("CV_3_4", num_qubits);
205+
CV_2_4 = QCOpt.get_unitary("CV_2_4", num_qubits);
206+
CVdagger_2_4 = QCOpt.get_unitary("CVdagger_2_4", num_qubits);
207+
CNot_1_3 = QCOpt.get_unitary("CNot_1_3", num_qubits);
208+
CNot_3_2 = QCOpt.get_unitary("CNot_3_2", num_qubits);
209209

210210
return CV_2_4 * CNot_1_3 * CNot_3_2 * CV_3_4 * CVdagger_2_4 * CNot_3_2 * CNot_1_3
211211
end
@@ -229,13 +229,13 @@ function quantum_fulladder()
229229

230230
function target_gate()
231231

232-
CV_1_2 = QCOpt.get_full_sized_gate("CV_1_2", num_qubits);
233-
CV_4_2 = QCOpt.get_full_sized_gate("CV_4_2", num_qubits);
234-
CVdagger_1_2 = QCOpt.get_full_sized_gate("CVdagger_1_2", num_qubits);
235-
CVdagger_3_2 = QCOpt.get_full_sized_gate("CVdagger_3_2", num_qubits);
236-
CNot_3_1 = QCOpt.get_full_sized_gate("CNot_3_1", num_qubits);
237-
CNot_4_3 = QCOpt.get_full_sized_gate("CNot_4_3", num_qubits);
238-
CNot_2_4 = QCOpt.get_full_sized_gate("CNot_2_4", num_qubits);
232+
CV_1_2 = QCOpt.get_unitary("CV_1_2", num_qubits);
233+
CV_4_2 = QCOpt.get_unitary("CV_4_2", num_qubits);
234+
CVdagger_1_2 = QCOpt.get_unitary("CVdagger_1_2", num_qubits);
235+
CVdagger_3_2 = QCOpt.get_unitary("CVdagger_3_2", num_qubits);
236+
CNot_3_1 = QCOpt.get_unitary("CNot_3_1", num_qubits);
237+
CNot_4_3 = QCOpt.get_unitary("CNot_4_3", num_qubits);
238+
CNot_2_4 = QCOpt.get_unitary("CNot_2_4", num_qubits);
239239

240240
return CNot_2_4 * CV_4_2 * CVdagger_1_2 * CVdagger_3_2 * CNot_4_3 * CNot_3_1 * CV_1_2
241241
end

0 commit comments

Comments
 (0)