|
| 1 | +module QuantumToolboxExt |
| 2 | + |
| 3 | +using QuantumToolbox |
| 4 | +using QuantumSymbolics |
| 5 | +using QuantumSymbolics: |
| 6 | + HGate, XGate, YGate, ZGate, CPHASEGate, CNOTGate, PauliP, PauliM, |
| 7 | + XCXGate, XCYGate, XCZGate, YCXGate, YCYGate, YCZGate, ZCXGate, ZCYGate, ZCZGate, |
| 8 | + XBasisState, YBasisState, ZBasisState, |
| 9 | + NumberOp, CreateOp, DestroyOp, |
| 10 | + FockState, |
| 11 | + MixedState, IdentityOp, STensor, |
| 12 | + qubit_basis |
| 13 | +import QuantumSymbolics: express, express_nolookup |
| 14 | +using TermInterface |
| 15 | +using TermInterface: isexpr, head, operation, arguments, metadata |
| 16 | + |
| 17 | +const _l0 = QuantumToolbox.basis(2,0) |
| 18 | +const _l1 = QuantumToolbox.basis(2,1) |
| 19 | +const _s₊ = (_l0+_l1)/√2 |
| 20 | +const _s₋ = (_l0-_l1)/√2 |
| 21 | +const _i₊ = (_l0+im*_l1)/√2 |
| 22 | +const _i₋ = (_l0-im*_l1)/√2 |
| 23 | +const _σ₊ = QuantumToolbox.sigmap() |
| 24 | +const _σ₋ = QuantumToolbox.sigmam() |
| 25 | +const _l00 = QuantumToolbox.proj(_l0) |
| 26 | +const _l11 = QuantumToolbox.proj(_l1) |
| 27 | +const _id = QuantumToolbox.qeye(2) |
| 28 | +const _z = QuantumToolbox.sigmaz() |
| 29 | +const _x = QuantumToolbox.sigmax() |
| 30 | +const _y = QuantumToolbox.sigmay() |
| 31 | +const _hadamard = (_z+_x)/√2 |
| 32 | +const _cnot = QuantumToolbox.tensor(_l00,_id) + QuantumToolbox.tensor(_l11,_x) |
| 33 | +const _cphase = QuantumToolbox.tensor(_l00,_id) + QuantumToolbox.tensor(_l11,_z) |
| 34 | +const _phase = _l00 + im*_l11 |
| 35 | +const _iphase = _l00 - im*_l11 |
| 36 | + |
| 37 | +const _f0₂ = QuantumToolbox.basis(2, 0) |
| 38 | +const _f1₂ = QuantumToolbox.basis(2, 1) |
| 39 | +const _ad₂ = QuantumToolbox.create(2) |
| 40 | +const _a₂ = QuantumToolbox.destroy(2) |
| 41 | +const _n₂ = QuantumToolbox.num(2) |
| 42 | + |
| 43 | +express_nolookup(::HGate, ::QuantumToolboxRepr) = _hadamard |
| 44 | +express_nolookup(::XGate, ::QuantumToolboxRepr) = _x |
| 45 | +express_nolookup(::YGate, ::QuantumToolboxRepr) = _y |
| 46 | +express_nolookup(::ZGate, ::QuantumToolboxRepr) = _z |
| 47 | +express_nolookup(::CPHASEGate, ::QuantumToolboxRepr) = _cphase |
| 48 | +express_nolookup(::CNOTGate, ::QuantumToolboxRepr) = _cnot |
| 49 | + |
| 50 | +const xyzopdict = Dict(:X=>_x, :Y=>_y, :Z=>_z) |
| 51 | +const xyzstatedict = Dict(:X=>(_s₊,_s₋),:Y=>(_i₊,_i₋),:Z=>(_l0,_l1)) |
| 52 | +for control in (:X, :Y, :Z) |
| 53 | + for target in (:X, :Y, :Z) |
| 54 | + k1, k2 = xyzstatedict[control] |
| 55 | + o = xyzopdict[target] |
| 56 | + gate = QuantumToolbox.tensor(proj(k1),_id) + QuantumToolbox.tensor(proj(k2),o) |
| 57 | + structname = Symbol(control,"C",target,"Gate") |
| 58 | + let gate=copy(gate) |
| 59 | + @eval express_nolookup(::$(structname), ::QuantumToolboxRepr) = $gate |
| 60 | + end |
| 61 | + end |
| 62 | +end |
| 63 | + |
| 64 | +express_nolookup(::PauliM, ::QuantumToolboxRepr) = _σ₋ |
| 65 | +express_nolookup(::PauliP, ::QuantumToolboxRepr) = _σ₊ |
| 66 | + |
| 67 | +express_nolookup(s::XBasisState, ::QuantumToolboxRepr) = (_s₊,_s₋)[s.idx] |
| 68 | +express_nolookup(s::YBasisState, ::QuantumToolboxRepr) = (_i₊,_i₋)[s.idx] |
| 69 | +express_nolookup(s::ZBasisState, ::QuantumToolboxRepr) = (_l0,_l1)[s.idx] |
| 70 | + |
| 71 | +express_nolookup(s::FockState, r::QuantumToolboxRepr) = fock(r.cutoff, s.idx) |
| 72 | +express_nolookup(s::CoherentState, r::QuantumToolboxRepr) = coherent(r.cutoff,s.alpha) |
| 73 | +express_nolookup(s::SqueezedState, r::QuantumToolboxRepr) = (c = r.cutoff; squeeze(c, s.z)*fock(c, 0)) |
| 74 | +express_nolookup(o::NumberOp, r::QuantumToolboxRepr) = num(r.cutoff) |
| 75 | +express_nolookup(o::CreateOp, r::QuantumToolboxRepr) = create(r.cutoff) |
| 76 | +express_nolookup(o::DestroyOp, r::QuantumToolboxRepr) = destroy(r.cutoff) |
| 77 | +express_nolookup(o::DisplaceOp, r::QuantumToolboxRepr) = displace(r.cutoff, o.alpha) |
| 78 | +express_nolookup(o::SqueezeOp, r::QuantumToolboxRepr) = squeeze(r.cutoff, o.z) |
| 79 | +express_nolookup(x::MixedState, r::QuantumToolboxRepr) = (l = length(x.basis); return qeye(l)/l) |
| 80 | +express_nolookup(x::IdentityOp, r::QuantumToolboxRepr) = qeye(length(x.basis)) |
| 81 | + |
| 82 | +express_nolookup(s::SOuterKetBra, r::QuantumToolboxRepr) = proj(express(s.ket, r), express(s.bra, r)) |
| 83 | +express_nolookup(s::STensor, r::QuantumToolboxRepr) = QuantumToolbox.tensor((express(i, r) for i in s.terms)...) |
| 84 | + |
| 85 | +end |
0 commit comments