File chain.hpp¶
-
namespace
find_embedding¶ -
class find_embedding
chain - #include <chain.hpp>
This class stores chains for embeddings, and performs qubit-use accounting.
The
labelis the index number for the variable represented by this chain. Thelinksmember of a chain is an unordered map storing the linking information for this chain. Thedatamember of a chain stores the connectivity information for the chain.Links: If
uandvare variables which are connected by an edge, the following must be true: either chain_u or chain_v is empty,or
chain_u.links[v] is a key in chain_u.data, chain_v.links[u] is a key in chain_v.data, and (chain_u.links[v], chain_v.links[u]) are adjacent in the qubit graph
Moreover, (chain_u.links[u]) must exist if chain_u is not empty, and this is considered the root of the chain.
Data: The
datamember stores the connectivity information. More precisely,datais a mappingqubit->(parent, refs)where:parentis also contained in the chainrefsis the total number of references toqubit, counting both parents and links the chain root is its own parent.Public Functions
-
find_embedding::chain
chain(vector<int> &w, int l) construct this chain, linking it to the qubit_weight vector
w(common to all chains in an embedding, typically) and setting its variable labell
-
chain &find_embedding::chain
operator=(const vector<int> &c) assign this to a vector of ints.
each incoming qubit will have itself as a parent.
-
chain &find_embedding::chain
operator=(const chain &c)¶ assign this to another chain
-
int find_embedding::chain
size() const number of qubits in chain
-
int find_embedding::chain
count(const int q) const returns 0 if
qis not contained inthis, 1 otherwise
-
int find_embedding::chain
get_link(const int x) const get the qubit, in
this, which linksthisto the chain of x (if x==label, interpret the linking qubit as the chain’s root)
-
void find_embedding::chain
set_link(const int x, const int q) set the qubit, in
this, which linksthisto the chain of x (if x==label, interpret the linking qubit as the chain’s root)
-
int find_embedding::chain
drop_link(const int x) discard and return the linking qubit for
x, or -1 if that link is not set
-
void find_embedding::chain
set_root(const int q) insert the qubit
qintothis, and setqto be the root (represented as the linking qubit forlabel)
-
void find_embedding::chain
clear() empty this data structure
-
void find_embedding::chain
add_leaf(const int q, const int parent) add the qubit
qas a leaf, withparentas its parent
-
int find_embedding::chain
trim_branch(int q) try to delete the qubit
qfrom this chain, and keep deleting until no more qubits are free to be deleted.return the first ancestor which cannot be deleted
-
int find_embedding::chain
trim_leaf(int q) try to delete the qubit
qfrom this chain.if
qcannot be deleted, return it; otherwise return its parent
-
int find_embedding::chain
parent(const int q) const the parent of
qin this chain which might beqbut otherwise cycles should be impossible
-
void find_embedding::chain
adopt(const int p, const int q) assign
pto be the parent ofq, on condition that bothpandqare contained inthis,qis its own parent, andqis not the root
-
int find_embedding::chain
refcount(const int q) const return the number of references that
thismakes to the qubitqwhere a “reference” is an occurrence ofqas a parent or an occurrence ofqas a linking qubit / root
-
template <typename embedding_problem_t>
void find_embedding::chainsteal(chain &other, embedding_problem_t &ep, int chainsize = 0) assumes
thisandotherhave links for eachother’s labels steals all qubits fromotherwhich are available to be taken bythis; starting with the qubit links and updating qubit links after all
-
void find_embedding::chain
link_path(chain &other, int q, const vector<int> &parents) link this chain to another, following the path
q,parent[q],parent[parent[q]], …from
thistootherand intermediate nodes (all but the last) intothis(preconditions:thisandotherare not linked,qis contained inthis, and the parent-path is eventually contained inother)
-
iterator find_embedding::chain
begin() const iterator pointing to the first qubit in this chain
-
iterator find_embedding::chain
end() const iterator pointing to the end of this chain
-
void find_embedding::chain
diagnostic(char *last_op) run the diagnostic, and if it fails, report the failure to the user and throw -1.
the
last_opargument is used in the error message
-
int find_embedding::chain
run_diagnostic() const run the diagnostic and return a nonzero status
rin case of failure if(r&1), then the parent of a qubit is not contained in this chain if(r&2), then there is a refcounting error in this chain
Public Members
-
const int find_embedding::chain
label¶
Private Functions
-
const pair<int, int> &find_embedding::chain
fetch(int q) const¶ const unsafe data accessor
-
pair<int, int> &find_embedding::chain
retrieve(int q)¶ non-const unsafe data accessor
Private Members
-
vector<int> &find_embedding::chain
qubit_weight¶
-
unordered_map<int, pair<int, int>> find_embedding::chain
data¶
-
unordered_map<int, int> find_embedding::chain
links¶
-
class find_embedding::chain
iterator - #include <chain.hpp>
Public Functions
-
find_embedding::chain::iterator::iterator(typename decltype(data)::const_iterator it)
-
iterator find_embedding::chain::iterator
operator++()¶
-
bool find_embedding::chain::iterator
operator!=(const iterator &other)¶
-
decltype(data) const ::key_type& find_embedding::chain::iterator::operator*() const
Private Members
-
decltype(data) ::const_iterator find_embedding::chain::iterator::it
-
-
find_embedding::chain
-
class find_embedding