Skip to content

Commit

Permalink
Merge 913edb0 into 5790ddc
Browse files Browse the repository at this point in the history
  • Loading branch information
BoxiLi committed Feb 18, 2023
2 parents 5790ddc + 913edb0 commit 327a4eb
Show file tree
Hide file tree
Showing 9 changed files with 33 additions and 28 deletions.
10 changes: 4 additions & 6 deletions doc/pulse-paper/customize.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,13 @@
import numpy as np
from qutip import (
fidelity, sigmax, sigmay, sigmaz, basis, qeye, tensor, Qobj, fock_dm)
from qutip_qip.circuit import QubitCircuit, Gate
from qutip_qip.circuit import QubitCircuit
from qutip_qip.operations import Gate
from qutip_qip.device import ModelProcessor, Model
from qutip_qip.compiler import GateCompiler, Instruction
import qutip
from packaging.version import parse as parse_version
if parse_version(qutip.__version__) < parse_version('5.dev'):
from qutip import Options as SolverOptions
else:
from qutip import SolverOptions
from qutip import Options
from qutip_qip.noise import Noise


Expand Down Expand Up @@ -219,7 +217,7 @@ def single_crosstalk_simulation(num_gates):
init_state = tensor(
[Qobj([[init_fid, 0], [0, 0.025]]), Qobj([[init_fid, 0], [0, 0.025]])]
)
options = SolverOptions(nsteps=10000) # increase the maximal allowed steps
options = Options(nsteps=10000) # increase the maximal allowed steps
e_ops = [tensor([qeye(2), fock_dm(2)])] # observable

# compute results of the run using a solver of choice with custom options
Expand Down
6 changes: 3 additions & 3 deletions doc/pulse-paper/dj_algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
OptPulseProcessor, LinearSpinChain, SCQubits, SpinChainModel)
from qutip_qip.circuit import QubitCircuit
from qutip import sigmaz, sigmax, identity, tensor, basis
from qutip_qip.utilities import _qobj_compatibility_helper


# Deutsch-Josza algorithm
dj_circuit = QubitCircuit(num_qubits)
Expand Down Expand Up @@ -79,7 +81,6 @@
ax[i].fill_between([full_tlist[point2], full_tlist[point3]], [vmin ,vmin], [vmax, vmax], color="lightgray", alpha=0.5)
ax[i].vlines([full_tlist[point2], full_tlist[point3]], vmin, vmax, "gray", "--", linewidth=0.8, alpha=0.5)

fig.tight_layout()
fig.savefig("optimal_control_pulse.pdf")
fig.show()

Expand Down Expand Up @@ -124,7 +125,6 @@

full_tlist = scqubits_processor.get_full_tlist()

fig3.tight_layout()
fig3.savefig("transmon_pulse.pdf")
fig3.show()

Expand All @@ -146,7 +146,7 @@
for state in result1.states:
tmp = state.ptrace([0,1])
tmp = basis([2,2], [0,0]).dag() * tmp * basis([2,2], [0,0])
expect.append(np.real(tmp[0, 0]))
expect.append(np.real(_qobj_compatibility_helper(tmp)[0, 0]))

fig5, ax5 = plt.subplots(figsize=(LINEWIDTH, LINEWIDTH*0.7), dpi=200)
ax5.plot(t_record, expect, color="slategrey")
Expand Down
2 changes: 1 addition & 1 deletion doc/source/qip-basics.rst
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ gate function returning a :class:`qutip.Qobj` and save it in the attribute ``use
# controlled rotation X
mat = np.zeros((4, 4), dtype=np.complex)
mat[0, 0] = mat[1, 1] = 1.
mat[2:4, 2:4] = rx(arg_value)
mat[2:4, 2:4] = rx(arg_value).full()
return Qobj(mat, dims=[[2, 2], [2, 2]])


