This class is how we represent and manipulate embedding objects, using as much encapsulation as possible.
We provide methods to view and modify chains.
embedding(embedding_problem_t &e_p, map<int, vector<int>> &fixed_chains, map<int, vector<int>> &initial_chains)¶
constructor for an initial embedding: accepts fixed and initial chains, populates the embedding based on them, and attempts to link adjacent chains together.
operator=(const embedding<embedding_problem_t> &other)¶
copy the data from
chainsize(int v) const¶
Get the size of a chain.
weight(int q) const¶
Get the weight of a qubit.
Get the maximum of all qubit weights.
max_weight(const int start, const int stop) const¶
Get the maximum of all qubit weights in a range.
has_qubit(const int v, const int q) const¶
Check if variable v is includes qubit q in its chain.
set_chain(const int u, const vector<int> &incoming)¶
Assign a chain for variable u.
fix_chain(const int u, const vector<int> &incoming)¶
Permanently assign a chain for variable u.
NOTE: This must be done before any chain is assigned to u.
operator==(const embedding &other) const¶
otherhave the same chains (up to qubit containment per chain; linking and parent information is not checked)
construct_chain(const int u, const int q, const vector<vector<int>> &parents)¶
construct the chain for
u, rooted at
q, with a vector of parent info, where for each neibor
terminates in the chain for
construct_chain_steiner(const int u, const int q, const vector<vector<int>> &parents, const vector<vector<distance_t>> &distances, vector<vector<int>> &visited_list)¶
construct the chain for
u, rooted at
for the first neighbor
u, we follow the parents until we terminate in the chain for
parents[v][q]-> …. adding all but the last node to the chain of
u. for each subsequent neighbor
w, we pick a nearest Steiner node,
qw, from the current chain of
u, and add the path starting at
qw, similar to the above…
parents[w][qw]-> … this has an opportunity to make shorter chains than
flip_back(int u, const int target_chainsize)¶
distribute path segments to the neighboring chains path segments are the qubits that are ONLY used to join link_qubit[u][v] to link_qubit[u][u] and aren’t used for any other variable
if the target chainsize is zero, dump the entire segment into the neighbor
if the target chainsize is k, stop when the neighbor’s size reaches k
short tearout procedure blank out the chain, its linking qubits, and account for the qubits being freed
undo-able tearout procedure.
tear_out(u), but can be undone with
thaw_back(u). note that this embedding type has a space for a single frozen chain, and
freeze_out(u)overwrites the previously-frozen chain consequently,
freeze_out(u)can be called an arbitrary (nonzero) number of times before
thaw_back(u)MUST be preceeded by at least one
freeze_out(u). returns the size of the chain being frozen
undo for the freeze_out procedure: replaces the chain previously frozen, and destroys the data in the frozen chain
thaw_back(u)must be preceeded by at least one
freeze_out(u)and the chain for
umust currently be empty (accomplished either by
grow the chain for
u, stealing all available qubits from neighboring variables
statistics(vector<int> &stats) const¶
compute statistics for this embedding and return
1if no chains are overlapping when no chains are overlapping, populate
statswith a chainlength histogram chains do overlap, populate
statswith a qubit overfill histogram a histogram, in this case, is a vector of size (maximum attained value+1) where
stats[i]is either the number of qubits contained in
i+2chains or the number of chains with size
check if the embedding is fully linked that is, if each pair of adjacent variables is known to correspond to a pair of adjacent qubits
check if a single variable is linked with all adjacent variables.
print out this embedding to a level of detail that is useful for debugging purposes TODO describe the output format.
run a long diagnostic, and if debugging is enabled, record
current_stateso that the error message has a little more context.
if an error is found, throw a CorruptEmbeddingException
run_long_diagnostic(std::string current_state) const¶
run a long diagnostic to verify the integrity of this datastructure.
the guts of this function are its documentation, because this function only exists for debugging purposes