[−][src]Function dqcsim::bindings::dqcs_gm_new
#[no_mangle]pub extern "C" fn dqcs_gm_new(
strip_qubit_refs: bool,
strip_data: bool,
key_cmp: Option<extern "C" fn(_: *const c_void, _: *const c_void) -> bool>,
key_hash: Option<extern "C" fn(_: *const c_void) -> u64>
) -> dqcs_handle_t
Constructs a new gate map. >
Returns a handle to a gate map with no mappings attached to it yet. Use
dqcs_gm_add_*()
to do that. The mappings are queried in the order in which they are added, so be sure to add more specific gates first. Once added, usedqcs_gm_detect()
to detect incoming DQCsim gates, anddqcs_gm_construct*()
to (re)construct gates for transmission.Gate maps objects retain a cache to speed up detection of similar DQCsim gates: if a gate is received for the second time, the cache will hit, avoiding recomputation of the detector functions. What constitutes "similar gates" is defined by the two booleans passed to this function. If
strip_qubit_refs
is set, all qubit references associated with the gate will be invalidated (i.e., set to 0), such that for instance an X gate applied to qubit 1 will be considered equal to an X gate applied to qubit 2. Ifstrip_data
is set, theArbData
associated with the incoming gate is removed.Gates are identified through user-defined
void*
keys. To do the above, however, DQCsim needs to know the following things:
- how to delete an owned copy of a key if your semantics are that DQCsim owns it,
- how to compare two keys (equality);
- how to hash a key.
The deletion function is passed when the key is passed. If the keys are objects of different classes, this allows different constructors to be passed here. There can only be a single comparison and hash function for each gate map, though. They are passed here.
key_cmp
represents this comparison function. It takes twovoid*
to keys and must returns whether they are equal or not. If not specified, the default is to compare the pointers themselves, instead of the values they refer to.key_cmp
must be a pure function, i.e., depend only on its input values.
key_hash
represents the hashing function. It takes avoid*
key and returns a 64-bit hash representative of the key. For any pair of keys for whichkey_cmp
returns true, the hashes must be equal. The default behavior depends on whetherkey_cmp
is defined: if it is, all keys will have the same hash; if it isn't, the pointer is itself hashed.key_hash
must be a pure function, i.e., depend only on its input values.It is recommended to first preprocess incoming gates with
dqcs_gate_reduce_control()
. In this case, controlled unitary gate matrices will be reduced to their non-controlled submatrix, such that the unitary gate detectors will operate on said submatrix. The predefined unitary gate detectors are more-or-less based on this assumption (as there are no predefined controlled matrices).Alternatively, you can preprocess with
dqcs_gate_expand_control()
. In this case, you can usedqcs_gm_add_fixed_unitary()
to detect the full matrix in all cases, by specifying the CNOT matrix instead of an X matrix with one control qubit.If you don't preprocess, the upstream plugin determines the representation. That is, it may send a CNOT as a two-qubit gate with a CNOT matrix or as a controlled X gate with a single target and single control qubit. The gate map will then detect these as two different kinds of gates.