fixing parametrization flag and updating relevant test scripts
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -24,21 +24,23 @@ hamiltonian = hamiltonians.SymbolicHamiltonian(form)
|
|||||||
|
|
||||||
# define circuit
|
# define circuit
|
||||||
def build_circuit(nqubits, nlayers):
|
def build_circuit(nqubits, nlayers):
|
||||||
"""Construct a Qibo parametric quantum circuit."""
|
"""Construct a more complex Qibo parametric quantum circuit without CNOT gates."""
|
||||||
circ = Circuit(nqubits)
|
circ = Circuit(nqubits)
|
||||||
for _ in range(nlayers):
|
for layer in range(nlayers):
|
||||||
for q in range(nqubits):
|
for q in range(nqubits):
|
||||||
circ.add(gates.RY(q=q, theta=0.))
|
circ.add(gates.RY(q=q, theta=0.))
|
||||||
circ.add(gates.RZ(q=q, theta=0.))
|
circ.add(gates.RZ(q=q, theta=0.))
|
||||||
[circ.add(gates.CZ(q % nqubits, (q + 1) % nqubits)) for q in range(nqubits)]
|
circ.add(gates.RX(q=q, theta=0.))
|
||||||
|
# Add controlled rotations and SWAPs for entanglement
|
||||||
|
for q in range(nqubits - 1):
|
||||||
|
circ.add(gates.CNOT(q, q + 1))
|
||||||
|
circ.add(gates.SWAP(q, q + 1))
|
||||||
circ.add(gates.M(*range(nqubits)))
|
circ.add(gates.M(*range(nqubits)))
|
||||||
return circ
|
return circ
|
||||||
|
|
||||||
nqubits = 4
|
nqubits = 6
|
||||||
circuit = build_circuit(nqubits=nqubits, nlayers=3)
|
circuit = build_circuit(nqubits=nqubits, nlayers=3)
|
||||||
|
|
||||||
quimb_circuit = quimb_backend._qibo_circuit_to_quimb(circuit)
|
|
||||||
|
|
||||||
def f(params):
|
def f(params):
|
||||||
circuit.set_parameters(params)
|
circuit.set_parameters(params)
|
||||||
return quimb_backend.expectation(
|
return quimb_backend.expectation(
|
||||||
|
|||||||
@@ -376,45 +376,6 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
|
|
||||||
return A_new, B_new, C_new
|
return A_new, B_new, C_new
|
||||||
|
|
||||||
# def _qibo_circuit_to_quimb(self, qibo_circ, quimb_circuit_type=qtn.Circuit, **circuit_kwargs):
|
|
||||||
# """
|
|
||||||
# Convert a Qibo Circuit to a Quimb Circuit.
|
|
||||||
|
|
||||||
# Parameters
|
|
||||||
# ----------
|
|
||||||
# qibo_circ : qibo.models.circuit.Circuit
|
|
||||||
# The circuit to convert.
|
|
||||||
# quimb_circuit_type : type
|
|
||||||
# The Quimb circuit class to use (Circuit, CircuitMPS, etc).
|
|
||||||
# circuit_kwargs : dict
|
|
||||||
# Extra arguments to pass to the Quimb circuit constructor.
|
|
||||||
|
|
||||||
# Returns
|
|
||||||
# -------
|
|
||||||
# circ : quimb.tensor.circuit.Circuit
|
|
||||||
# The converted circuit.
|
|
||||||
# """
|
|
||||||
# nqubits = qibo_circ.nqubits
|
|
||||||
# quimb_gates = []
|
|
||||||
# circ = quimb_circuit_type(nqubits, **circuit_kwargs)
|
|
||||||
|
|
||||||
# for gate in qibo_circ.queue:
|
|
||||||
# gname = getattr(gate, "name", None)
|
|
||||||
# qname = GATE_MAP.get(gname, None)
|
|
||||||
# if qname is None:
|
|
||||||
# continue # skip measurements and unknown gates
|
|
||||||
|
|
||||||
# # Handle parametrized gates (Qibo: .parameters, Quimb: expects flat tuple)
|
|
||||||
# params = getattr(gate, "parameters", ())
|
|
||||||
# qubits = getattr(gate, "qubits", ())
|
|
||||||
|
|
||||||
# # Quimb expects (*params, *qubits)
|
|
||||||
# gate_spec = (qname,) + tuple(params) + tuple(qubits)
|
|
||||||
# quimb_gates.append(gate_spec)
|
|
||||||
|
|
||||||
# circ.apply_gates(quimb_gates)
|
|
||||||
# return circ
|
|
||||||
|
|
||||||
def _qibo_circuit_to_quimb(self, qibo_circ, quimb_circuit_type=qtn.Circuit, **circuit_kwargs):
|
def _qibo_circuit_to_quimb(self, qibo_circ, quimb_circuit_type=qtn.Circuit, **circuit_kwargs):
|
||||||
"""
|
"""
|
||||||
Convert a Qibo Circuit to a Quimb Circuit.
|
Convert a Qibo Circuit to a Quimb Circuit.
|
||||||
@@ -446,8 +407,11 @@ class QuimbBackend(QibotnBackend, NumpyBackend):
|
|||||||
qubits = getattr(gate, "qubits", ())
|
qubits = getattr(gate, "qubits", ())
|
||||||
|
|
||||||
# Check if the gate is parametrized
|
# Check if the gate is parametrized
|
||||||
is_parametrized = isinstance(gate, ParametrizedGate)
|
is_parametrized = (
|
||||||
|
isinstance(gate, ParametrizedGate)
|
||||||
|
and getattr(gate, "trainable", True)
|
||||||
|
)
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
if is_parametrized:
|
if is_parametrized:
|
||||||
circ.apply_gate(
|
circ.apply_gate(
|
||||||
qname,
|
qname,
|
||||||
|
|||||||
Reference in New Issue
Block a user