Class find_embedding::chain#

class chain#
Public Functions

inline 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

inline chain &operator=(const vector<int> &c)#
assign this to a vector of ints.
each incoming qubit will have itself as a parent.

inline size_t size() const#
number of qubits in chain

inline size_t count(const int q) const#
returns 0 if
q
is not contained inthis
, 1 otherwise

inline int get_link(const int x) const#
get the qubit, in
this
, which linksthis
to the chain of x (if x==label, interpret the linking qubit as the chain’s root)

inline void set_link(const int x, const int q)#
set the qubit, in
this
, which linksthis
to the chain of x (if x==label, interpret the linking qubit as the chain’s root)

inline int drop_link(const int x)#
discard and return the linking qubit for
x
, or 1 if that link is not set

inline void set_root(const int q)#
insert the qubit
q
intothis
, and setq
to be the root (represented as the linking qubit forlabel
)

inline void clear()#
empty this data structure

inline void add_leaf(const int q, const int parent)#
add the qubit
q
as a leaf, withparent
as its parent

inline int trim_branch(int q)#
try to delete the qubit
q
from this chain, and keep deleting until no more qubits are free to be deleted.return the first ancestor which cannot be deleted

inline int trim_leaf(int q)#
try to delete the qubit
q
from this chain.if
q
cannot be deleted, return it; otherwise return its parent

inline int parent(const int q) const#
the parent of
q
in this chain — which might beq
but otherwise cycles should be impossible

inline void adopt(const int p, const int q)#
assign
p
to be the parent ofq
, on condition that bothp
andq
are contained inthis
,q
is its own parent, andq
is not the root

inline int refcount(const int q) const#
return the number of references that
this
makes to the qubitq
— where a “reference” is an occurrence ofq
as a parent or an occurrence ofq
as a linking qubit / root

inline size_t freeze(vector<chain> &others, frozen_chain &keep)#
store this chain into a
frozen_chain
, unlink all chains from this, and clear()

inline void thaw(vector<chain> &others, frozen_chain &keep)#
restore a
frozen_chain
into this, reestablishing links from other chains.precondition: this is empty.

template<typename embedding_problem_t>
inline void steal(chain &other, embedding_problem_t &ep, int chainsize = 0)# assumes
this
andother
have links for eachother’s labels steals all qubits fromother
which are available to be taken bythis
; starting with the qubit links and updating qubit links after all

inline void 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
this
toother
and intermediate nodes (all but the last) intothis
(preconditions:this
andother
are not linked,q
is contained inthis
, and the parentpath is eventually contained inother
)

inline void diagnostic()#
run the diagnostic, and if it fails, report the failure to the user and throw a CorruptEmbeddingException.
the
last_op
argument is used in the error message

inline int run_diagnostic() const#
run the diagnostic and return a nonzero status
r
in 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

class iterator#

inline chain(vector<int> &w, int l)#