UMass Amherst, U. Arizona, Harvard, MIT, Yale, BYU, U. Chicago, Howard University, U. Oregon, NAU
10k$ in mini dev grants
and bug bounties
As an "algebra" tool: random states, gate enumeration, canonicalization, partial traces, projections...
random_stabilizer(5,10) |>
canonicalize_clip! |>
naive_syndrome_circuit
As a "circuit simulation" tool: Monte Carlo, Pauli frames, and perturbative expansions.
Dict{CircuitStatus, Num} with 3 entries:
failure => 4e*((1 - 3e)^3)
false_success => 6e*((1 - 3e)^3)
true_success => (1 - 3e)^4 + 2e*((1 - 3e)^3)
Symbolics.jl
and many "backend" libraries.
julia> Z₁
|Z₁⟩
julia> ( Z₁⊗X₂+Y₁⊗Y₁ ) / √2
0.707 (|Y₁⟩|Y₁⟩+|Z₁⟩|X₂⟩)
julia> express( ( Z₁⊗X₂+Y₁⊗Y₁ ) / √2 )
Ket(dim=4)
basis: [Spin(1/2) ⊗ Spin(1/2)]
0.8535533905932736 + 0.0im
0.0 + 0.3535533905932737im
-0.49999999999999994 + 0.3535533905932737im
-0.3535533905932737 + 0.0im
julia> express( Y₁⊗Y₂, CliffordRepr() )
Rank 2 stabilizer
+ Z_
+ _Z
════
+ Y_
- _Y
════
traits = [Qubit(), Qubit(), Qumode()]
reg = Register(traits)
A register "stores" the states being simulated.
initialize!(reg[1], X₁)
A register's slot can be initialized to an arbitrary state, e.g. $|x_1\rangle$ an eigenstate of $\hat{\sigma}_x$.
initialize!(reg[1], X₁)
initialize!(reg[2], Z₁)
apply!((reg[1], reg[2]), CNOT)
Arbitrary quantum gates or channels can be applied.
initialize!(reg[1], X₁)
initialize!(reg[2], Z₁)
apply!((reg[1], reg[2]), CNOT)
Arbitrary quantum gates or channels can be applied.
project_traceout!(reg[1], σˣ) # Projective measurement
observable((reg[1],reg[2]), σᶻ⊗σˣ) # Calculate an expectation
Measurements and expectation values...
for (;src, dst) in edges(network)
@process EntanglerProt(...)
end
for node in vertices(network)
@process SwapperProt(...)
@process EntanglementTracker(...)
end
design considerations: all the state information that a node needs to track (and update)
for (;src, dst) in edges(network)
@process EntanglerProt(...)
end
for node in vertices(network)
@process SwapperProt(...)
@process EntanglementTracker(...)
end
We are talking just about swaps here, but a plethora of other protocols might also want to run at the same time. How do you synchronize them all!?
😕 State of the art 😕
... imagine if the classical internet needed a new Transport Layer packet type for each Application Layer service ...
# in EntanglerProt
tag!(qubit_slot,
EntanglementCounterpart,
remote_node,
remote_slot)
julia> EntanglementCounterpart(1,2)
Entangled to node 1, slot 2
# in SwapperProt
julia> EntanglementHistory(...)
Was entangled to node 1, slot 2,
but swapped with local slot 3,
which was entangled to node 4, slot 5
julia> EntanglementUpdateX(...)
Update slot .5
which used to be entangled to node 2, slot 3
to be now entangled to node 1, slot 2
# in EntanglementTracker
# when an EntanglementUpdate message is received
query(localslot, EntanglementHistory,
pastremotenode, pastremoteslotid,
❓, ❓, # who we swapped with (node, slot)
❓) # which local slot used to be entangled
# in SwapperProt
# when deciding what swap to perform
query(wholeregister,
EntanglementCounterpart,
<(localnode), # we want only nodes on the "left"
❓; # we do not care which slot
locked=false) # the qubit should be available
for ((client1, client2), rate) in zip(client_pairs, rates)
@process make_request(...)
end
for client in clients
@process EntanglementTracker(...)
end
@process SimpleSwitchDiscreteProt(...)
We are hiring
(remote worldwide):
software engineering
quantum science
Message at skrastanov@umass.edu
10k$ in code bounties at
github.com/QuantumSavory
Options for larger dev grants as well!
Consider gradschool or postdoc
at UMass Amherst:
Design of quantum hardware.
Working on practical LDPC ECC.
Creating new tools for the entire community.