From d903bfa5215a7bda2991c6121a335151699693f7 Mon Sep 17 00:00:00 2001 From: Jeffrey Wack Date: Fri, 30 May 2025 01:41:08 -0700 Subject: [PATCH] start of QuantumToolboxExt --- Project.toml | 3 + ext/QuantumToolboxExt/QuantumToolboxExt.jl | 95 ++++++++++++++++++++++ src/QSymbolicsBase/QSymbolicsBase.jl | 11 ++- 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 ext/QuantumToolboxExt/QuantumToolboxExt.jl diff --git a/Project.toml b/Project.toml index ba5d880..e1cccb5 100644 --- a/Project.toml +++ b/Project.toml @@ -16,11 +16,13 @@ TermInterface = "8ea1fca8-c5ef-4a55-8b96-4e9afe9c9a3c" [weakdeps] QuantumClifford = "0525e862-1e90-11e9-3e4d-1b39d7109de1" QuantumOpticsBase = "4f57444f-1401-5e15-980d-4471b28d5678" +QuantumToolbox = "6c2fb7c5-b903-41d2-bc5e-5a7c320b9fab" [extensions] MixedCliffordOpticsExt = ["QuantumClifford", "QuantumOpticsBase"] QuantumCliffordExt = "QuantumClifford" QuantumOpticsExt = "QuantumOpticsBase" +QuantumToolboxExt = "QuantumToolbox" [compat] Latexify = "0.16" @@ -30,6 +32,7 @@ PrecompileTools = "1.2" QuantumClifford = "0.8.19, 0.9" QuantumInterface = "0.3.7" QuantumOpticsBase = "0.4.22, 0.5" +QuantumToolbox = "0.31.1" SymbolicUtils = "3.7" Symbolics = "6" TermInterface = "2" diff --git a/ext/QuantumToolboxExt/QuantumToolboxExt.jl b/ext/QuantumToolboxExt/QuantumToolboxExt.jl new file mode 100644 index 0000000..2909cee --- /dev/null +++ b/ext/QuantumToolboxExt/QuantumToolboxExt.jl @@ -0,0 +1,95 @@ +module QuantumToolboxExt + +using QuantumToolbox +using QuantumSymbolics +using QuantumSymbolics: + HGate, XGate, YGate, ZGate, CPHASEGate, CNOTGate, PauliP, PauliM, + XCXGate, XCYGate, XCZGate, YCXGate, YCYGate, YCZGate, ZCXGate, ZCYGate, ZCZGate, + XBasisState, YBasisState, ZBasisState, + NumberOp, CreateOp, DestroyOp, + FockState, + MixedState, IdentityOp, + qubit_basis +import QuantumSymbolics: express, express_nolookup +using TermInterface +using TermInterface: isexpr, head, operation, arguments, metadata + +const _l0 = QuantumToolbox.basis(2,1) +const _l1 = QuantumToolbox.basis(2,0) +const _s₊ = (_l0+_l1)/√2 +const _s₋ = (_l0-_l1)/√2 +const _i₊ = (_l0+im*_l1)/√2 +const _i₋ = (_l0-im*_l1)/√2 +const _σ₊ = QuantumToolbox.sigmap() +const _σ₋ = QuantumToolbox.sigmam() +const _l00 = QuantumToolbox.proj(_l0) +const _l11 = QuantumToolbox.proj(_l1) +const _id = QuantumToolbox.qeye(2) +const _z = QuantumToolbox.sigmaz() +const _x = QuantumToolbox.sigmax() +const _y = QuantumToolbox.sigmay() +const _hadamard = (_z+_x)/√2 +const _cnot = QuantumToolbox.tensor(_l00,_id) + QuantumToolbox.tensor(_l11,_x) +const _cphase = QuantumToolbox.tensor(_l00,_id) + QuantumToolbox.tensor(_l11,_z) +const _phase = _l00 + im*_l11 +const _iphase = _l00 - im*_l11 + +const _f0₂ = QuantumToolbox.basis(2, 0) +const _f1₂ = QuantumToolbox.basis(2, 1) +const _ad₂ = QuantumToolbox.create(2) +const _a₂ = QuantumToolbox.destroy(2) +const _n₂ = QuantumToolbox.num(2) + +express_nolookup(::HGate, ::QuantumToolboxRepr) = _hadamard +express_nolookup(::XGate, ::QuantumToolboxRepr) = _x +express_nolookup(::YGate, ::QuantumToolboxRepr) = _y +express_nolookup(::ZGate, ::QuantumToolboxRepr) = _z +express_nolookup(::CPHASEGate, ::QuantumToolboxRepr) = _cphase +express_nolookup(::CNOTGate, ::QuantumToolboxRepr) = _cnot +#= +const xyzopdict = Dict(:X=>_x, :Y=>_y, :Z=>_z) +const xyzstatedict = Dict(:X=>(_s₊,_s₋),:Y=>(_i₊,_i₋),:Z=>(_l0,_l1)) +for control in (:X, :Y, :Z) + for target in (:X, :Y, :Z) + k1, k2 = xyzstatedict[control] + o = xyzopdict[target] + gate = QuantumToolbox.tensor(proj(k1),_id) + QuantumToolbox.tensor(proj(k2),o) + structname = Symbol(control,"C",target,"Gate") + let gate=copy(gate) + @eval express_nolookup(::$(structname), ::QuantumToolboxRepr) = $gate + end + end +end + +express_nolookup(::PauliM, ::QuantumToolboxRepr) = _σ₋ +express_nolookup(::PauliP, ::QuantumToolboxRepr) = _σ₊ + +express_nolookup(s::XBasisState, ::QuantumToolboxRepr) = (_s₊,_s₋)[s.idx] +express_nolookup(s::YBasisState, ::QuantumToolboxRepr) = (_i₊,_i₋)[s.idx] +express_nolookup(s::ZBasisState, ::QuantumToolboxRepr) = (_l0,_l1)[s.idx] + +function finite_basis(s,r) + if isfinite(length(basis(s))) + return basis(s) + else + if isa(basis(s), FockBasis) + return FockBasis(r.cutoff) + else + error() + end + end +end +express_nolookup(s::FockState, r::QuantumToolboxRepr) = basisstate(finite_basis(s,r),s.idx+1) +express_nolookup(s::CoherentState, r::QuantumToolboxRepr) = coherentstate(finite_basis(s,r),s.alpha) +express_nolookup(s::SqueezedState, r::QuantumToolboxRepr) = (b = finite_basis(s,r); squeeze(b, s.z)*basisstate(b, 1)) +express_nolookup(o::NumberOp, r::QuantumToolboxRepr) = number(finite_basis(o,r)) +express_nolookup(o::CreateOp, r::QuantumToolboxRepr) = create(finite_basis(o,r)) +express_nolookup(o::DestroyOp, r::QuantumToolboxRepr) = destroy(finite_basis(o,r)) +express_nolookup(o::DisplaceOp, r::QuantumToolboxRepr) = displace(finite_basis(o,r), o.alpha) +express_nolookup(o::SqueezeOp, r::QuantumToolboxRepr) = squeeze(finite_basis(o,r), o.z) +express_nolookup(x::MixedState, r::QuantumToolboxRepr) = identityoperator(finite_basis(x,r))/length(finite_basis(x,r)) +express_nolookup(x::IdentityOp, r::QuantumToolboxRepr) = identityoperator(finite_basis(x,r)) + +express_nolookup(s::SOuterKetBra, r::QuantumToolboxRepr) = projector(express(s.ket, r), express(s.bra, r)) +=# +end diff --git a/src/QSymbolicsBase/QSymbolicsBase.jl b/src/QSymbolicsBase/QSymbolicsBase.jl index 84a886f..33a234e 100644 --- a/src/QSymbolicsBase/QSymbolicsBase.jl +++ b/src/QSymbolicsBase/QSymbolicsBase.jl @@ -22,7 +22,7 @@ import QuantumInterface: export SymQObj,QObj, AbstractRepresentation,AbstractUse, - QuantumOpticsRepr,QuantumMCRepr,CliffordRepr, + QuantumOpticsRepr,QuantumMCRepr,CliffordRepr,QuantumToolboxRepr, UseAsState,UseAsObservable,UseAsOperation, apply!, express, @@ -51,6 +51,15 @@ export SymQObj,QObj, isunitary, KrausRepr,kraus + + + +#Move this to QuantumInterface? +"""Representation using kets, bras, density matrices, and superoperators governed by `QuantumToolbox.jl`.""" +Base.@kwdef struct QuantumToolboxRepr <: AbstractRepresentation + cutoff::Int = 2 +end + ## # Metadata cache helpers ##