UMass Amherst, U. Arizona, Harvard, MIT, Yale, BYU, U. Chicago, Howard University, U. Oregon, NAU
10k$ in mini dev grants
and bug bounties
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!?
# 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(...)
Quantum TCP
MBQC state prep and computation
Summary
Symbolic Algebra Frontend
Independent of backend simulators
State vectors, Stabilizers, Gaussian, other
Qubits, Qmodes, other
Query language over classical metadata
Graphical User Interface
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.