Expand Down
2 changes: 2 additions & 0 deletions src/qutip_qip/device/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -1209,10 +1209,12 @@ def run_state(
options = kwargs.get("options", qutip.Options())
if options.get("max_step", 0.0) == 0.0:
options["max_step"] = total_circuit_time / 25
options["progress_bar"] = False
else:
options = kwargs.get("options", qutip.Options())
if options.max_step == 0.0:
options.max_step = total_circuit_time / 10
options.progress_bar = False
kwargs["options"] = options
# choose solver:
if solver == "mesolve":
Expand Down
16 changes: 16 additions & 0 deletions src/qutip_qip/utilities.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from itertools import chain
from functools import reduce
from packaging.version import parse as parse_version
import numpy as np
import qutip


def _qobj_compatibility_helper(qobj):
"""
Make qobj generated by operations in qutip-v5 identical to the one by qutip-v4.
Here, if `qobj` is a number (e.g. generated by a bra-ket multiplication), it is replaced by a Qobj.
"""
if parse_version(qutip.__version__) >= parse_version("5.dev"):
if np.isscalar(qobj):
return qutip.Qobj([[qobj]], dims=[[1], [1]])
return qobj
7 changes: 3 additions & 4 deletions src/qutip_qip/vqa.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from scipy.optimize import minimize
from scipy.linalg import expm_frechet
from .operations import gate_sequence_product
from .utilities import _qobj_compatibility_helper


class VQA:
Expand Down Expand Up @@ -429,10 +430,8 @@ def cost_derivative(self, U, dU):
dCost = (init.dag() * dU.dag()) * obs * (U * init) + (
init.dag() * U.dag()
) * obs * (dU * init)
if isinstance(dCost, Qobj): # qutip version < 5
return np.real(dCost.full().item())
else: # qutip version >= 5
return np.real(dCost)
dCost = _qobj_compatibility_helper(dCost)
return np.real(dCost.full().item())

def compute_jac(self, angles, indices_to_compute=None):
"""
Expand Down
1 change: 1 addition & 0 deletions tests/pytest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ markers =
filterwarnings =
ignore:matplotlib not found:UserWarning
ignore:the imp module is deprecated in favour of importlib:DeprecationWarning
ignore:Dedicated options class are no longer needed, options should be passed as dict to solvers.:FutureWarning
4 changes: 0 additions & 4 deletions tests/test_noise.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@

import qutip
from packaging.version import parse as parse_version
if parse_version(qutip.__version__) >= parse_version('5.dev'):
is_qutip5 = True
else:
is_qutip5 = False


class TestNoise:
Expand Down
13 changes: 3 additions & 10 deletions tests/test_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@
import pytest

import qutip
if parse_version(qutip.__version__) < parse_version('5.dev'):
from qutip import Options as SolverOptions
else:
from qutip import SolverOptions
from qutip_qip.device import Processor, LinearSpinChain
from qutip import (
basis, sigmaz, sigmax, sigmay, identity, destroy, tensor,
Expand All @@ -21,10 +17,7 @@
from qutip_qip.qubits import qubit_states
from qutip_qip.pulse import Pulse
from qutip_qip.circuit import QubitCircuit
if parse_version(qutip.__version__) < parse_version('5.dev'):
from qutip import Options as SolverOptions
else:
from qutip import SolverOptions
from qutip import Options


class TestCircuitProcessor:
Expand Down Expand Up @@ -96,7 +89,7 @@ def test_id_evolution(self):
tlist = [0., 1., 2.]
proc.add_pulse(Pulse(identity(2), 0, tlist, False))
result = proc.run_state(
init_state, options=SolverOptions(store_final_state=True))
init_state, options=Options(store_final_state=True))
global_phase = init_state[0, 0]/result.final_state[0, 0]
assert_allclose(
global_phase*result.final_state.full(), init_state.full())
Expand Down Expand Up @@ -407,7 +400,7 @@ def test_max_step_size(self):
# No max_step
final_state = processor.run_state(
init_state,
options=SolverOptions(max_step=10000) # too large max_step
options=Options(max_step=10000) # too large max_step
).states[-1]
expected_state = tensor([basis(2, 0), basis(2, 1)])
assert pytest.approx(fidelity(final_state, expected_state), 0.001) == 0
Expand Down

0 comments on commit 327a4eb

Please sign in to comment.