4 Created on Tue Jun 30 15:44:26 2020 5 Copyright 2020 Peter Rakyta, Ph.D. 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 11 http://www.apache.org/licenses/LICENSE-2.0 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see http://www.gnu.org/licenses/. 22 @author: Peter Rakyta, Ph.D. 33 from squander.gates.gates_Wrapper
import (
58 """Extract scalar value from array or return as is""" 59 return param.item()
if hasattr(param,
'item')
else param
68 from qiskit
import QuantumCircuit
71 circuit = QuantumCircuit(Squander_circuit.get_Qbit_Num() )
73 gates = Squander_circuit.get_Gates()
78 if isinstance( gate, CNOT ):
80 circuit.cx( gate.get_Control_Qbit(), gate.get_Target_Qbit() )
82 elif isinstance( gate, CRY ):
84 parameters_gate = gate.Extract_Parameters( parameters )
85 circuit.cry( parameters_gate[0], gate.get_Control_Qbit(), gate.get_Target_Qbit() )
87 elif isinstance( gate, CZ ):
89 circuit.cz( gate.get_Control_Qbit(), gate.get_Target_Qbit() )
91 elif isinstance( gate, CH ):
93 circuit.ch( gate.get_Control_Qbit(), gate.get_Target_Qbit() )
95 elif isinstance( gate, SYC ):
97 print(
"Unsupported gate in the circuit export: Sycamore gate")
100 elif isinstance( gate, U1 ):
102 parameters_gate = gate.Extract_Parameters( parameters )
103 circuit.p( parameters_gate[0], gate.get_Target_Qbit() )
105 elif isinstance( gate, U2 ):
107 parameters_gate = gate.Extract_Parameters( parameters )
108 circuit.u( np.pi/2, parameters_gate[0], parameters_gate[1], gate.get_Target_Qbit() )
110 elif isinstance( gate, U3 ):
112 parameters_gate = gate.Extract_Parameters( parameters )
113 circuit.u( parameters_gate[0], parameters_gate[1], parameters_gate[2], gate.get_Target_Qbit() )
115 elif isinstance( gate, RX ):
117 parameters_gate = gate.Extract_Parameters( parameters )
118 circuit.rx( parameters_gate[0], gate.get_Target_Qbit() )
120 elif isinstance( gate, RY ):
122 parameters_gate = gate.Extract_Parameters( parameters )
123 circuit.ry( parameters_gate[0], gate.get_Target_Qbit() )
125 elif isinstance( gate, RZ ):
127 parameters_gate = gate.Extract_Parameters( parameters )
128 circuit.rz( parameters_gate[0], gate.get_Target_Qbit() )
130 elif isinstance( gate, R ):
132 parameters_gate = gate.Extract_Parameters( parameters )
133 circuit.r( parameters_gate[0],parameters_gate[1], gate.get_Target_Qbit() )
134 elif isinstance( gate, H ):
136 circuit.h( gate.get_Target_Qbit() )
138 elif isinstance( gate, X ):
140 circuit.x( gate.get_Target_Qbit() )
142 elif isinstance( gate, Y ):
144 circuit.y( gate.get_Target_Qbit() )
146 elif isinstance( gate, Z ):
148 circuit.z( gate.get_Target_Qbit() )
150 elif isinstance( gate, SX ):
152 circuit.sx( gate.get_Target_Qbit() )
154 elif isinstance( gate, T ):
156 circuit.t( gate.get_Target_Qbit() )
158 elif isinstance( gate, Tdg ):
160 circuit.tdg( gate.get_Target_Qbit() )
162 elif isinstance( gate, Circuit ):
164 raise ValueError(
"Qiskit export of circuits with subcircuit is not supported. Use Circuit::get_Flat_Circuit prior of exporting circuit.")
168 raise ValueError(
"Unsupported gate in the circuit export.")
179 from qiskit
import QuantumCircuit
182 circuit = QuantumCircuit(Squander_circuit.get_Qbit_Num() )
184 gates = Squander_circuit.get_Gates()
187 for idx
in range(len(gates)-1, -1, -1):
191 if isinstance( gate, CNOT ):
193 circuit.cx( gate.get_Control_Qbit(), gate.get_Target_Qbit() )
195 elif isinstance( gate, CRY ):
197 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
198 circuit.cry( -parameters_gate[0], gate.get_Control_Qbit(), gate.get_Target_Qbit() )
199 elif isinstance( gate, R ):
201 parameters_gate = gate.Extract_Parameters( parameters )
202 circuit.r( -parameters_gate[0],parameters_gate[1], gate.get_Target_Qbit() )
203 elif isinstance( gate, CZ ):
205 circuit.cz( gate.get_Control_Qbit(), gate.get_Target_Qbit() )
207 elif isinstance( gate, CH ):
209 circuit.ch( gate.get_Control_Qbit(), gate.get_Target_Qbit() )
211 elif isinstance( gate, SYC ):
213 print(
"Unsupported gate in the circuit export: Sycamore gate")
216 elif isinstance( gate, U1 ):
218 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
219 circuit.p( -parameters_gate[0], gate.get_Target_Qbit() )
221 elif isinstance( gate, U2 ):
223 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
224 circuit.u( -np.pi/2, -parameters_gate[0], -parameters_gate[1], gate.get_Target_Qbit() )
226 elif isinstance( gate, U3 ):
228 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
229 circuit.u( -parameters_gate[0], -parameters_gate[2], -parameters_gate[1], gate.get_Target_Qbit() )
231 elif isinstance( gate, RX ):
233 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
234 circuit.rx( -parameters_gate[0], gate.get_Target_Qbit() )
236 elif isinstance( gate, RY ):
238 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
239 circuit.ry( -parameters_gate[0], gate.get_Target_Qbit() )
241 elif isinstance( gate, RZ ):
243 parameters_gate = [
scalar(p)
for p
in gate.Extract_Parameters( parameters )]
244 circuit.rz( -parameters_gate[0], gate.get_Target_Qbit() )
246 elif isinstance( gate, H ):
248 circuit.h( gate.get_Target_Qbit() )
250 elif isinstance( gate, X ):
252 circuit.x( gate.get_Target_Qbit() )
254 elif isinstance( gate, Y ):
256 circuit.y( gate.get_Target_Qbit() )
258 elif isinstance( gate, Z ):
260 circuit.z( gate.get_Target_Qbit() )
262 elif isinstance( gate, SX ):
264 circuit.sx( gate.get_Target_Qbit() )
266 elif isinstance( gate, T ):
268 circuit.tdg( gate.get_Target_Qbit() )
270 elif isinstance( gate, Tdg ):
272 circuit.t( gate.get_Target_Qbit() )
274 elif isinstance( gate, Circuit ):
276 raise ValueError(
"Qiskit export of circuits with subcircuit is not supported. Use Circuit::get_Flat_Circuit prior of exporting circuit.")
280 raise ValueError(
"Unsupported gate in the circuit export.")
291 from qiskit
import QuantumCircuit
292 from qiskit.circuit
import ParameterExpression
298 q_register = qc_in.qubits
301 register_size = qc_in.num_qubits
304 Circuit_Squander = Circuit(register_size)
307 for gate
in qc_in.data:
309 name = gate.operation.name
311 if name ==
'u1' or name ==
'p':
314 qubit = q_register.index( qubits[0] )
316 params = gate.operation.params
319 parameters = parameters + [float(param)]
321 Circuit_Squander.add_U1( qubit )
326 qubit = q_register.index( qubits[0] )
328 params = gate.operation.params
331 parameters = parameters + [float(param)]
333 Circuit_Squander.add_U2( qubit )
335 elif name ==
'u3' or name ==
'u': 338 qubit = q_register.index( qubits[0] )
340 params = gate.operation.params
341 params[0] = params[0]/2
344 parameters = parameters + [float(param)]
346 Circuit_Squander.add_U3( qubit )
351 qubit0 = q_register.index( qubits[0] )
352 qubit1 = q_register.index( qubits[1] )
353 Circuit_Squander.add_CNOT( qubit1, qubit0 )
358 qubit0 = q_register.index( qubits[0] )
359 qubit1 = q_register.index( qubits[1] )
361 params = gate.operation.params
362 params[0] = params[0]/2
365 parameters = parameters + [float(param)]
367 Circuit_Squander.add_CRY( qubit1, qubit0 )
371 qubit0 = q_register.index( qubits[0] )
372 qubit1 = q_register.index( qubits[1] )
373 Circuit_Squander.add_CZ( qubit1, qubit0 )
377 qubit0 = q_register.index( qubits[0] )
378 qubit1 = q_register.index( qubits[1] )
379 Circuit_Squander.add_CH( qubit1, qubit0 )
383 qubit = q_register.index( qubits[0] )
385 params = gate.operation.params
386 params[0] = params[0]/2
389 parameters = parameters + [float(param)]
391 Circuit_Squander.add_RX( qubit )
395 qubit = q_register.index( qubits[0] )
397 params = gate.operation.params
398 params[0] = params[0]/2
401 parameters = parameters + [float(param)]
403 Circuit_Squander.add_RY( qubit )
407 qubit = q_register.index( qubits[0] )
409 params = gate.operation.params
410 params[0] = params[0]/2
413 parameters = parameters + [float(param)]
415 Circuit_Squander.add_RZ( qubit )
419 qubit = q_register.index( qubits[0] )
421 Circuit_Squander.add_H( qubit )
425 qubit = q_register.index( qubits[0] )
427 Circuit_Squander.add_X( qubit )
431 qubit = q_register.index( qubits[0] )
433 Circuit_Squander.add_Y( qubit )
437 qubit = q_register.index( qubits[0] )
439 Circuit_Squander.add_Z( qubit )
443 qubit = q_register.index( qubits[0] )
445 Circuit_Squander.add_SX( qubit )
449 qubit = q_register.index( qubits[0] )
451 Circuit_Squander.add_T( qubit )
455 qubit = q_register.index( qubits[0] )
457 Circuit_Squander.add_Tdg( qubit )
461 qubit = q_register.index( qubits[0] ) 463 params = gate.operation.params 464 params[0] = params[0]/2 467 parameters = parameters + [float(param)]
469 Circuit_Squander.add_R( qubit )
472 print(f
"convert_Qiskit_to_Squander: Unimplemented gate: {name}")
475 parameters = np.asarray(parameters, dtype=np.float64)
477 return Circuit_Squander, parameters
def convert_Qiskit_to_Squander(qc_in)
Call to import initial quantum circuit in QISKIT format to be further comporessed.
def get_Qiskit_Circuit_inverse(Squander_circuit, parameters)
Export the inverse of a Squsnder circuit into Qiskit circuit.
def get_Qiskit_Circuit(Squander_circuit, parameters)
Export the unitary decomposition into Qiskit format.