Code Documentation¶
openfermionprojectq¶
-
class
openfermionprojectq.
Graph
¶ An undirected graph of nodes of arbitrary connectivity
A generic graph class for undirected graphs that holds Nodes and edges that connect them.
-
nodes
¶ list – A list of Node objects containing the nodes of the graph
-
node_uids
¶ list – A list of unique IDs (uids) for each node
-
uid_to_index
¶ dict – A dictionary that maps UIDs currently present in the graph to their node index
-
neigbors
¶ list of sets – A list of sets that enumerate the neighbors of each node. For example the neighbors of node i are the set neighbors[i]
-
next_uid
¶ int – The next unique ID to be assigned to a node on addition
-
__init__
()¶ Set up an empty graph with no nodes
-
add_edge
(node_id1, node_id2)¶ Add an edge between node 1 and node2
Parameters: - node_id1 (int) – Index of first node on edge
- node_id2 (int) – Index of second node on edge
-
add_node
(node=<openfermionprojectq._graph.Node instance>)¶ Add a Node to the graph.
Parameters: node (Node) – A Node object to be added to the graph Returns(int): The unique identified that was given to the node
-
find_index
(value, starting_node=0)¶ Find the index of the first node that matches value in a BFS
Performs a breadth-first search of the graph starting at node index starting_node. Returns the index or None if no match is found
Parameters: - value (Node Value) –
- starting_node (int) –
-
get_neighbors
(node_id)¶ Return list of neighbors of the specified node
Parameters: node_id – Index of node to examine the neighbors of Returns(list): List of current node IDs that are neighbors of node_id.
-
is_adjacent
(node_id1, node_id2)¶ Test for adjacency between node1 and node2
Parameters: - node_id1 (int) – Index of first node
- node_id2 (int) – Index of second node
-
node_count
()¶ Number of nodes in the graph
Returns(int): Number of nodes currently in the graph
-
remove_edge
(node_id1, node_id2)¶ Remove an edge between node1 and node2
Parameters: - node_id1 (int) – Index of first node on edge
- node_id2 (int) – Index of second node on edge
-
remove_node
(node_id)¶ Remove a graph node
This removes a node from the graph and leverages the unique ID system used internally to avoid having to modify the edges for all nodes in the graph.
Parameters: node_id (int) – Index of the node to be removed.
-
shortest_path
(node_id1, node_id2)¶ Find the shortest path between node1 and node2 on the graph
Parameters: - node_id1 (int) – Index of first node
- node_id2 (int) – Index of second node
Returns(list): List of nodes from node_id1 to node_id2 that constitute the shortest possible path in the graph between those two nodes.
-
-
class
openfermionprojectq.
Node
(value=None)¶ Graph node
These graph nodes may be used to store data or other attributes within the Graph structure.
-
__init__
(value=None)¶ Build a graph node initialized with generic value
-
-
openfermionprojectq.
TimeEvolution
(time, hamiltonian)¶ Converts the Hamiltonian to an instance of the ProjectQ QubitOperator and then returns an instance of the ProjectQ TimeEvolution gate. This gate is the unitary time evolution propagator: exp(-i * H * t), where H is the Hamiltonian of the system and t is the time. Note that -i factor is stored implicitly.
Example
wavefuction = eng.allocate_qureg(5) hamiltonian = 0.5 * QubitOperator(“X0 Z1 Y5”) # Apply exp(-i * H * t) to the wavefunction: TimeEvolution(time=2.0, hamiltonian=hamiltonian) | wavefunction
Parameters: - time (float, int) – time t
- hamiltonian (QubitOperator) – hamiltonaian H
Returns: Instance of ProjectQ TimeEvolution gate.
Raises: TypeError
– If time is not a numeric type and hamiltonian is not a QubitOperator.NotHermitianOperatorError
– If the input hamiltonian is not hermitian (only real coefficients).
-
openfermionprojectq.
uccsd_generator
(single_amplitudes, double_amplitudes, anti_hermitian=True)¶ Create a fermionic operator that is the generator of uccsd.
This a the most straight-forward method to generate UCCSD operators, however it is slightly inefficient. In particular, it parameterizes all possible excitations, so it represents a generalized unitary coupled cluster ansatz, but also does not explicitly enforce the uniqueness in parametrization, so it is redundant. For example there will be a linear dependency in the ansatz of single_amplitudes[i,j] and single_amplitudes[j,i].
Parameters: - single_amplitudes (list or ndarray) – list of lists with each sublist storing a list of indices followed by single excitation amplitudes i.e. [[[i,j],t_ij], …] OR [NxN] array storing single excitation amplitudes corresponding to t[i,j] * (a_i^dagger a_j - H.C.)
- double_amplitudes (list or ndarray) – list of lists with each sublist storing a list of indices followed by double excitation amplitudes i.e. [[[i,j,k,l],t_ijkl], …] OR [NxNxNxN] array storing double excitation amplitudes corresponding to t[i,j,k,l] * (a_i^dagger a_j a_k^dagger a_l - H.C.)
- anti_hermitian (Bool) – Flag to generate only normal CCSD operator rather than unitary variant, primarily for testing
Returns: Anti-hermitian fermion operator that is the generator for the uccsd wavefunction.
Return type: uccsd_generator(FermionOperator)
-
openfermionprojectq.
uccsd_singlet_evolution
(packed_amplitudes, n_qubits, n_electrons, fermion_transform=<function jordan_wigner>)¶ Create a ProjectQ evolution operator for a UCCSD singlet circuit
Parameters: - packed_amplitudes (ndarray) – Compact array storing the unique single and double excitation amplitudes for a singlet UCCSD operator. The ordering lists unique single excitations before double excitations.
- n_qubits (int) – Number of spin-orbitals used to represent the system, which also corresponds to number of qubits in a non-compact map.
- n_electrons (int) – Number of electrons in the physical system
- fermion_transform (openfermion.transform) – The transformation that defines the mapping from Fermions to QubitOperator.
Returns: - The unitary operator
that constructs the UCCSD singlet state.
Return type: evoution_operator(TimeEvolution)
-
openfermionprojectq.
uccsd_singlet_generator
(packed_amplitudes, n_qubits, n_electrons, anti_hermitian=True)¶ Create a singlet UCCSD generator for a system with n_electrons
- This function generates a FermionOperator for a UCCSD generator designed
- to act on a single reference state consisting of n_qubits spin orbitals and n_electrons electrons, that is a spin singlet operator, meaning it conserves spin.
Parameters: - packed_amplitudes (list) – List storing the unique single and double excitation amplitudes for a singlet UCCSD operator. The ordering lists unique single excitations before double excitations.
- n_qubits (int) – Number of spin-orbitals used to represent the system, which also corresponds to number of qubits in a non-compact map.
- n_electrons (int) – Number of electrons in the physical system.
- anti_hermitian (Bool) – Flag to generate only normal CCSD operator rather than unitary variant, primarily for testing
Returns: - Generator of the UCCSD operator that
builds the UCCSD wavefunction.
Return type: generator(FermionOperator)
-
openfermionprojectq.
uccsd_singlet_paramsize
(n_qubits, n_electrons)¶ Determine number of independent amplitudes for singlet UCCSD
Parameters: - n_qubits (int) – Number of qubits/spin-orbitals in the system
- n_electrons (int) – Number of electrons in the reference state
Returns: Number of independent parameters for singlet UCCSD with a single reference.
-
openfermionprojectq.
uccsd_trotter_engine
(compiler_backend=<projectq.backends._sim._simulator.Simulator object>, qubit_graph=None, opt_size=None)¶ Define a ProjectQ compiler engine that is common for use with UCCSD
This defines a ProjectQ compiler engine that decomposes time evolution gates using a first order Trotter decomposition on non-commuting gates down to a base gate decomposition.
Parameters: - compiler_backend (projectq.backend) – Define the backend on the circuit compiler, so that it may either simulate gates numerically or alternatively print a gate sequence, e.g. using projectq.backends.CommandPrinter()
- qubit_graph (Graph) – Graph object specifying connectivity of qubits. The values of the nodes of this unique qubit ids. If None, all-to-all connectivity is assumed.
- opt_size (int) – Number for ProjectQ local optimizer to determine size of blocks optimized over.
Returns: - projectq.cengine that is the compiler engine set up with these
rules and decompostions.