Sequential Quantum Gate Decomposer
v1.9.3
Powerful decomposition of general unitarias into one- and two-qubit gates gates
|
A base class to determine the decomposition of an N-qubit unitary into a sequence of CNOT and U3 gates. More...
#include <N_Qubit_Decomposition.h>
Public Member Functions | |
void | add_adaptive (int target_qbit, int control_qbit) |
Append a Adaptive gate to the list of gates. More... | |
void | add_adaptive_to_front (int target_qbit, int control_qbit) |
Add a Adaptive gate to the front of the list of gates. More... | |
void | add_ch (int target_qbit, int control_qbit) |
Append a CH gate (i.e. More... | |
void | add_ch_to_front (int target_qbit, int control_qbit) |
Add a CH gate (i.e. More... | |
void | add_child (Gate *child) |
Call to add a child gate to the current gate. More... | |
void | add_cnot (int target_qbit, int control_qbit) |
Append a CNOT gate gate to the list of gates. More... | |
void | add_cnot_to_front (int target_qbit, int control_qbit) |
Add a C_NOT gate gate to the front of the list of gates. More... | |
void | add_composite () |
Append a Composite gate to the list of gates. More... | |
void | add_composite_to_front () |
Add a Composite gate to the front of the list of gates. More... | |
void | add_cr (int target_qbit, int control_qbit) |
Append a CR gate to the list of gates. More... | |
void | add_cr_to_front (int target_qbit, int control_qbit) |
Add a CR gate to the front of the list of gates. More... | |
void | add_crot (int target_qbit, int control_qbit) |
Append a CROT gate gate to the list of gates. More... | |
void | add_crot_to_front (int target_qbit, int control_qbit) |
Add a CROT gate gate to the front of the list of gates. More... | |
void | add_cry (int target_qbit, int control_qbit) |
Append a CRY gate to the list of gates. More... | |
void | add_cry_to_front (int target_qbit, int control_qbit) |
Add a CRY gate to the front of the list of gates. More... | |
void | add_cz (int target_qbit, int control_qbit) |
Append a CZ gate gate to the list of gates. More... | |
void | add_cz_nu (int target_qbit, int control_qbit) |
Append a CZ_NU gate to the list of gates. More... | |
void | add_cz_nu_to_front (int target_qbit, int control_qbit) |
Add a CZ_NU gate to the front of the list of gates. More... | |
void | add_cz_to_front (int target_qbit, int control_qbit) |
Add a CZ gate gate to the front of the list of gates. More... | |
virtual void | add_finalyzing_layer () |
Call to add further layer to the gate structure used in the subdecomposition. More... | |
void | add_gate (Gate *gate) |
Append a general gate to the list of gates. More... | |
void | add_gate_nums (std::map< std::string, int > &gate_nums) |
Call to add the number of the individual gate types in the circuit to the map given in the argument. More... | |
void | add_gate_to_front (Gate *gate) |
Add an gate to the front of the list of gates. More... | |
void | add_gates (std::vector< Gate *> gates_in) |
Append a list of gates to the list of gates. More... | |
void | add_gates_to_front (std::vector< Gate *> gates_in) |
Add an array of gates to the front of the list of gates. More... | |
void | add_h (int target_qbit) |
Append a Hadamard gate to the list of gates. More... | |
void | add_h_to_front (int target_qbit) |
Add a Hadamard gate to the front of the list of gates. More... | |
void | add_on () |
Append a ON gate to the list of gates. More... | |
void | add_on_to_front () |
Add a OUN gate to the front of the list of gates. More... | |
void | add_parent (Gate *parent) |
Call to add a parent gate to the current gate. More... | |
void | add_r (int target_qbit) |
Append a R gate to the list of gates. More... | |
void | add_r_to_front (int target_qbit) |
Add a R gate to the front of the list of gates. More... | |
void | add_rx (int target_qbit) |
Append a RX gate to the list of gates. More... | |
void | add_rx_to_front (int target_qbit) |
Add a RX gate to the front of the list of gates. More... | |
void | add_ry (int target_qbit) |
Append a RY gate to the list of gates. More... | |
void | add_ry_to_front (int target_qbit) |
Add a RY gate to the front of the list of gates. More... | |
void | add_rz (int target_qbit) |
Append a RZ gate to the list of gates. More... | |
void | add_rz_to_front (int target_qbit) |
Add a RZ gate to the front of the list of gates. More... | |
void | add_sx (int target_qbit) |
Append a SX gate to the list of gates. More... | |
void | add_sx_to_front (int target_qbit) |
Add a SX gate to the front of the list of gates. More... | |
void | add_syc (int target_qbit, int control_qbit) |
Append a Sycamore gate (i.e. More... | |
void | add_syc_to_front (int target_qbit, int control_qbit) |
Add a Sycamore gate (i.e. More... | |
void | add_t (int target_qbit) |
Append a T gate to the list of gates. More... | |
void | add_t_to_front (int target_qbit) |
Add a T gate to the front of the list of gates. More... | |
void | add_tdg (int target_qbit) |
Append a Tdg gate to the list of gates. More... | |
void | add_tdg_to_front (int target_qbit) |
Add a Tdg gate to the front of the list of gates. More... | |
void | add_u1 (int target_qbit) |
Append a U1 gate to the list of gates. More... | |
void | add_u1_to_front (int target_qbit) |
Add a U1 gate to the front of the list of gates. More... | |
void | add_u2 (int target_qbit) |
Append a U2 gate to the list of gates. More... | |
void | add_u2_to_front (int target_qbit) |
Add a U2 gate to the front of the list of gates. More... | |
void | add_u3 (int target_qbit) |
Append a U3 gate to the list of gates. More... | |
void | add_u3_to_front (int target_qbit) |
Add a U3 gate to the front of the list of gates. More... | |
void | add_un () |
Append a UN gate to the list of gates. More... | |
void | add_un_to_front () |
Add a UN gate to the front of the list of gates. More... | |
void | add_x (int target_qbit) |
Append a X gate to the list of gates. More... | |
void | add_x_to_front (int target_qbit) |
Add a X gate to the front of the list of gates. More... | |
void | add_y (int target_qbit) |
Append a Y gate to the list of gates. More... | |
void | add_y_to_front (int target_qbit) |
Add a Y gate to the front of the list of gates. More... | |
void | add_z (int target_qbit) |
Append a Z gate to the list of gates. More... | |
void | add_z_to_front (int target_qbit) |
Add a Z gate to the front of the list of gates. More... | |
virtual std::vector< Matrix > | apply_derivate_to (Matrix_real ¶meters_mtx, Matrix &input, int parallel) |
Call to evaluate the derivate of the circuit on an inout with respect to all of the free parameters. More... | |
virtual void | apply_from_right (Matrix_real ¶meters_mtx, Matrix &input) |
Call to apply the gate on the input array/matrix by input*CNOT. More... | |
virtual void | apply_from_right (Matrix &input) |
Call to apply the gate on the input array/matrix by input*Gate. More... | |
Matrix | apply_gate (Matrix &gate_mtx, Matrix &input_matrix) |
Apply an gates on the input matrix. More... | |
void | apply_global_phase_factor (QGD_Complex16 global_phase_factor, Matrix &u3_gate) |
Call to apply the global phase to a matrix. More... | |
void | apply_global_phase_factor () |
Call to apply the current global phase to the unitary matrix. More... | |
virtual void | apply_to (Matrix_real ¶meters_mtx, Matrix &input, int parallel=0) |
Call to apply the gate on the input array/matrix Gates_block*input. More... | |
virtual void | apply_to (Matrix &input, int parallel) |
Call to apply the gate on the input array/matrix. More... | |
void | apply_to_list (Matrix_real ¶meters, std::vector< Matrix > &inputs, int parallel) |
Call to apply the gate on the input array/matrix by U3*input. More... | |
virtual void | apply_to_list (std::vector< Matrix > &inputs, int parallel) |
Call to apply the gate on a list of inputs. More... | |
void | calc_decomposition_error (Matrix &decomposed_matrix) |
Calculate the error of the decomposition according to the spectral norm of \( U-U_{approx} \), where \( U_{approx} \) is the unitary produced by the decomposing quantum cirquit. More... | |
virtual Matrix | calc_one_qubit_u3 (double Theta, double Phi, double Lambda) |
Calculate the matrix of a U3 gate gate corresponding to the given parameters acting on a single qbit space. More... | |
virtual Matrix | calc_one_qubit_u3 () |
Calculate the matrix of the constans gates. More... | |
void | calculate_new_global_phase_factor (QGD_Complex16 global_phase_factor_new) |
Calculate the new global phase of the Unitary matrix after removing a trivial U3 matrix. More... | |
bool | check_optimization_solution () |
check_optimization_solution More... | |
void | clear_children () |
Call to erase data on children. More... | |
void | clear_parents () |
Call to erase data on parents. More... | |
virtual Gates_block * | clone () |
Create a clone of the present class. More... | |
void | combine (Gates_block *op_block) |
Call to append the gates of an gate block to the current block. More... | |
bool | contains_adaptive_gate () |
Call to determine, whether the circuit contains daptive gate or not. More... | |
bool | contains_adaptive_gate (int idx) |
Call to determine, whether the sub-circuit at a given position in the circuit contains daptive gate or not. More... | |
Gates_block * | create_remapped_circuit (const std::map< int, int > &qbit_map) |
Call to create a new circuit with remapped qubits. More... | |
Gates_block * | create_remapped_circuit (const std::map< int, int > &qbit_map, const int qbit_num_) |
Call to create a new circuit with remapped qubits. More... | |
void | decompose_submatrix () |
Start the decompostion process to recursively decompose the submatrices. More... | |
void | determine_children (Gate *gate) |
Call to obtain the child gates in the circuit. More... | |
void | determine_parents (Gate *gate) |
Call to obtain the parent gates in the circuit. More... | |
void | export_current_cost_fnc (double current_minimum) |
Call to print out into a file the current cost function and the second Rényi entropy on the subsystem made of qubits 0 and 1. More... | |
void | export_current_cost_fnc (double current_minimum, Matrix_real ¶meters) |
Call to print out into a file the current cost function and the second Rényi entropy on the subsystem made of qubits 0 and 1. More... | |
void | export_unitary (std::string &filename) |
exports unitary matrix to binary file More... | |
int | extract_gates (Gates_block *op_block) |
Call to extract the gates stored in the class. More... | |
virtual Matrix_real | extract_parameters (Matrix_real ¶meters) |
Call to extract parameters from the parameter array corresponding to the circuit, in which the gate is embedded. More... | |
void | extract_subdecomposition_results (Sub_Matrix_Decomposition *cSub_decomposition) |
Call to extract and store the calculated parameters and gates of the sub-decomposition processes. More... | |
void | final_optimization () |
final optimization procedure improving the accuracy of the decompositin when all the qubits were already disentangled. More... | |
void | finalize_decomposition () |
After the main optimization problem is solved, the indepent qubits can be rotated into state |0> by this def. More... | |
void | fragment_circuit () |
int | get_accelerator_num () |
Get the number of accelerators to be reserved on DFEs on users demand. More... | |
std::vector< Gate * > | get_children () |
Call to get the children of the current gate. More... | |
int | get_control_qbit () |
Call to get the index of the control qubit. More... | |
double | get_correction1_scale () |
Call to get the prefactor of the single-bitflip errors in the cost function. More... | |
double | get_correction2_scale () |
Call to get the prefactor of the two-bitflip errors in the cost function. More... | |
cost_function_type | get_cost_function_variant () |
Call to get the variant of the cost function used in the calculations. More... | |
double | get_current_minimum () |
Call to get the obtained minimum of the cost function. More... | |
Matrix | get_decomposed_matrix () |
Calculate the decomposed matrix resulted by the effect of the optimized gates on the unitary Umtx. More... | |
double | get_decomposition_error () |
Call to get the error of the decomposition. More... | |
Gates_block * | get_flat_circuit () |
Method to generate a flat circuit. More... | |
Gate * | get_gate (int idx) |
Call to get the gates stored in the class. More... | |
int | get_gate_num () |
Call to get the number of gates grouped in the class. More... | |
std::map< std::string, int > | get_gate_nums () |
Call to get the number of the individual gate types in the list of gates. More... | |
std::vector< Gate * > | get_gates () |
Call to get the gates stored in the class. More... | |
QGD_Complex16 | get_global_phase_factor () |
Get the global phase of the Unitary matrix. More... | |
std::vector< int > | get_involved_qubits () |
Call to get the qubits involved in the gates stored in the block of gates. More... | |
Matrix | get_matrix (Matrix_real ¶meters) |
Call to retrieve the gate matrix (Which is the product of all the gate matrices stored in the gate block) More... | |
Matrix | get_matrix (Matrix_real ¶meters, int parallel) |
Call to retrieve the gate matrix (Which is the product of all the gate matrices stored in the gate block) More... | |
virtual Matrix | get_matrix () |
Call to retrieve the operation matrix. More... | |
virtual Matrix | get_matrix (int parallel) |
Call to retrieve the operation matrix. More... | |
std::string | get_name () |
Call to get the name label of the gate. More... | |
int | get_num_iters () |
Get the number of processed iterations during the optimization process. More... | |
Matrix_real | get_optimized_parameters () |
Call to get the optimized parameters. More... | |
void | get_optimized_parameters (double *ret) |
Call to get the optimized parameters. More... | |
int | get_parallel_configuration () |
Get the parallel configuration from the config. More... | |
void | get_parameter_max (Matrix_real &range_max) |
int | get_parameter_num () |
Call to get the number of free parameters. More... | |
int | get_parameter_start_idx () |
Call to get the starting index of the parameters in the parameter array corresponding to the circuit in which the current gate is incorporated. More... | |
std::vector< Gate * > | get_parents () |
Call to get the parents of the current gate. More... | |
double | get_previous_cost_function_value () |
Call to retrieve the previous value of the cost funtion to be used to evaluate bitflip errors in the cost funtion (see Eq. More... | |
std::string | get_project_name () |
Call to get the current name of the project. More... | |
int | get_qbit_num () |
Call to get the number of qubits composing the unitary. More... | |
Matrix | get_reduced_density_matrix (Matrix_real ¶meters_mtx, Matrix &input_state, matrix_base< int > &qbit_list_subset) |
Call to evaluate the reduced densiy matrix. More... | |
double | get_second_Renyi_entropy (Matrix_real ¶meters_mtx, Matrix &input_state, matrix_base< int > &qbit_list) |
Call to evaluate the seconf Rényi entropy. More... | |
int | get_target_qbit () |
Call to get the index of the target qubit. More... | |
int | get_trace_offset () |
Get the trace ffset used in the evaluation of the cost function. More... | |
gate_type | get_type () |
Call to get the type of the operation. More... | |
Matrix | get_Umtx () |
Call to retrive a pointer to the unitary to be transformed. More... | |
int | get_Umtx_size () |
Call to get the size of the unitary to be transformed. More... | |
Matrix | import_unitary_from_binary (std::string &filename) |
Import a Unitary matrix from a file. More... | |
void | insert_gate (Gate *gate, int idx) |
Call to insert a gate at a given position. More... | |
void | list_gates (int start_index) |
Call to print the gates decomposing the initial unitary. More... | |
void | list_gates (const Matrix_real ¶meters, int start_index) |
Call to print the list of gates stored in the block of gates for a specific set of parameters. More... | |
N_Qubit_Decomposition () | |
Nullary constructor of the class. More... | |
N_Qubit_Decomposition (Matrix Umtx_in, int qbit_num_in, bool optimize_layer_num_in, std::map< std::string, Config_Element > &config, guess_type initial_guess_in) | |
Constructor of the class. More... | |
virtual double | optimization_problem (const double *parameters) |
This is an abstact definition of function giving the cost functions measuring the entaglement of the qubits. More... | |
double | optimization_problem (double *parameters) |
Evaluate the optimization problem of the optimization. More... | |
virtual double | optimization_problem (Matrix_real ¶meters) |
The optimization problem of the final optimization. More... | |
double | optimization_problem (Matrix_real parameters, void *void_instance, Matrix ret_temp) |
The optimization problem of the final optimization. More... | |
Matrix_real | optimization_problem_batched (std::vector< Matrix_real > ¶meters_vec) |
The cost function of the optimization with batched input (implemented only for the Frobenius norm cost function when run with DFE) More... | |
virtual void | optimization_problem_combined (Matrix_real parameters, double *f0, Matrix_real grad) |
Call to calculate both the cost function and the its gradient components. More... | |
virtual void | optimization_problem_combined_non_static (Matrix_real parameters, void *void_instance, double *f0, Matrix_real &grad) |
Call to calculate both the cost function and the its gradient components. More... | |
void | optimization_problem_combined_unitary (Matrix_real parameters, Matrix &Umtx, std::vector< Matrix > &Umtx_deriv) |
Call to calculate both the effect of the circuit on th eunitary and it's gradient componets. More... | |
virtual double | optimization_problem_non_static (Matrix_real parameters, void *void_instance) |
The optimization problem of the final optimization. More... | |
double | optimization_problem_panelty (double *parameters, Gates_block *gates_block) |
The optimization problem of the final optimization. More... | |
virtual void | parameters_for_calc_one_qubit (double &ThetaOver2, double &Phi, double &Lambda) |
Calculate the matrix of a U3 gate gate corresponding to the given parameters acting on a single qbit space. More... | |
void | print (const std::stringstream &sstream, int verbose_level=1) const |
Call to print output messages in the function of the verbosity level. More... | |
void | randomize_parameters (Matrix_real &input, Matrix_real &output, const double &f0) |
Call to randomize the parameter. More... | |
void | release_gate (int idx) |
Call to release one gate in the list. More... | |
void | release_gates () |
Call to release the stored gates. More... | |
void | reorder_qubits (std::vector< int > qbit_list) |
Call to reorder the qubits in the matrix of the gate. More... | |
void | reset_dependency_graph () |
Method to reset the dependency graph of the gates in the circuit. More... | |
void | reset_parameter_start_indices () |
Method to reset the parameter start indices of gate operations incorporated in the circuit. More... | |
void | set_children (std::vector< Gate *> &children_) |
Call to set the children of the current gate. More... | |
void | set_control_qbit (int control_qbit_in) |
Call to set the control qubit for the gate operation. More... | |
void | set_convergence_threshold (double convergence_threshold_in) |
Call to set the threshold of convergence in the optimization processes. More... | |
void | set_cost_function_variant (cost_function_type variant) |
Call to set the variant of the cost function used in the calculations. More... | |
void | set_custom_gate_structure (std::map< int, Gates_block *> gate_structure_in) |
Call to set custom layers to the gate structure that are intended to be used in the subdecomposition. More... | |
void | set_custom_gate_structure (Gates_block *gate_structure_in) |
Call to set custom layers to the gate structure that are intended to be used in the subdecomposition. More... | |
void | set_debugfile (std::string debugfile) |
Call to set the debugfile name. More... | |
void | set_global_phase (double new_global_phase) |
Call to set global phase. More... | |
int | set_identical_blocks (int n, int identical_blocks_in) |
Set the number of identical successive blocks during the subdecomposition of the n-th qubit. More... | |
int | set_identical_blocks (std::map< int, int > identical_blocks_in) |
Set the number of identical successive blocks during the subdecomposition of the n-th qubit. More... | |
int | set_iteration_loops (int n, int iteration_loops_in) |
Set the number of iteration loops during the subdecomposition of the n-th qubit. More... | |
int | set_iteration_loops (std::map< int, int > iteration_loops_in) |
Set the number of iteration loops during the subdecomposition of the qbit-th qubit. More... | |
void | set_matrix (Matrix input) |
Call to set the stored matrix in the operation. More... | |
void | set_max_inner_iterations (int max_inner_iterations_in) |
Call to set the maximal number of iterations for which an optimization engine tries to solve the optimization problem. More... | |
void | set_max_iteration (int max_outer_iterations_in) |
Call to set the maximal number of the iterations in the optimization process. More... | |
int | set_max_layer_num (int n, int max_layer_num_in) |
Set the maximal number of layers used in the subdecomposition of the n-th qubit. More... | |
int | set_max_layer_num (std::map< int, int > max_layer_num_in) |
Set the maximal number of layers used in the subdecomposition of the n-th qubit. More... | |
void | set_optimization_blocks (int optimization_block_in) |
Call to set the number of gate blocks to be optimized in one shot. More... | |
void | set_optimization_tolerance (double tolerance_in) |
Call to set the tolerance of the optimization processes. More... | |
void | set_optimized_parameters (double *parameters, int num_of_parameters) |
Call to set the optimized parameters for initial optimization. More... | |
void | set_optimizer (optimization_aglorithms alg_in) |
Call to set the optimizer engine to be used in solving the optimization problem. More... | |
void | set_parameter_start_idx (int start_idx) |
Call to set the starting index of the parameters in the parameter array corresponding to the circuit in which the current gate is incorporated. More... | |
void | set_parents (std::vector< Gate *> &parents_) |
Call to set the parents of the current gate. More... | |
void | set_project_name (std::string &project_name_new) |
Call to set the name of the project. More... | |
void | set_qbit_num (int qbit_num_in) |
Set the number of qubits spanning the matrix of the gates stored in the block of gates. More... | |
void | set_random_shift_count_max (int random_shift_count_max_in) |
Call to set the maximal number of parameter randomization tries to escape a local minimum. More... | |
void | set_target_qbit (int target_qbit_in) |
Call to set the target qubit for the gate operation. More... | |
void | set_trace_offset (int trace_offset_in) |
Set the trace offset used in the evaluation of the cost function. More... | |
void | set_verbose (int verbose_in) |
Call to set the verbose attribute. More... | |
void | solve_layer_optimization_problem (int num_of_parameters, Matrix_real solution_guess) |
Call to solve layer by layer the optimization problem via calling one of the implemented algorithms. More... | |
void | solve_layer_optimization_problem_ADAM (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via ADAM algorithm. More... | |
void | solve_layer_optimization_problem_ADAM_BATCHED (int num_of_parameters, Matrix_real &solution_guess_) |
Call to solve layer by layer the optimization problem via batched ADAM algorithm. More... | |
void | solve_layer_optimization_problem_AGENTS (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via the AGENT algorithm. More... | |
void | solve_layer_optimization_problem_AGENTS_COMBINED (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via the AGENT COMBINED algorithm. More... | |
void | solve_layer_optimization_problem_BAYES_AGENTS (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via Bayes & Agents algorithm. More... | |
void | solve_layer_optimization_problem_BAYES_OPT (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via Bayes algorithm. More... | |
void | solve_layer_optimization_problem_BFGS (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via BBFG algorithm. More... | |
void | solve_layer_optimization_problem_BFGS2 (int num_of_parameters, Matrix_real solution_guess) |
Call to solve layer by layer the optimization problem via BBFG algorithm. More... | |
void | solve_layer_optimization_problem_COSINE (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via the COSINE algorithm. More... | |
void | solve_layer_optimization_problem_GRAD_DESCEND (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via the GRAD_DESCEND (line search in the direction determined by the gradient) algorithm. More... | |
void | solve_layer_optimization_problem_GRAD_DESCEND_PARAMETER_SHIFT_RULE (int num_of_parameters, Matrix_real &solution_guess) |
Call to solve layer by layer the optimization problem via the GRAD_DESCEND_PARAMETER_SHIFT_RULE algorithm. More... | |
void | solve_optimization_problem (double *solution_guess, int solution_guess_num) |
This method can be used to solve the main optimization problem which is devidid into sub-layer optimization processes. More... | |
virtual void | start_decomposition (bool finalize_decomp=true) |
Start the disentanglig process of the unitary. More... | |
virtual | ~N_Qubit_Decomposition () |
Destructor of the class. More... | |
Static Public Member Functions | |
static void | export_current_cost_fnc (double current_minimum, Matrix_real ¶meters, void *void_instance) |
Call to print out into a file the current cost function and the second Rényi entropy on the subsystem made of qubits 0 and 1. More... | |
static void | Init_max_layer_num () |
Initializes default layer numbers. More... | |
static double | optimization_problem (Matrix_real parameters, void *void_instance) |
The optimization problem of the final optimization. More... | |
static void | optimization_problem_combined (Matrix_real parameters, void *void_instance, double *f0, Matrix_real &grad) |
Call to calculate both the cost function and the its gradient components. More... | |
static void | optimization_problem_combined_unitary (Matrix_real parameters, void *void_instance, Matrix &Umtx, std::vector< Matrix > &Umtx_deriv) |
Call to calculate both the effect of the circuit on th eunitary and it's gradient componets. More... | |
static void | optimization_problem_grad (Matrix_real parameters, void *void_instance, Matrix_real &grad) |
Calculate the derivative of the cost function with respect to the free parameters. More... | |
Public Attributes | |
std::map< std::string, Config_Element > | config |
config metadata utilized during the optimization More... | |
bool | debug |
Logical variable. Set true to write output messages to the 'debug.txt' file. More... | |
std::string | debugfile_name |
String variable. Set the debug file name. More... | |
QGD_Complex16 | global_phase_factor |
The global phase. More... | |
int | id |
unique id indentifying the instance of the class More... | |
int | max_inner_iterations |
the maximal number of iterations for which an optimization engine tries to solve the optimization problem More... | |
int | optimization_block |
number of gate blocks used in one shot of the optimization process More... | |
double | optimization_tolerance |
The maximal allowed error of the optimization problem (The error of the decomposition would scale with the square root of this value) More... | |
std::string | project_name |
the name of the project More... | |
int | random_shift_count_max |
the maximal number of parameter randomization tries to escape a local minimum. More... | |
int | verbose |
Set the verbosity level of the output messages. More... | |
Static Public Attributes | |
static std::map< int, int > | max_layer_num_def |
A map of <int n: int num> indicating that how many layers should be used in the subdecomposition process by default for the subdecomposing of the nth qubits. More... | |
Protected Member Functions | |
void | apply_kernel_from_right (Matrix &u3_1qbit, Matrix &input) |
Call to apply the gate kernel on the input state or unitary from right (no AVX support) More... | |
void | apply_kernel_to (Matrix &u3_1qbit, Matrix &input, bool deriv=false, int parallel=0) |
Call to apply the gate kernel on the input state or unitary with optional AVX support. More... | |
Protected Attributes | |
int | accelerator_num |
number of utilized accelerators More... | |
bool | adaptive_eta |
logical variable indicating whether adaptive learning reate is used in the ADAM algorithm More... | |
optimization_aglorithms | alg |
The optimization algorithm to be used in the optimization. More... | |
std::vector< int > | block_end |
std::vector< int > | block_type |
std::vector< Gate * > | children |
list of child gates to be applied after this current gate More... | |
double | circuit_simulation_time |
Time spent on circuit simulation/cost function evaluation. More... | |
int | control_qbit |
The index of the qubit which acts as a control qubit (control_qbit >= 0) in controlled operations. More... | |
double | convergence_threshold |
The convergence threshold in the optimization process. More... | |
double | correction1_scale |
prefactor of the single-bitflip errors in the cost function. (see Eq. (21) in arXiv:2210.09191) More... | |
double | correction2_scale |
prefactor of the double-bitflip errors in the cost function. (see Eq. (21) in arXiv:2210.09191) More... | |
cost_function_type | cost_fnc |
The chosen variant of the cost function. More... | |
double | CPU_time |
time spent on optimization More... | |
double | current_minimum |
The current minimum of the optimization problem. More... | |
double | decomposition_error |
error of the final decomposition More... | |
bool | decomposition_finalized |
The optimized parameters for the gates. More... | |
int | finalizing_gates_num |
number of finalizing (deterministic) opertaions rotating the disentangled qubits into state |0>. More... | |
int | finalizing_parameter_num |
the number of the finalizing (deterministic) parameters of gates rotating the disentangled qubits into state |0>. More... | |
int | fragmentation_type |
bool | fragmented |
boolean variable indicating whether the circuit was already partitioned or not More... | |
std::map< int, Gates_block * > | gate_structure |
A map of <int n: Gates_block* block> describing custom gate structure to be used in the decomposition. Gate block corresponding to n is used in the subdecomposition of the n-th qubit. The Gate block is repeated periodically. More... | |
std::vector< Gate * > | gates |
The list of stored gates. More... | |
std::mt19937 | gen |
Standard mersenne_twister_engine seeded with rd() More... | |
double | global_target_minimum |
The global target minimum of the optimization problem. More... | |
std::map< int, int > | identical_blocks |
A map of <int n: int num> indicating that how many identical successive blocks should be used in the disentanglement of the nth qubit from the others. More... | |
guess_type | initial_guess |
type to guess the initial values for the optimization. Possible values: ZEROS=0, RANDOM=1, CLOSE_TO_ZERO=2 More... | |
std::vector< std::vector< int > > | involved_qbits |
std::map< int, int > | iteration_loops |
A map of <int n: int num> indicating the number of iteration in each step of the decomposition. More... | |
int | layer_num |
number of gate layers More... | |
int | matrix_size |
The size N of the NxN matrix associated with the operations. More... | |
int | max_fusion |
maximal number of qubits in partitions More... | |
std::map< int, int > | max_layer_num |
A map of <int n: int num> indicating that how many layers should be used in the subdecomposition process for the subdecomposing of the nth qubits. More... | |
int | max_outer_iterations |
Maximal number of iterations allowed in the optimization process. More... | |
std::string | name |
A string labeling the gate operation. More... | |
int | num_threads |
Store the number of OpenMP threads. (During the calculations OpenMP multithreading is turned off.) More... | |
int | number_of_iters |
number of iterations More... | |
bool | optimization_problem_solved |
logical value describing whether the optimization problem was solved or not More... | |
bool | optimize_layer_num |
logical value. Set true to optimize the minimum number of gate layers required in the decomposition, or false when the predefined maximal number of layer gates is used (ideal for general unitaries). More... | |
Matrix_real | optimized_parameters_mtx |
The optimized parameters for the gates. More... | |
int | parameter_num |
the number of free parameters of the operation More... | |
int | parameter_start_idx |
the index in the parameter array (corrensponding to the encapsulated circuit) where the gate parameters begin (if gates are placed into a circuit a single parameter array is used to execute the whole circuit) More... | |
std::vector< Gate * > | parents |
list of parent gates to be applied in the circuit prior to this current gate More... | |
double | prev_cost_fnv_val |
the previous value of the cost funtion to be used to evaluate bitflip errors in the cost funtion (see Eq. (21) in arXiv:2210.09191) More... | |
int | qbit_num |
number of qubits spanning the matrix of the operation More... | |
double | radius |
parameter to contron the radius of parameter randomization around the curren tminimum More... | |
double | randomization_rate |
randomization rate More... | |
int | target_qbit |
The index of the qubit on which the operation acts (target_qbit >= 0) More... | |
int | trace_offset |
The offset in the first columns from which the "trace" is calculated. In this case Tr(A) = sum_(i-offset=j) A_{ij}. More... | |
gate_type | type |
The type of the operation (see enumeration gate_type) More... | |
Matrix | Umtx |
The unitary to be decomposed. More... | |
A base class to determine the decomposition of an N-qubit unitary into a sequence of CNOT and U3 gates.
This class contains the non-template implementation of the decomposition class.
Definition at line 60 of file N_Qubit_Decomposition.h.
N_Qubit_Decomposition::N_Qubit_Decomposition | ( | ) |
Nullary constructor of the class.
Definition at line 33 of file N_Qubit_Decomposition.cpp.
N_Qubit_Decomposition::N_Qubit_Decomposition | ( | Matrix | Umtx_in, |
int | qbit_num_in, | ||
bool | optimize_layer_num_in, | ||
std::map< std::string, Config_Element > & | config_in, | ||
guess_type | initial_guess_in = CLOSE_TO_ZERO |
||
) |
Constructor of the class.
Umtx_in | The unitary matrix to be decomposed |
qbit_num_in | The number of qubits spanning the unitary Umtx |
optimize_layer_num_in | Optional logical value. If true, then the optimization tries to determine the lowest number of the layers needed for the decomposition. If False (default), the optimization is performed for the maximal number of layers. |
initial_guess_in | Enumeration element indicating the method to guess initial values for the optimization. Possible values: 'zeros=0' ,'random=1', 'close_to_zero=2' |
Definition at line 53 of file N_Qubit_Decomposition.cpp.
|
virtual |
Destructor of the class.
Definition at line 64 of file N_Qubit_Decomposition.cpp.
Append a Adaptive gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1577 of file Gates_block.cpp.
Add a Adaptive gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1592 of file Gates_block.cpp.
Append a CH gate (i.e.
controlled Hadamard gate) gate to the list of gates
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
controlled Hadamard gate) operation to the list of gates
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1438 of file Gates_block.cpp.
Add a CH gate (i.e.
controlled Hadamard gate) gate to the front of the list of gates
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
controlled Hadamard gate) operation to the front of the list of gates
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1455 of file Gates_block.cpp.
|
inherited |
Append a CNOT gate gate to the list of gates.
Append a C_NOT gate operation to the list of gates.
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1124 of file Gates_block.cpp.
Add a C_NOT gate gate to the front of the list of gates.
Add a C_NOT gate operation to the front of the list of gates.
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1141 of file Gates_block.cpp.
|
inherited |
Append a Composite gate to the list of gates.
Definition at line 1548 of file Gates_block.cpp.
|
inherited |
Add a Composite gate to the front of the list of gates.
Definition at line 1560 of file Gates_block.cpp.
Append a CR gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 998 of file Gates_block.cpp.
Add a CR gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1014 of file Gates_block.cpp.
Append a CROT gate gate to the list of gates.
Append a CROT gate to the list of gates.
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1030 of file Gates_block.cpp.
Add a CROT gate gate to the front of the list of gates.
Add a CROT gate to the front of the list of gates.
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1046 of file Gates_block.cpp.
Append a CRY gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 967 of file Gates_block.cpp.
Add a CRY gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 983 of file Gates_block.cpp.
Append a CZ gate gate to the list of gates.
Append a CZ gate operation to the list of gates.
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1159 of file Gates_block.cpp.
Append a CZ_NU gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1061 of file Gates_block.cpp.
Add a CZ_NU gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1077 of file Gates_block.cpp.
Add a CZ gate gate to the front of the list of gates.
Add a CZ gate operation to the front of the list of gates.
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1176 of file Gates_block.cpp.
|
virtualinherited |
Call to add further layer to the gate structure used in the subdecomposition.
Reimplemented in N_Qubit_Decomposition_adaptive.
Definition at line 266 of file Optimization_Interface.cpp.
|
inherited |
Append a general gate to the list of gates.
gate | A pointer to a class Gate describing an gate. |
gate | A pointer to a class Gate describing a gate operation. |
Definition at line 1608 of file Gates_block.cpp.
|
inherited |
Call to add the number of the individual gate types in the circuit to the map given in the argument.
A | map<gate_name, gate_count> describing the number of the individual gate types |
Definition at line 1699 of file Gates_block.cpp.
|
inherited |
Add an gate to the front of the list of gates.
Add a gate to the front of the list of gates.
gate | A pointer to a class Gate describing an gate. |
gate | A pointer to a class Gate describing a gate. |
Definition at line 1638 of file Gates_block.cpp.
|
inherited |
Append a list of gates to the list of gates.
gates_in | A list of gate class instances. |
gates_in | A list of operation class instances. |
Definition at line 1469 of file Gates_block.cpp.
|
inherited |
Add an array of gates to the front of the list of gates.
gates_in | A list of gate class instances. |
gates_in | A list of operation class instances. |
Definition at line 1482 of file Gates_block.cpp.
|
inherited |
Append a Hadamard gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1190 of file Gates_block.cpp.
|
inherited |
Add a Hadamard gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1203 of file Gates_block.cpp.
|
inherited |
Append a ON gate to the list of gates.
Definition at line 1522 of file Gates_block.cpp.
|
inherited |
Add a OUN gate to the front of the list of gates.
Add a ON gate to the front of the list of gates.
Definition at line 1534 of file Gates_block.cpp.
|
inherited |
|
inherited |
Append a R gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 907 of file Gates_block.cpp.
|
inherited |
Add a R gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 920 of file Gates_block.cpp.
|
inherited |
Append a RX gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 880 of file Gates_block.cpp.
|
inherited |
Add a RX gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 893 of file Gates_block.cpp.
|
inherited |
Append a RY gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 935 of file Gates_block.cpp.
|
inherited |
Add a RY gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 949 of file Gates_block.cpp.
|
inherited |
Append a RZ gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1093 of file Gates_block.cpp.
|
inherited |
Add a RZ gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1106 of file Gates_block.cpp.
|
inherited |
Append a SX gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1371 of file Gates_block.cpp.
|
inherited |
Add a SX gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1384 of file Gates_block.cpp.
Append a Sycamore gate (i.e.
Append a Sycamore gate operation to the list of gates.
controlled Hadamard gate) gate to the list of gates
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1403 of file Gates_block.cpp.
Add a Sycamore gate (i.e.
Add a Sycamore gate operation to the front of the list of gates.
controlled Hadamard gate) gate to the front of the list of gates
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
control_qbit | The identification number of the control qubit. (0 <= target_qbit <= qbit_num-1) |
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1420 of file Gates_block.cpp.
|
inherited |
Append a T gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1309 of file Gates_block.cpp.
|
inherited |
Add a T gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1322 of file Gates_block.cpp.
|
inherited |
Append a Tdg gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1339 of file Gates_block.cpp.
|
inherited |
Add a Tdg gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1352 of file Gates_block.cpp.
|
inherited |
Append a U1 gate to the list of gates.
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 801 of file Gates_block.cpp.
|
inherited |
Add a U1 gate to the front of the list of gates.
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 814 of file Gates_block.cpp.
|
inherited |
Append a U2 gate to the list of gates.
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 827 of file Gates_block.cpp.
|
inherited |
Add a U2 gate to the front of the list of gates.
target_qbit | The identification number of the target qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 840 of file Gates_block.cpp.
|
inherited |
Append a U3 gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Theta | The Theta parameter of the U3 gate |
Phi | The Phi parameter of the U3 gate |
Lambda | The Lambda parameter of the U3 gate |
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 853 of file Gates_block.cpp.
|
inherited |
Add a U3 gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Theta | The Theta parameter of the U3 gate |
Phi | The Phi parameter of the U3 gate |
Lambda | The Lambda parameter of the U3 gate |
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 866 of file Gates_block.cpp.
|
inherited |
Append a UN gate to the list of gates.
Definition at line 1496 of file Gates_block.cpp.
|
inherited |
Add a UN gate to the front of the list of gates.
Definition at line 1508 of file Gates_block.cpp.
|
inherited |
Append a X gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1221 of file Gates_block.cpp.
|
inherited |
Add a X gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1234 of file Gates_block.cpp.
|
inherited |
Append a Y gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1250 of file Gates_block.cpp.
|
inherited |
Add a Y gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1263 of file Gates_block.cpp.
|
inherited |
Append a Z gate to the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1279 of file Gates_block.cpp.
|
inherited |
Add a Z gate to the front of the list of gates.
target_qbit | The identification number of the targt qubit. (0 <= target_qbit <= qbit_num-1) |
Definition at line 1292 of file Gates_block.cpp.
|
virtualinherited |
Call to evaluate the derivate of the circuit on an inout with respect to all of the free parameters.
parameters | An array of the input parameters. |
input | The input array on which the gate is applied |
parallel | Set 0 for sequential execution, 1 for parallel execution with OpenMP (NOT IMPLEMENTED YET) and 2 for parallel with TBB (optional) |
Reimplemented from Gate.
Definition at line 698 of file Gates_block.cpp.
|
virtualinherited |
Call to apply the gate on the input array/matrix by input*CNOT.
Call to apply the gate on the input array/matrix by input*Gate_block.
input | The input array on which the gate is applied |
Reimplemented in Composite.
Definition at line 557 of file Gates_block.cpp.
|
virtualinherited |
Call to apply the gate on the input array/matrix by input*Gate.
input | The input array on which the gate is applied |
Reimplemented in SX, H, X, Y, Z, T, Tdg, SYC, CH, CNOT, and CZ.
Definition at line 285 of file Gate.cpp.
Apply an gates on the input matrix.
gate_mtx | The matrix of the gate. |
input_matrix | The input matrix to be transformed. |
Definition at line 683 of file Decomposition_Base.cpp.
|
inherited |
Call to apply the global phase to a matrix.
Call to apply global phase of U3 matrices to matrix.
global_phase_factor | The value of the phase |
Definition at line 939 of file Decomposition_Base.cpp.
|
inherited |
Call to apply the current global phase to the unitary matrix.
global_phase_factor | The value of the phase |
Definition at line 948 of file Decomposition_Base.cpp.
Call to apply the gate kernel on the input state or unitary from right (no AVX support)
u3_1qbit | The 2x2 kernel of the gate operation |
input | The input matrix on which the transformation is applied |
deriv | Set true to apply derivate transformation, false otherwise |
Definition at line 613 of file Gate.cpp.
|
protectedinherited |
Call to apply the gate kernel on the input state or unitary with optional AVX support.
u3_1qbit | The 2x2 kernel of the gate operation |
input | The input matrix on which the transformation is applied |
deriv | Set true to apply derivate transformation, false otherwise (optional) |
parallel | Set true to apply parallel kernels, false otherwise (optional) |
parallel | Set 0 for sequential execution (default), 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
u3_1qbit | The 2x2 kernel of the gate operation |
input | The input matrix on which the transformation is applied |
deriv | Set true to apply derivate transformation, false otherwise (optional) |
deriv | Set true to apply parallel kernels, false otherwise (optional) |
parallel | Set 0 for sequential execution (default), 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
Definition at line 537 of file Gate.cpp.
|
virtualinherited |
Call to apply the gate on the input array/matrix Gates_block*input.
parameters | An array of the input parameters. |
input | The input array on which the gate is applied |
parallel | Set 0 for sequential execution, 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
parameters | An array of parameters to calculate the matrix of the U3 gate. |
input | The input array on which the gate is applied |
parallel | Set 0 for sequential execution, 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
Reimplemented from Gate.
Reimplemented in Composite.
Definition at line 236 of file Gates_block.cpp.
Call to apply the gate on the input array/matrix.
input | The input array on which the gate is applied |
parallel | Set 0 for sequential execution, 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
Reimplemented in SX, H, X, Y, Z, T, Tdg, CH, CZ, SYC, and CNOT.
Definition at line 237 of file Gate.cpp.
|
virtualinherited |
Call to apply the gate on the input array/matrix by U3*input.
parameters | An array of parameters to calculate the matrix of the U3 gate. |
inputs | The input array on which the gate is applied |
parallel | Set 0 for sequential execution, 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
parameters | An array of parameters to calculate the matrix of the U3 gate. |
input | The input array on which the gate is applied |
Reimplemented from Gate.
Definition at line 203 of file Gates_block.cpp.
Call to apply the gate on a list of inputs.
inputs | The input array on which the gate is applied |
parallel | Set 0 for sequential execution, 1 for parallel execution with OpenMP and 2 for parallel with TBB (optional) |
Definition at line 187 of file Gate.cpp.
|
inherited |
Calculate the error of the decomposition according to the spectral norm of \( U-U_{approx} \), where \( U_{approx} \) is the unitary produced by the decomposing quantum cirquit.
The calculated error is stored in the attribute decomposition_error.
decomposed_matrix | The decomposed matrix, i.e. the result of the decomposing gate structure applied on the initial unitary. |
decomposed_matrix | The decomposed matrix, i.e. the result of the decomposing gate structure applied on the initial unitary. |
Definition at line 291 of file Optimization_Interface.cpp.
|
virtualinherited |
Calculate the matrix of a U3 gate gate corresponding to the given parameters acting on a single qbit space.
Theta | Real parameter standing for the parameter theta. |
Phi | Real parameter standing for the parameter phi. |
Lambda | Real parameter standing for the parameter lambda. |
ThetaOver2 | Real parameter standing for the parameter theta. |
Phi | Real parameter standing for the parameter phi. |
Lambda | Real parameter standing for the parameter lambda. |
Definition at line 695 of file Gate.cpp.
|
virtualinherited |
|
inherited |
Calculate the new global phase of the Unitary matrix after removing a trivial U3 matrix.
Call to calculate new global phase.
global_phase_factor_new | global phase calculated from the product of two U3 matrices |
global_phase_factor | The value of the phase |
Definition at line 912 of file Decomposition_Base.cpp.
|
inherited |
check_optimization_solution
Checks the convergence of the optimization problem.
Definition at line 587 of file Decomposition_Base.cpp.
|
inherited |
|
inherited |
|
virtualinherited |
Create a clone of the present class.
Reimplemented from Gate.
Reimplemented in Sub_Matrix_Decomposition, and Composite.
Definition at line 2379 of file Gates_block.cpp.
|
inherited |
Call to append the gates of an gate block to the current block.
Call to append the gates of a gate block to the current circuit.
op_block | A pointer to an instance of class Gate_block |
op_block | A pointer to an instance of class Gates_block |
Definition at line 2314 of file Gates_block.cpp.
|
inherited |
Call to determine, whether the circuit contains daptive gate or not.
Definition at line 2445 of file Gates_block.cpp.
Call to determine, whether the sub-circuit at a given position in the circuit contains daptive gate or not.
idx | The position of the gate to be checked. |
Definition at line 2472 of file Gates_block.cpp.
|
inherited |
Call to create a new circuit with remapped qubits.
qbit_map | The map to reorder the qbits in a form of map: {int(initial_qbit): int(remapped_qbit)}. |
Definition at line 2048 of file Gates_block.cpp.
|
inherited |
Call to create a new circuit with remapped qubits.
qbit_map | The map to reorder the qbits in a form of map: {int(initial_qbit): int(remapped_qbit)}. . |
qbit_num | The number of qubits in the remapped circuit |
Definition at line 2062 of file Gates_block.cpp.
void N_Qubit_Decomposition::decompose_submatrix | ( | ) |
Start the decompostion process to recursively decompose the submatrices.
Definition at line 219 of file N_Qubit_Decomposition.cpp.
|
inherited |
Call to obtain the child gates in the circuit.
A child gate needs to be applied after the given gate. The children gates are stored via the "children" attribute of the gate instance
gate | The gate for which the children are determined. |
Definition at line 2792 of file Gates_block.cpp.
|
inherited |
Call to obtain the parent gates in the circuit.
A parent gate needs to be applied prior to the given gate. The parent gates are stored via the "parents" attribute of the gate instance
gate | The gate for which the parents are determined. |
Definition at line 2746 of file Gates_block.cpp.
|
inherited |
Call to print out into a file the current cost function and the second Rényi entropy on the subsystem made of qubits 0 and 1.
Parameters stored in the class are used to calculate the Renyi entropy
current_minimum | The current minimum (to avoid calculating it again |
current_minimum | The current minimum (to avoid calculating it again |
Definition at line 195 of file Optimization_Interface.cpp.
|
inherited |
Call to print out into a file the current cost function and the second Rényi entropy on the subsystem made of qubits 0 and 1.
current_minimum | The current minimum (to avoid calculating it again |
parameters | Parameters to be used in the calculations (For Rényi entropy) |
Definition at line 208 of file Optimization_Interface.cpp.
|
staticinherited |
Call to print out into a file the current cost function and the second Rényi entropy on the subsystem made of qubits 0 and 1.
current_minimum | The current minimum (to avoid calculating it again |
parameters | Parameters to be used in the calculations (For Rényi entropy) |
instance | A pointer pointing ti the current class instance. |
Definition at line 252 of file Optimization_Interface.cpp.
|
inherited |
exports unitary matrix to binary file
Call to export the unitary (with possible phase shift) into a binary file.
filename | file to be exported to |
filename | The path to the file where the unitary is expored |
Definition at line 959 of file Decomposition_Base.cpp.
|
inherited |
Call to extract the gates stored in the class.
op_block | An instance of Gates_block class in which the gates will be stored. (The current gates will be erased) |
Definition at line 2404 of file Gates_block.cpp.
|
virtualinherited |
Call to extract parameters from the parameter array corresponding to the circuit, in which the gate is embedded.
parameters | The parameter array corresponding to the circuit in which the gate is embedded |
Reimplemented from Gate.
Definition at line 2917 of file Gates_block.cpp.
void N_Qubit_Decomposition::extract_subdecomposition_results | ( | Sub_Matrix_Decomposition * | cSub_decomposition | ) |
Call to extract and store the calculated parameters and gates of the sub-decomposition processes.
cSub_decomposition | An instance of class Sub_Matrix_Decomposition used to disentangle the n-th qubit from the others. |
Definition at line 419 of file N_Qubit_Decomposition.cpp.
|
inherited |
final optimization procedure improving the accuracy of the decompositin when all the qubits were already disentangled.
Definition at line 383 of file Optimization_Interface.cpp.
void N_Qubit_Decomposition::finalize_decomposition | ( | ) |
After the main optimization problem is solved, the indepent qubits can be rotated into state |0> by this def.
The constructed gates are added to the array of gates needed to the decomposition of the input unitary.
Definition at line 334 of file N_Qubit_Decomposition.cpp.
|
inherited |
Definition at line 399 of file Gates_block.cpp.
|
inherited |
Get the number of accelerators to be reserved on DFEs on users demand.
Definition at line 1538 of file Optimization_Interface.cpp.
|
inherited |
|
inherited |
|
inherited |
Call to get the prefactor of the single-bitflip errors in the cost function.
Call to get the pre factor of the single-bitflip errors in the cost function.
(see Eq. (21) in arXiv:2210.09191)
Definition at line 1425 of file Optimization_Interface.cpp.
|
inherited |
Call to get the prefactor of the two-bitflip errors in the cost function.
Call to get the pre factor of the two-bitflip errors in the cost function.
(see Eq. (21) in arXiv:2210.09191)
Definition at line 1438 of file Optimization_Interface.cpp.
|
inherited |
Call to get the variant of the cost function used in the calculations.
Definition at line 1274 of file Optimization_Interface.cpp.
|
inherited |
Call to get the obtained minimum of the cost function.
Definition at line 884 of file Decomposition_Base.cpp.
|
inherited |
Calculate the decomposed matrix resulted by the effect of the optimized gates on the unitary Umtx.
Definition at line 666 of file Decomposition_Base.cpp.
|
inherited |
Call to get the error of the decomposition.
Definition at line 871 of file Decomposition_Base.cpp.
|
inherited |
Method to generate a flat circuit.
A flat circuit is a circuit does not containing subcircuits: there are no Gates_block instances (containing subcircuits) in the resulting circuit. If the original circuit contains subcircuits, the gates in the subcircuits are directly incorporated in the resulting flat circuit.
Definition at line 2879 of file Gates_block.cpp.
The offset in the first columns from which the "trace" is calculated. In this case Tr(A) = sum_(i-offset=j) A_{ij}.
Definition at line 129 of file Optimization_Interface.h.
|
protectedinherited |
|
protectedinherited |
The unitary to be decomposed.
Definition at line 120 of file Decomposition_Base.h.
|
inherited |