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.