From 03cc642a3e87e6eabb7b10f8a78b4867d5e0ac6c Mon Sep 17 00:00:00 2001 From: JoshuaLau0220 Date: Mon, 4 Mar 2024 00:07:07 +0800 Subject: [PATCH 1/2] :art: clang-tidy fix --- .clang-tidy | 17 +++-- src/argparse/arg_type.hpp | 4 +- src/cli/cli.cpp | 6 +- src/cli/cli.hpp | 8 +-- src/cli/cli_tab.cpp | 16 ++--- src/convert/conversion_cmd.cpp | 10 +-- src/tensor/decomposer.cpp | 14 ++-- src/tensor/decomposer.hpp | 103 ++++++++++++++-------------- src/tensor/tensor.hpp | 8 +-- src/util/data_structure_manager.hpp | 1 - src/util/dvlab_string.cpp | 4 +- src/util/dvlab_string.hpp | 4 +- src/util/ordered_hashmap.hpp | 4 +- src/util/phase.hpp | 2 +- src/util/util.hpp | 2 +- src/zx/zxgraph.hpp | 6 +- 16 files changed, 108 insertions(+), 101 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 4b7df1ba..f1c31fad 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -6,7 +6,9 @@ Checks: > -cppcoreguidelines-avoid-magic-numbers, -cppcoreguidelines-owning-memory, -cppcoreguidelines-non-private-member-variables-in-classes, - performance-noexcept-*, + bugprone-assert-side-effect, + performance-*, + performance-move-const-arg, modernize-use-auto, misc-const-correctness, misc-non-copyable-objects, @@ -17,9 +19,16 @@ Checks: > misc-uniqueptr-reset-release, misc-unused-*, misc-use-anonymous-namespace, - bugprone-assert-side-effect, - performance-* - readability-* + readability-*, + -readability-qualified-auto, + -readability-function-cognitive-complexity, + -readability-else-after-return, + -readability-convert-member-functions-to-static, + -readability-uppercase-literal-suffix, + -readability-isolate-declaration, + -readability-braces-around-statements, + -readability-magic-numbers, + -readability-identifier-length, WarningsAsErrors: "" HeaderFilterRegex: ".*" AnalyzeTemporaryDtors: false diff --git a/src/argparse/arg_type.hpp b/src/argparse/arg_type.hpp index 49fbac0b..9ca846ed 100644 --- a/src/argparse/arg_type.hpp +++ b/src/argparse/arg_type.hpp @@ -117,8 +117,8 @@ class ArgType { std::optional _default_value = std::nullopt; std::string _name; - std::string _help = ""; - std::string _metavar = ""; + std::string _help; + std::string _metavar; std::optional _usage = std::nullopt; ActionCallbackType _action_callback = nullptr; std::vector _constraints = {}; diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index a38af5de..3ad5f81d 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -235,7 +235,7 @@ void dvlab::CommandLineInterface::sigint_handler(int signum) { std::optional CommandLineInterface::_dequote(std::string_view str) const { std::string result; - using parse_state = CommandLineInterface::parse_state; + using parse_state = CommandLineInterface::ParseState; parse_state state = parse_state::normal; for (auto&& [i, ch] : str | tl::views::enumerate) { switch (state) { @@ -280,8 +280,8 @@ std::optional CommandLineInterface::_dequote(std::string_view str) * @return true * @return false */ -bool CommandLineInterface::_should_be_escaped(char ch, dvlab::CommandLineInterface::parse_state state) const { - using parse_state = dvlab::CommandLineInterface::parse_state; +bool CommandLineInterface::_should_be_escaped(char ch, dvlab::CommandLineInterface::ParseState state) const { + using parse_state = dvlab::CommandLineInterface::ParseState; switch (state) { case parse_state::normal: return false; diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index 649f9b57..62ad7d11 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -127,7 +127,7 @@ class CommandLineInterface { bool add_variables_from_dofiles(std::filesystem::path const& filepath, std::span arguments); void sigint_handler(int signum); - bool stop_requested() const { return _command_threads.size() && _command_threads.top().get_stop_token().stop_requested(); } + bool stop_requested() const { return !_command_threads.empty() && _command_threads.top().get_stop_token().stop_requested(); } // printing functions void list_all_commands() const; @@ -158,7 +158,7 @@ class CommandLineInterface { constexpr static std::string_view double_quote_special_chars = "\\$"; // The characters that are identified as special characters when parsing inside double quotes constexpr static std::string_view special_chars = "\\$\"\' ;"; // The characters that are identified as special characters when parsing - enum class parse_state { + enum class ParseState { normal, single_quote, double_quote, @@ -219,7 +219,7 @@ class CommandLineInterface { std::string _decode(std::string str) const; CmdExecResult _dispatch_command(dvlab::Command* cmd, std::vector options); bool _is_escaped(std::string_view str, size_t pos) const; - bool _should_be_escaped(char ch, dvlab::CommandLineInterface::parse_state state) const; + bool _should_be_escaped(char ch, dvlab::CommandLineInterface::ParseState state) const; // tab-related features features void _on_tab_pressed(); // onTabPressed subroutines @@ -230,7 +230,7 @@ class CommandLineInterface { // helper functions std::vector _get_file_matches(std::filesystem::path const& filepath) const; - bool _autocomplete(std::string prefix_copy, std::vector const& strs, parse_state state); + bool _autocomplete(std::string prefix_copy, std::vector const& strs, ParseState state); void _print_as_table(std::vector words) const; size_t _get_first_token_pos(std::string_view str, char token = ' ') const; diff --git a/src/cli/cli_tab.cpp b/src/cli/cli_tab.cpp index e9e56d4e..469b4fa7 100644 --- a/src/cli/cli_tab.cpp +++ b/src/cli/cli_tab.cpp @@ -165,7 +165,7 @@ dvlab::CommandLineInterface::TabActionResult dvlab::CommandLineInterface::_match return TabActionResult::no_op; } - if (_autocomplete(var_key, matching_variables, parse_state::normal /* does not matter */)) { + if (_autocomplete(var_key, matching_variables, ParseState::normal /* does not matter */)) { if (matching_variables.size() == 1 && is_brace) { _insert_char('}'); } @@ -184,13 +184,13 @@ dvlab::CommandLineInterface::TabActionResult dvlab::CommandLineInterface::_match dvlab::CommandLineInterface::TabActionResult dvlab::CommandLineInterface::_match_files(std::string_view str) { using namespace std::string_view_literals; std::optional search_string; - parse_state state = parse_state::normal; + ParseState state = ParseState::normal; if (search_string = _dequote(str); search_string.has_value()) { - state = parse_state::normal; + state = ParseState::normal; } else if (search_string = _dequote(std::string{str} + '\"'); search_string.has_value()) { - state = parse_state::double_quote; + state = ParseState::double_quote; } else if (search_string = _dequote(std::string{str} + '\''); search_string.has_value()) { - state = parse_state::single_quote; + state = ParseState::single_quote; } else { spdlog::critical("unexpected dequote result!!"); return TabActionResult::no_op; @@ -226,8 +226,8 @@ dvlab::CommandLineInterface::TabActionResult dvlab::CommandLineInterface::_match if (fs::is_directory(dirname / files[0])) { _insert_char('/'); } else { - if (state == parse_state::single_quote) _insert_char('\''); - if (state == parse_state::double_quote) _insert_char('\"'); + if (state == ParseState::single_quote) _insert_char('\''); + if (state == ParseState::double_quote) _insert_char('\"'); _insert_char(' '); } } @@ -303,7 +303,7 @@ std::vector dvlab::CommandLineInterface::_get_file_matches(fs::path * @return true if able to autocomplete * @return false if not */ -bool dvlab::CommandLineInterface::_autocomplete(std::string prefix_copy, std::vector const& strs, parse_state state) { +bool dvlab::CommandLineInterface::_autocomplete(std::string prefix_copy, std::vector const& strs, ParseState state) { if (strs.size() == 1 && prefix_copy == strs[0]) return true; // edge case: completing a file/dir name that is already complete bool trailing_backslash = false; if (prefix_copy.back() == '\\') { diff --git a/src/convert/conversion_cmd.cpp b/src/convert/conversion_cmd.cpp index 39a7bb28..dce32290 100644 --- a/src/convert/conversion_cmd.cpp +++ b/src/convert/conversion_cmd.cpp @@ -77,10 +77,10 @@ Command convert_from_qcir_cmd( auto to_type = parser.get("to-type"); if (to_type == "zx") { spdlog::info("Converting to QCir {} to ZXGraph {}...", qcir_mgr.focused_id(), zxgraph_mgr.get_next_id()); - auto const g = to_zxgraph(*qcir_mgr.get(), parser.get("decomp-mode")); + auto graph = to_zxgraph(*qcir_mgr.get(), parser.get("decomp-mode")); - if (g.has_value()) { - zxgraph_mgr.add(zxgraph_mgr.get_next_id(), std::make_unique(std::move(g.value()))); + if (graph.has_value()) { + zxgraph_mgr.add(zxgraph_mgr.get_next_id(), std::make_unique(std::move(graph.value()))); zxgraph_mgr.get()->set_filename(qcir_mgr.get()->get_filename()); zxgraph_mgr.get()->add_procedures(qcir_mgr.get()->get_procedures()); @@ -201,7 +201,7 @@ Command convert_from_tensor_cmd(tensor::TensorMgr& tensor_mgr, QCirMgr& qcir_mgr auto to_type = parser.get("to-type"); if (to_type == "qcir") { spdlog::info("Converting Tensor {} to QCir {}...", tensor_mgr.focused_id(), qcir_mgr.get_next_id()); - auto const result = tensor::Decomposer{}.decompose(*tensor_mgr.get()); + auto result = tensor::Decomposer{}.decompose(*tensor_mgr.get()); if (result) { qcir_mgr.add(qcir_mgr.get_next_id(), std::make_unique(std::move(*result))); @@ -258,7 +258,7 @@ Command convert_from_tableau_cmd(experimental::TableauMgr& tableau_mgr, qcir::QC }); spdlog::info("Converting to Tableau {} to QCir {}...", tableau_mgr.focused_id(), qcir_mgr.get_next_id()); - auto const qcir = experimental::to_qcir(*tableau_mgr.get(), *clifford_strategy, *rotation_strategy); + auto qcir = experimental::to_qcir(*tableau_mgr.get(), *clifford_strategy, *rotation_strategy); if (qcir.has_value()) { qcir_mgr.add(qcir_mgr.get_next_id(), std::make_unique(std::move(qcir.value()))); diff --git a/src/tensor/decomposer.cpp b/src/tensor/decomposer.cpp index a7960f81..83259dad 100644 --- a/src/tensor/decomposer.cpp +++ b/src/tensor/decomposer.cpp @@ -16,7 +16,7 @@ namespace qsyn::tensor { * @param qubit_list * @param gate_list */ -void Decomposer::encode_control_gate(QubitIdList const& target, std::vector& qubit_list, std::vector& gate_list) { +void Decomposer::_encode_control_gate(QubitIdList const& target, std::vector& qubit_list, std::vector& gate_list) { qubit_list.emplace_back(target); gate_list.emplace_back(target.size() == 2 ? "cx" : "x"); _quantum_circuit.add_gate(target.size() == 2 ? "cx" : "x", target, {}, true); @@ -30,19 +30,19 @@ void Decomposer::encode_control_gate(QubitIdList const& target, std::vector& qubit_list, std::vector& gate_list) { - bool x_given = 0; +void Decomposer::_encode(size_t origin_pos, size_t targ_pos, std::vector& qubit_list, std::vector& gate_list) { + bool x_given = false; if (((origin_pos >> targ_pos) & 1) == 0) { - encode_control_gate({int(targ_pos)}, qubit_list, gate_list); - x_given = 1; + _encode_control_gate({int(targ_pos)}, qubit_list, gate_list); + x_given = true; } for (size_t i = 0; i < _n_qubits; i++) { if (i == targ_pos) continue; if (((origin_pos >> i) & 1) == 0) - encode_control_gate({int(targ_pos), int(i)}, qubit_list, gate_list); + _encode_control_gate({int(targ_pos), int(i)}, qubit_list, gate_list); } if (x_given) - encode_control_gate({int(targ_pos)}, qubit_list, gate_list); + _encode_control_gate({int(targ_pos)}, qubit_list, gate_list); } } // namespace qsyn::tensor diff --git a/src/tensor/decomposer.hpp b/src/tensor/decomposer.hpp index c2822e3d..b5f0e16c 100644 --- a/src/tensor/decomposer.hpp +++ b/src/tensor/decomposer.hpp @@ -60,7 +60,7 @@ class Decomposer { private: template - TwoLevelMatrix make_two_level_matrix(QTensor const& matrix, size_t i, size_t j) { + TwoLevelMatrix _make_two_level_matrix(QTensor const& matrix, size_t i, size_t j) { auto const kernel = QTensor({{matrix(i, i), matrix(i, j)}, {matrix(j, i), matrix(j, j)}}); @@ -75,35 +75,35 @@ class Decomposer { * @return size_t */ template - size_t get_dimension(Tensor const& matrix) { + size_t _get_dimension(Tensor const& matrix) { DVLAB_ASSERT(matrix.shape().size() == 2 && matrix.shape()[0] == matrix.shape()[1], "Matrix is not square"); return static_cast(matrix.shape()[0]); } template - std::optional> get_two_level_matrix_indices(QTensor const& matrix, double eps); + std::optional> _get_two_level_matrix_indices(QTensor const& matrix, double eps); template - std::vector> get_two_level_matrices(QTensor matrix /* copy on purpose */); + std::vector> _get_two_level_matrices(QTensor matrix /* copy on purpose */); template - bool graycode(Tensor const& matrix, size_t i, size_t j); - void encode(size_t origin_pos, size_t targ_pos, std::vector& qubit_list, std::vector& gate_list); - void encode_control_gate(QubitIdList const& target, std::vector& qubit_list, std::vector& gate_list); + bool _graycode(Tensor const& matrix, size_t i, size_t j); + void _encode(size_t origin_pos, size_t targ_pos, std::vector& qubit_list, std::vector& gate_list); + void _encode_control_gate(QubitIdList const& target, std::vector& qubit_list, std::vector& gate_list); template - bool decompose_CnU(Tensor const& t, size_t diff_pos, size_t index, size_t ctrl_gates); + bool _decompose_cnu(Tensor const& t, size_t diff_pos, size_t index, size_t ctrl_gates); template - bool decompose_CnX(const std::vector& ctrls, const size_t extract_qubit, const size_t index, const size_t ctrl_gates); + bool _decompose_cnx(const std::vector& ctrls, size_t extract_qubit, size_t index, size_t ctrl_gates); template - bool decompose_CU(Tensor const& t, size_t ctrl, size_t targ); + bool _decompose_cu(Tensor const& t, size_t ctrl, size_t targ); template - ZYZ decompose_ZYZ(Tensor const& matrix); + ZYZ _decompose_zyz(Tensor const& matrix); template - Tensor sqrt_single_qubit_matrix(Tensor const& matrix); + Tensor _sqrt_single_qubit_matrix(Tensor const& matrix); }; /** @@ -115,8 +115,8 @@ class Decomposer { */ template std::optional Decomposer::decompose(QTensor const& matrix) { - _n_qubits = static_cast(std::round(std::log2(get_dimension(matrix)))); - auto mat_chain = get_two_level_matrices(matrix); + _n_qubits = static_cast(std::round(std::log2(_get_dimension(matrix)))); + auto mat_chain = _get_two_level_matrices(matrix); _quantum_circuit = QCir(_n_qubits); @@ -132,7 +132,7 @@ std::optional Decomposer::decompose(QTensor const& matrix) { std::swap(mat_chain[i]._matrix(0, 1), mat_chain[i]._matrix(1, 0)); } - if (!graycode(mat_chain[i]._matrix, i_idx, j_idx)) return std::nullopt; + if (!_graycode(mat_chain[i]._matrix, i_idx, j_idx)) return std::nullopt; } return _quantum_circuit; } @@ -146,7 +146,7 @@ std::optional Decomposer::decompose(QTensor const& matrix) { * @return std::optional> */ template -std::optional> Decomposer::get_two_level_matrix_indices(QTensor const& matrix, double eps) { +std::optional> Decomposer::_get_two_level_matrix_indices(QTensor const& matrix, double eps) { using namespace std::literals; auto const dimension = static_cast(matrix.shape()[0]); size_t num_found_diagonal = 0, num_upper_triangle_not_zero = 0, num_lower_triangle_not_zero = 0; @@ -235,7 +235,7 @@ std::optional> Decomposer::get_two_level_matrix_indice * @reference Li, Chi-Kwong, Rebecca Roberts, and Xiaoyan Yin. "Decomposition of unitary matrices and quantum gates." International Journal of Quantum Information 11.01 (2013): 1350015. */ template -std::vector> Decomposer::get_two_level_matrices(QTensor matrix /* copy on purpose */) { +std::vector> Decomposer::_get_two_level_matrices(QTensor matrix /* copy on purpose */) { using namespace std::literals; constexpr double eps = 1e-6; std::vector> two_level_chain; @@ -244,7 +244,7 @@ std::vector> Decomposer::get_two_level_matrices(QTensor mat for (size_t i = 0; i < dimension; i++) { for (size_t j = i + 1; j < dimension; j++) { // if `matrix` is the last two-level matrix - if (auto const pair = get_two_level_matrix_indices(matrix, eps)) { + if (auto const pair = _get_two_level_matrix_indices(matrix, eps)) { auto const& [selected_top, selected_bottom] = *pair; // shortcut for identity @@ -252,7 +252,7 @@ std::vector> Decomposer::get_two_level_matrices(QTensor mat return two_level_chain; } - two_level_chain.emplace_back(make_two_level_matrix(matrix, selected_top, selected_bottom)); + two_level_chain.emplace_back(_make_two_level_matrix(matrix, selected_top, selected_bottom)); return two_level_chain; } @@ -273,7 +273,7 @@ std::vector> Decomposer::get_two_level_matrices(QTensor mat // normalization factor const double u = std::sqrt(std::norm(matrix(i, i)) + std::norm(matrix(j, i))); - auto const n_qubits = static_cast(std::round(std::log2(get_dimension(matrix)))); + auto const n_qubits = static_cast(std::round(std::log2(_get_dimension(matrix)))); QTensor conjugate_matrix_product = QTensor::identity(n_qubits).to_matrix( std::views::iota(0ul, n_qubits) | @@ -291,7 +291,7 @@ std::vector> Decomposer::get_two_level_matrices(QTensor mat matrix = tensordot(conjugate_matrix_product, matrix, {1}, {0}); - two_level_chain.emplace_back(adjoint(make_two_level_matrix(conjugate_matrix_product, i, j))); + two_level_chain.emplace_back(adjoint(_make_two_level_matrix(conjugate_matrix_product, i, j))); } } @@ -309,36 +309,36 @@ std::vector> Decomposer::get_two_level_matrices(QTensor mat * @return false */ template -bool Decomposer::Decomposer::graycode(Tensor const& matrix, size_t I, size_t J) { +bool Decomposer::Decomposer::_graycode(Tensor const& matrix, size_t i, size_t j) { // do pabbing std::vector qubit_list; std::vector gate_list; size_t diff_pos = 0; - for (size_t i = 0; i < _n_qubits; i++) { - if ((((I ^ J) >> i) & 1) && (J >> i & 1)) { - diff_pos = i; + for (size_t q = 0; q < _n_qubits; q++) { + if ((((i ^ j) >> q) & 1) && (j >> q & 1)) { + diff_pos = q; break; } } - if ((I + size_t(std::pow(2, diff_pos))) != size_t(std::pow(2, _n_qubits) - 1)) - encode(I, diff_pos, qubit_list, gate_list); + if ((i + size_t(std::pow(2, diff_pos))) != size_t(std::pow(2, _n_qubits) - 1)) + _encode(i, diff_pos, qubit_list, gate_list); - encode(J, diff_pos, qubit_list, gate_list); + _encode(j, diff_pos, qubit_list, gate_list); // decompose CnU size_t ctrl_index = 0; // q2 q1 q0 = t,c,c -> ctrl_index = 011 = 3 - for (size_t i = 0; i < _n_qubits; i++) { - if (i != diff_pos) - ctrl_index += size_t(pow(2, i)); + for (size_t q = 0; q < _n_qubits; q++) { + if (q != diff_pos) + ctrl_index += size_t(pow(2, q)); } - if (!decompose_CnU(matrix, diff_pos, ctrl_index, _n_qubits - 1)) return false; + if (!_decompose_cnu(matrix, diff_pos, ctrl_index, _n_qubits - 1)) return false; // do unpabbing DVLAB_ASSERT(gate_list.size() == qubit_list.size(), "Sizes of gate list and qubit list are different"); - for (auto const& i : std::views::iota(0UL, gate_list.size()) | std::views::reverse) - _quantum_circuit.add_gate(gate_list[i], qubit_list[i], {}, true); + for (auto const& q : std::views::iota(0UL, gate_list.size()) | std::views::reverse) + _quantum_circuit.add_gate(gate_list[q], qubit_list[q], {}, true); return true; } @@ -356,7 +356,7 @@ bool Decomposer::Decomposer::graycode(Tensor const& matrix, size_t I, size_t * @reference Nakahara, Mikio, and Tetsuo Ohmi. Quantum computing: from linear algebra to physical realizations. CRC press, 2008. */ template -bool Decomposer::decompose_CnU(Tensor const& t, size_t diff_pos, size_t index, size_t ctrl_gates) { +bool Decomposer::_decompose_cnu(Tensor const& t, size_t diff_pos, size_t index, size_t ctrl_gates) { DVLAB_ASSERT(ctrl_gates >= 1, "The control qubit left in the CnU gate should be at least 1"); size_t ctrl = (diff_pos == 0) ? 1 : diff_pos - 1; @@ -371,7 +371,7 @@ bool Decomposer::decompose_CnU(Tensor const& t, size_t diff_pos, size_t index } } if (ctrl_gates == 1) { - if (!decompose_CU(t, ctrl, diff_pos)) return false; + if (!_decompose_cu(t, ctrl, diff_pos)) return false; } else { size_t extract_qubit = -1; for (size_t i = 0; i < _n_qubits; i++) { @@ -383,8 +383,8 @@ bool Decomposer::decompose_CnU(Tensor const& t, size_t diff_pos, size_t index break; } } - Tensor V = sqrt_single_qubit_matrix(t); - if (!decompose_CU(V, extract_qubit, diff_pos)) return false; + Tensor v = _sqrt_single_qubit_matrix(t); + if (!_decompose_cu(v, extract_qubit, diff_pos)) return false; std::vector ctrls; for (size_t i = 0; i < size_t(log2(index)) + 1; i++) { @@ -392,15 +392,15 @@ bool Decomposer::decompose_CnU(Tensor const& t, size_t diff_pos, size_t index ctrls.emplace_back(i); } - decompose_CnX(ctrls, extract_qubit, index, ctrl_gates - 1); + _decompose_cnx(ctrls, extract_qubit, index, ctrl_gates - 1); - V.adjoint(); - if (!decompose_CU(V, extract_qubit, diff_pos)) return false; + v.adjoint(); + if (!_decompose_cu(v, extract_qubit, diff_pos)) return false; - decompose_CnX(ctrls, extract_qubit, index, ctrl_gates - 1); + _decompose_cnx(ctrls, extract_qubit, index, ctrl_gates - 1); - V.adjoint(); - if (!decompose_CnU(V, diff_pos, index, ctrl_gates - 1)) return false; + v.adjoint(); + if (!_decompose_cnu(v, diff_pos, index, ctrl_gates - 1)) return false; } return true; @@ -418,14 +418,14 @@ bool Decomposer::decompose_CnU(Tensor const& t, size_t diff_pos, size_t index * @return false */ template -bool Decomposer::decompose_CnX(const std::vector& ctrls, const size_t extract_qubit, const size_t index, const size_t ctrl_gates) { +bool Decomposer::_decompose_cnx(const std::vector& ctrls, const size_t extract_qubit, const size_t index, const size_t ctrl_gates) { if (ctrls.size() == 1) { _quantum_circuit.add_gate("cx", {int(ctrls[0]), int(extract_qubit)}, {}, true); } else if (ctrls.size() == 2) { _quantum_circuit.add_gate("ccx", {int(ctrls[0]), int(ctrls[1]), int(extract_qubit)}, {}, true); } else { using float_type = U::value_type; - if (!decompose_CnU(QTensor::xgate(), extract_qubit, index, ctrl_gates)) return false; + if (!_decompose_cnu(QTensor::xgate(), extract_qubit, index, ctrl_gates)) return false; } return true; } @@ -442,9 +442,9 @@ bool Decomposer::decompose_CnX(const std::vector& ctrls, const size_t ex * @reference Nakahara, Mikio, and Tetsuo Ohmi. Quantum computing: from linear algebra to physical realizations. CRC press, 2008. */ template -bool Decomposer::decompose_CU(Tensor const& t, size_t ctrl, size_t targ) { +bool Decomposer::_decompose_cu(Tensor const& t, size_t ctrl, size_t targ) { constexpr double eps = 1e-6; - const ZYZ angles = decompose_ZYZ(t); + const ZYZ angles = _decompose_zyz(t); if (!angles.correct) return false; if (std::abs((angles.alpha - angles.gamma) / 2) > eps) @@ -486,7 +486,7 @@ bool Decomposer::decompose_CU(Tensor const& t, size_t ctrl, size_t targ) { * @reference Nakahara, Mikio, and Tetsuo Ohmi. Quantum computing: from linear algebra to physical realizations. CRC press, 2008. */ template -ZYZ Decomposer::decompose_ZYZ(Tensor const& matrix) { +ZYZ Decomposer::_decompose_zyz(Tensor const& matrix) { DVLAB_ASSERT(matrix.shape()[0] == 2 && matrix.shape()[1] == 2, "decompose_ZYZ only supports 2x2 matrix"); using namespace std::literals; // a = e^{iφ}e^{-i(α+γ)/2}cos(β/2) @@ -503,8 +503,9 @@ ZYZ Decomposer::decompose_ZYZ(Tensor const& matrix) { init_beta = std::acos(std::abs(a)); } + constexpr auto pi = std::numbers::pi_v; // NOTE - Possible betas due to arccosine - const std::array beta_candidate = {init_beta, PI - init_beta, PI + init_beta, 2.0 * PI - init_beta}; + const std::array beta_candidate = {init_beta, pi - init_beta, pi + init_beta, 2.0 * pi - init_beta}; for (const auto& beta : beta_candidate) { output.beta = beta; std::complex a1, b1, c1, d1; @@ -557,7 +558,7 @@ ZYZ Decomposer::decompose_ZYZ(Tensor const& matrix) { * @reference https://en.wikipedia.org/wiki/Square_root_of_a_2_by_2_matrix */ template -Tensor Decomposer::sqrt_single_qubit_matrix(Tensor const& matrix) { +Tensor Decomposer::_sqrt_single_qubit_matrix(Tensor const& matrix) { DVLAB_ASSERT(matrix.shape()[0] == 2 && matrix.shape()[1] == 2, "sqrt_single_qubit_matrix only supports 2x2 matrix"); // a b // c d diff --git a/src/tensor/tensor.hpp b/src/tensor/tensor.hpp index b414c9d4..28161687 100644 --- a/src/tensor/tensor.hpp +++ b/src/tensor/tensor.hpp @@ -28,8 +28,6 @@ #include "./tensor_util.hpp" #include "util/util.hpp" -constexpr double PI = 3.1415926919; - namespace qsyn::tensor { template @@ -110,7 +108,7 @@ class Tensor { template friend bool is_partition(Tensor const& t, TensorAxisList const& axes1, TensorAxisList const& axes2); - Tensor
to_matrix(TensorAxisList const& row_axes, TensorAxisList const& col_axis); + Tensor
to_matrix(TensorAxisList const& row_axes, TensorAxisList const& col_axes); template friend Tensor direct_sum(Tensor const& t1, Tensor const& t2); @@ -119,8 +117,8 @@ class Tensor { Tensor
transpose(TensorAxisList const& perm) const; void adjoint(); - bool tensor_read(std::string const&); - bool tensor_write(std::string const&); + bool tensor_read(std::string const& filepath); + bool tensor_write(std::string const& filepath); protected: friend struct fmt::formatter; diff --git a/src/util/data_structure_manager.hpp b/src/util/data_structure_manager.hpp index cb49836a..4e378dc0 100644 --- a/src/util/data_structure_manager.hpp +++ b/src/util/data_structure_manager.hpp @@ -121,7 +121,6 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg if (this->empty()) { fmt::println("Note: The {} list is empty now", _type_name); } - return; } void checkout(size_t id) { diff --git a/src/util/dvlab_string.cpp b/src/util/dvlab_string.cpp index 70f4dc10..ba0c69f9 100644 --- a/src/util/dvlab_string.cpp +++ b/src/util/dvlab_string.cpp @@ -48,7 +48,7 @@ std::string trim_spaces(std::string_view str) { * @param right }, ], ) * @return string */ -std::string remove_brackets(std::string const& str, char const left, char const right) { +std::string remove_brackets(std::string const& str, char left, char right) { auto const last_found = str.find_last_of(right); auto const first_found = str.find_first_of(left); return trim_spaces(str.substr(first_found + 1, last_found - first_found - 1)); @@ -71,7 +71,7 @@ str_get_token(std::string_view str, std::string& tok, size_t pos, std::string co return end; } -size_t str_get_token(std::string_view str, std::string& tok, size_t pos, char const delim) { +size_t str_get_token(std::string_view str, std::string& tok, size_t pos, char delim) { return str_get_token(str, tok, pos, std::string(1, delim)); } diff --git a/src/util/dvlab_string.hpp b/src/util/dvlab_string.hpp index 075734db..10eebe04 100644 --- a/src/util/dvlab_string.hpp +++ b/src/util/dvlab_string.hpp @@ -37,9 +37,9 @@ std::string trim_spaces(std::string_view str); * @return std::string */ inline std::string_view trim_comments(std::string_view line) { return line.substr(0, line.find("//")); } -std::string remove_brackets(std::string const& str, char const left, char const right); +std::string remove_brackets(std::string const& str, char left, char right); size_t str_get_token(std::string_view str, std::string& tok, size_t pos = 0, std::string const& delim = " \t\n\v\f\r"); -size_t str_get_token(std::string_view str, std::string& tok, size_t pos, char const delim); +size_t str_get_token(std::string_view str, std::string& tok, size_t pos, char delim); namespace detail { template diff --git a/src/util/ordered_hashmap.hpp b/src/util/ordered_hashmap.hpp index 042a3e3a..e5630f97 100644 --- a/src/util/ordered_hashmap.hpp +++ b/src/util/ordered_hashmap.hpp @@ -158,7 +158,7 @@ class ordered_hashmap final : public ordered_hashtable insert_or_assign(Key&& key, T&& obj) { auto ret = try_emplace(std::move(key), std::move(obj)); - if (ret.second == false) { + if (!ret.second) { ret.first->second = std::move(obj); } return ret; @@ -166,7 +166,7 @@ class ordered_hashmap final : public ordered_hashtable insert_or_assign(Key const& key, T&& obj) { auto ret = try_emplace(key, std::move(obj)); - if (ret.second == false) { + if (!ret.second) { ret.first->second = std::move(obj); } return ret; diff --git a/src/util/phase.hpp b/src/util/phase.hpp index c62bc8d5..559bd876 100644 --- a/src/util/phase.hpp +++ b/src/util/phase.hpp @@ -25,7 +25,7 @@ class Rational; template concept unitless = requires(T t) { - std::is_arithmetic_v == true || std::same_as == true; + std::is_arithmetic_v || std::same_as; }; class Phase { diff --git a/src/util/util.hpp b/src/util/util.hpp index ac401dd5..c941300c 100644 --- a/src/util/util.hpp +++ b/src/util/util.hpp @@ -115,7 +115,7 @@ Iter prev(Iter iter, DiffT n = 1) { * @tparam Ts */ template -struct overloaded : Ts... { +struct overloaded : Ts... { // NOLINT(readability-identifier-naming) // mimic library using Ts::operator()...; }; // explicit deduction guide (not needed as of C++20) diff --git a/src/zx/zxgraph.hpp b/src/zx/zxgraph.hpp index f3b2c6ba..38adf8b5 100644 --- a/src/zx/zxgraph.hpp +++ b/src/zx/zxgraph.hpp @@ -99,7 +99,7 @@ class ZXGraph { // NOLINT(cppcoreguidelines-special-member-functions) : copy-sw ZXGraph() {} ~ZXGraph() { - for (auto& v : _vertices) { + for (auto const& v : _vertices) { delete v; } } @@ -279,8 +279,8 @@ class ZXGraph { // NOLINT(cppcoreguidelines-special-member-functions) : copy-sw } template void for_each_edge(F lambda) const { - for (auto& v : _vertices) { - for (auto& [nb, etype] : this->get_neighbors(v)) { + for (auto const& v : _vertices) { + for (auto const& [nb, etype] : this->get_neighbors(v)) { if (nb->get_id() > v->get_id()) lambda(make_edge_pair(v, nb, etype)); } From 2f2b66a110b3b8cb6428bd912d7de6698c26e329 Mon Sep 17 00:00:00 2001 From: JoshuaLau0220 Date: Mon, 4 Mar 2024 00:31:49 +0800 Subject: [PATCH 2/2] :art: clang-tidy fix --- .clang-tidy | 2 + src/argparse/arg_def.hpp | 2 +- src/argparse/arg_parser.hpp | 8 +-- src/cli/cli.hpp | 8 +-- src/convert/qcir_to_tableau.cpp | 18 +++--- src/convert/tableau_to_qcir.cpp | 2 +- src/convert/tableau_to_qcir.hpp | 2 +- src/convert/zxgraph_to_tensor.cpp | 38 +++++------ src/device/device.cpp | 12 ++-- src/device/device.hpp | 10 +-- src/duostra/scheduler.hpp | 2 +- src/qcir/optimizer/basic_optimization.cpp | 6 +- src/qcir/optimizer/gate_optimization.cpp | 20 +++--- src/qcir/optimizer/optimizer.cpp | 16 ++--- src/qcir/optimizer/optimizer.hpp | 6 +- src/qcir/qcir_cmd.cpp | 2 +- src/qcir/qcir_gate.hpp | 2 +- src/qsyn/qsyn_helper.cpp | 2 +- src/qsyn/qsyn_helper.hpp | 2 +- src/qsyn/qsyn_main.cpp | 3 +- src/tableau/pauli_rotation.cpp | 78 +++++++++++------------ src/tableau/pauli_rotation.hpp | 66 +++++++++---------- src/tableau/stabilizer_tableau.hpp | 4 +- src/util/cin_cout_cerr.hpp | 2 + src/util/scope_guard.hpp | 2 +- src/util/usage.cpp | 30 ++++----- src/util/usage.hpp | 10 +-- 27 files changed, 180 insertions(+), 175 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index f1c31fad..2c36c633 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -20,6 +20,8 @@ Checks: > misc-unused-*, misc-use-anonymous-namespace, readability-*, + -readability-implicit-bool-conversion, + -readability-redundant-string-init, -readability-qualified-auto, -readability-function-cognitive-complexity, -readability-else-after-return, diff --git a/src/argparse/arg_def.hpp b/src/argparse/arg_def.hpp index c02f0681..aec341e1 100644 --- a/src/argparse/arg_def.hpp +++ b/src/argparse/arg_def.hpp @@ -15,7 +15,7 @@ namespace dvlab::argparse { namespace detail { -struct heterogeneous_string_hash { +struct HeterogeneousStringHash { using is_transparent = void; [[nodiscard]] size_t operator()(std::string_view str) const noexcept { return std::hash{}(str); } [[nodiscard]] size_t operator()(std::string const& str) const noexcept { return std::hash{}(str); } diff --git a/src/argparse/arg_parser.hpp b/src/argparse/arg_parser.hpp index 4f48bf4c..2e1c5327 100644 --- a/src/argparse/arg_parser.hpp +++ b/src/argparse/arg_parser.hpp @@ -37,7 +37,7 @@ struct ArgumentParserConfig { class SubParsers { private: struct SubParsersImpl; - using MapType = dvlab::utils::ordered_hashmap>; + using MapType = dvlab::utils::ordered_hashmap>; std::shared_ptr _pimpl; public: @@ -180,9 +180,9 @@ class ArgumentParser { friend std::string detail::styled_parser_name(ArgumentParser const& parser); friend std::string detail::styled_parser_name_trace(ArgumentParser const& parser); struct ArgumentParserImpl { - dvlab::utils::ordered_hashmap> arguments; - std::unordered_map> alias_forward_map; - std::unordered_multimap> alias_reverse_map; + dvlab::utils::ordered_hashmap> arguments; + std::unordered_map> alias_forward_map; + std::unordered_multimap> alias_reverse_map; std::string option_prefixes = "-"; std::vector tokens; std::unordered_map dests; diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index 62ad7d11..e4d1db68 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -29,7 +29,7 @@ namespace dvlab { namespace detail { -struct heterogeneous_string_hash { +struct HeterogenousStringHash { using is_transparent = void; [[nodiscard]] size_t operator()(std::string_view str) const noexcept { return std::hash{}(str); } @@ -99,7 +99,7 @@ class CommandLineInterface { static constexpr size_t read_buf_size = 65536; static constexpr size_t page_offset = 10; - using CmdMap = std::unordered_map, detail::heterogeneous_string_hash, std::equal_to<>>; + using CmdMap = std::unordered_map, detail::HeterogenousStringHash, std::equal_to<>>; public: /** @@ -206,8 +206,8 @@ class CommandLineInterface { std::vector _history; }; bool _echo = true; - std::unordered_map> _aliases; - std::unordered_map> _variables; // stores the variables key-value pairs, e.g., $1, $INPUT_FILE, etc... + std::unordered_map> _aliases; + std::unordered_map> _variables; // stores the variables key-value pairs, e.g., $1, $INPUT_FILE, etc... std::stack _command_threads; diff --git a/src/convert/qcir_to_tableau.cpp b/src/convert/qcir_to_tableau.cpp index 9f26113f..30b46d03 100644 --- a/src/convert/qcir_to_tableau.cpp +++ b/src/convert/qcir_to_tableau.cpp @@ -41,13 +41,13 @@ Pauli to_pauli(qcir::GateRotationCategory const& category) { switch (category) { case qcir::GateRotationCategory::rz: case qcir::GateRotationCategory::pz: - return Pauli::Z; + return Pauli::z; case qcir::GateRotationCategory::rx: case qcir::GateRotationCategory::px: - return Pauli::X; + return Pauli::x; case qcir::GateRotationCategory::ry: case qcir::GateRotationCategory::py: - return Pauli::Y; + return Pauli::y; default: DVLAB_UNREACHABLE("Invalid rotation category"); } @@ -133,7 +133,7 @@ void implement_mcrz(Tableau& tableau, qcir::QCirGate const& gate, dvlab::Phase c std::views::iota(0ul, tableau.n_qubits()) | std::views::transform([&qubit_idx_vec, &comb_size, targ](auto i) -> Pauli { // if i is in qubit_idx_range, return Z, otherwise I - return (i == targ) || contains(qubit_idx_vec | std::views::take(comb_size), i) ? Pauli::Z : Pauli::I; + return (i == targ) || contains(qubit_idx_vec | std::views::take(comb_size), i) ? Pauli::z : Pauli::i; }) | tl::to(); last_rotation_group.push_back(PauliRotation(pauli_range.begin(), pauli_range.end(), is_neg ? -phase : phase)); @@ -155,7 +155,7 @@ void implement_mcpz(Tableau& tableau, qcir::QCirGate const& gate, dvlab::Phase c auto const pauli_range = std::views::iota(0ul, tableau.n_qubits()) | std::views::transform([&qubit_idx_vec, &comb_size](auto i) -> Pauli { - return contains(qubit_idx_vec | std::views::take(comb_size), i) ? Pauli::Z : Pauli::I; + return contains(qubit_idx_vec | std::views::take(comb_size), i) ? Pauli::z : Pauli::i; }) | tl::to(); last_rotation_group.push_back(PauliRotation(pauli_range.begin(), pauli_range.end(), is_neg ? -phase : phase)); @@ -173,9 +173,9 @@ void implement_rotation_gate(Tableau& tableau, qcir::QCirGate const& gate) { auto const targ = gsl::narrow(gate.get_qubits().back()._qubit); // convert rotation plane first - if (pauli == Pauli::X) { + if (pauli == Pauli::x) { tableau.h(targ); - } else if (pauli == Pauli::Y) { + } else if (pauli == Pauli::y) { tableau.v(targ); } @@ -190,9 +190,9 @@ void implement_rotation_gate(Tableau& tableau, qcir::QCirGate const& gate) { } // restore rotation plane - if (pauli == Pauli::X) { + if (pauli == Pauli::x) { tableau.h(targ); - } else if (pauli == Pauli::Y) { + } else if (pauli == Pauli::y) { tableau.vdg(targ); } } diff --git a/src/convert/tableau_to_qcir.cpp b/src/convert/tableau_to_qcir.cpp index c636ff27..bda53e1c 100644 --- a/src/convert/tableau_to_qcir.cpp +++ b/src/convert/tableau_to_qcir.cpp @@ -68,7 +68,7 @@ void add_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op) { * @param clifford - pass by value on purpose * @return std::optional */ -std::optional to_qcir(StabilizerTableau clifford, StabilizerTableauSynthesisStrategy const& strategy) { +std::optional to_qcir(StabilizerTableau const& clifford, StabilizerTableauSynthesisStrategy const& strategy) { qcir::QCir qcir{clifford.n_qubits()}; for (auto const& op : extract_clifford_operators(clifford, strategy)) { add_clifford_gate(qcir, op); diff --git a/src/convert/tableau_to_qcir.hpp b/src/convert/tableau_to_qcir.hpp index 74851bf1..9126ecfe 100644 --- a/src/convert/tableau_to_qcir.hpp +++ b/src/convert/tableau_to_qcir.hpp @@ -31,7 +31,7 @@ struct TParPauliRotationsSynthesisStrategy : public PauliRotationsSynthesisStrat }; std::optional to_qcir( - StabilizerTableau clifford, + StabilizerTableau const& clifford, StabilizerTableauSynthesisStrategy const& strategy); std::optional to_qcir( std::vector const& rotations, diff --git a/src/convert/zxgraph_to_tensor.cpp b/src/convert/zxgraph_to_tensor.cpp index a7ec7b13..feeea6db 100644 --- a/src/convert/zxgraph_to_tensor.cpp +++ b/src/convert/zxgraph_to_tensor.cpp @@ -51,25 +51,25 @@ class ZX2TSMapper { std::vector frontiers_to_add; // New frontiers to be added }; - auto& frontiers(size_t id) { return _zx2ts_list.at(id).frontiers; } - auto& tensor(size_t id) { return _zx2ts_list.at(id).tensor; } - auto const& frontiers(size_t id) const { return _zx2ts_list.at(id).frontiers; } - auto const& tensor(size_t id) const { return _zx2ts_list.at(id).tensor; } + auto& _frontiers(size_t id) { return _zx2ts_list.at(id).frontiers; } + auto& _tensor(size_t id) { return _zx2ts_list.at(id).tensor; } + auto const& _frontiers(size_t id) const { return _zx2ts_list.at(id).frontiers; } + auto const& _tensor(size_t id) const { return _zx2ts_list.at(id).tensor; } - auto& _curr_frontiers() { return frontiers(_current_tensor_id); } - auto& _curr_tensor() { return tensor(_current_tensor_id); } - auto const& _curr_frontiers() const { return frontiers(_current_tensor_id); } - auto const& _curr_tensor() const { return tensor(_current_tensor_id); } + auto& _curr_frontiers() { return _frontiers(_current_tensor_id); } + auto& _curr_tensor() { return _tensor(_current_tensor_id); } + auto const& _curr_frontiers() const { return _frontiers(_current_tensor_id); } + auto const& _curr_tensor() const { return _tensor(_current_tensor_id); } void _map_one_vertex(zx::ZXGraph const& graph, zx::ZXVertex* v); // mapOneVertex Subroutines void _initialize_subgraph(zx::ZXGraph const& graph, zx::ZXVertex* v); - MappingInfo calculate_mapping_info(zx::ZXGraph const& graph, zx::ZXVertex* v); + MappingInfo _calculate_mapping_info(zx::ZXGraph const& graph, zx::ZXVertex* v); tensor::QTensor _dehadamardize(tensor::QTensor const& ts, MappingInfo& info); void _tensordot_vertex(zx::ZXGraph const& graph, zx::ZXVertex* v); - size_t get_tensor_id(zx::ZXGraph const& graph, zx::ZXVertex* v); + size_t _get_tensor_id(zx::ZXGraph const& graph, zx::ZXVertex* v); bool _is_frontier(zx::NeighborPair const& nbr) const { return _pins.contains(nbr.first); } struct InOutAxisList { @@ -117,7 +117,7 @@ std::optional> ZX2TSMapper::map(zx::ZXGraph const& graph std::ranges::for_each(std::views::iota(0ul, _zx2ts_list.size()), [this](auto const i) { // We don't care whether key collision happen because _get_axis_orders takes care of such cases - frontiers(i).emplace(_boundary_edges[i], 0); + _frontiers(i).emplace(_boundary_edges[i], 0); }); auto const [input_ids, output_ids] = _get_axis_orders(graph); @@ -164,7 +164,7 @@ namespace { */ void ZX2TSMapper::_map_one_vertex(zx::ZXGraph const& graph, zx::ZXVertex* v) { if (stop_requested()) return; - _current_tensor_id = get_tensor_id(graph, v); + _current_tensor_id = _get_tensor_id(graph, v); if (_current_tensor_id == _pins.size() /* is a new subgraph */) { _initialize_subgraph(graph, v); @@ -207,7 +207,7 @@ void ZX2TSMapper::_initialize_subgraph(zx::ZXGraph const& graph, zx::ZXVertex* v * @param v vertex * @return the tensor id */ -size_t ZX2TSMapper::get_tensor_id(zx::ZXGraph const& graph, zx::ZXVertex* v) { +size_t ZX2TSMapper::_get_tensor_id(zx::ZXGraph const& graph, zx::ZXVertex* v) { auto const it = std::ranges::find_if( graph.get_neighbors(v), [this](auto const& neighbor) { @@ -244,7 +244,7 @@ ZX2TSMapper::InOutAxisList ZX2TSMapper::_get_axis_orders(zx::ZXGraph const& zxgr size_t acc_frontier_size = 0; for (size_t i = 0; i < _zx2ts_list.size(); ++i) { bool has_boundary_to_boundary_edge = false; - for (auto& [epair, axid] : frontiers(i)) { + for (auto& [epair, axid] : _frontiers(i)) { auto const& [v1, v2] = epair.first; auto const v1_is_input = zxgraph.get_inputs().contains(v1); auto const v2_is_input = zxgraph.get_inputs().contains(v2); @@ -260,17 +260,17 @@ ZX2TSMapper::InOutAxisList ZX2TSMapper::_get_axis_orders(zx::ZXGraph const& zxgr // If seeing boundary-to-boundary edge, increase one of the axis id by one to avoid id collision if (v1_is_input && (v2_is_input || v2_is_output)) { - assert(frontiers(i).size() == 1); + assert(_frontiers(i).size() == 1); axis_lists.inputs[input_table.at(v1->get_qubit())]--; has_boundary_to_boundary_edge = true; } if (v1_is_output && (v2_is_input || v2_is_output)) { - assert(frontiers(i).size() == 1); + assert(_frontiers(i).size() == 1); axis_lists.outputs[output_table.at(v1->get_qubit())]--; has_boundary_to_boundary_edge = true; } } - acc_frontier_size += frontiers(i).size() + (has_boundary_to_boundary_edge ? 1 : 0); + acc_frontier_size += _frontiers(i).size() + (has_boundary_to_boundary_edge ? 1 : 0); } return axis_lists; @@ -281,7 +281,7 @@ ZX2TSMapper::InOutAxisList ZX2TSMapper::_get_axis_orders(zx::ZXGraph const& zxgr * * @param v the current vertex */ -ZX2TSMapper::MappingInfo ZX2TSMapper::calculate_mapping_info(zx::ZXGraph const& graph, zx::ZXVertex* v) { +ZX2TSMapper::MappingInfo ZX2TSMapper::_calculate_mapping_info(zx::ZXGraph const& graph, zx::ZXVertex* v) { MappingInfo info; for (auto& nbr : graph.get_neighbors(v)) { @@ -351,7 +351,7 @@ tensor::QTensor ZX2TSMapper::_dehadamardize(tensor::QTensor cons * @param v current vertex */ void ZX2TSMapper::_tensordot_vertex(zx::ZXGraph const& graph, zx::ZXVertex* v) { - auto info = calculate_mapping_info(graph, v); + auto info = _calculate_mapping_info(graph, v); if (v->is_boundary()) { spdlog::debug("Mapping vertex {:>4} ({}): Boundary", v->get_id(), v->get_type()); diff --git a/src/device/device.cpp b/src/device/device.cpp index 8c72a9a1..7719a2b8 100644 --- a/src/device/device.cpp +++ b/src/device/device.cpp @@ -430,7 +430,7 @@ bool Device::read_device(std::string const& filename) { std::string str = "", token = "", data = ""; // NOTE - Device name - while (str == "") { + while (str.empty()) { std::getline(topo_file, str); str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); } @@ -441,7 +441,7 @@ bool Device::read_device(std::string const& filename) { // NOTE - Qubit num str = "", token = "", data = ""; - while (str == "") { + while (str.empty()) { std::getline(topo_file, str); str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); } @@ -457,7 +457,7 @@ bool Device::read_device(std::string const& filename) { // NOTE - Gate set str = "", token = "", data = ""; - while (str == "") { + while (str.empty()) { std::getline(topo_file, str); str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); } @@ -465,7 +465,7 @@ bool Device::read_device(std::string const& filename) { // NOTE - Coupling map str = "", token = "", data = ""; - while (str == "") { + while (str.empty()) { std::getline(topo_file, str); str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); } @@ -544,7 +544,7 @@ bool Device::_parse_gate_set(std::string const& gate_set_str) { bool Device::_parse_info(std::ifstream& f, std::vector>& cx_error, std::vector>& cx_delay, std::vector& single_error, std::vector& single_delay) { std::string str = "", token = ""; while (true) { - while (str == "") { + while (str.empty()) { if (f.eof()) break; std::getline(f, str); str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); @@ -705,7 +705,7 @@ void Device::print_edges(std::vector candidates) const { for (auto const& [idx, info] : _qubit_list) { qubits[idx] = info; } - if (candidates.size() == 0) { + if (candidates.empty()) { size_t cnt = 0; for (size_t i = 0; i < _num_qubit; i++) { for (auto& q : qubits[i].get_adjacencies()) { diff --git a/src/device/device.hpp b/src/device/device.hpp index 4c19c7ad..5c74fab9 100644 --- a/src/device/device.hpp +++ b/src/device/device.hpp @@ -92,8 +92,8 @@ class PhysicalQubit { // traversal auto get_cost() const { return _cost; } - auto is_marked() { return _marked; } - auto is_taken() { return _taken; } + auto is_marked() const { return _marked; } + auto is_taken() const { return _taken; } auto get_source() const { return _source; } auto get_predecessor() const { return _pred; } auto get_swap_time() const { return _swap_time; } @@ -149,7 +149,7 @@ class Device { void floyd_warshall(); std::vector get_path(QubitIdType src, QubitIdType dest) const; - bool read_device(std::string const&); + bool read_device(std::string const& filename); void print_qubits(std::vector candidates = {}) const; void print_edges(std::vector candidates = {}) const; @@ -183,9 +183,9 @@ class Device { class Operation { public: - friend std::ostream& operator<<(std::ostream&, Operation const&); + friend std::ostream& operator<<(std::ostream& os, Operation const& op); - Operation(qcir::GateRotationCategory, dvlab::Phase, std::tuple, std::tuple); + Operation(qcir::GateRotationCategory op, dvlab::Phase ph, std::tuple qubits, std::tuple duration); qcir::GateRotationCategory get_type() const { return _operation; } dvlab::Phase get_phase() const { return _phase; } diff --git a/src/duostra/scheduler.hpp b/src/duostra/scheduler.hpp index 0880ce57..3c237f42 100644 --- a/src/duostra/scheduler.hpp +++ b/src/duostra/scheduler.hpp @@ -172,7 +172,7 @@ class TreeNode { // NOLINT(hicpp-special-member-functions, cppcoreguidelines-sp } bool is_leaf() const { return _children.empty(); } - bool can_grow() const { return scheduler().get_available_gates().size(); } + bool can_grow() const { return !scheduler().get_available_gates().empty(); } TreeNode best_child(size_t depth); size_t best_cost(size_t depth); diff --git a/src/qcir/optimizer/basic_optimization.cpp b/src/qcir/optimizer/basic_optimization.cpp index 4f1e5869..3f92be78 100644 --- a/src/qcir/optimizer/basic_optimization.cpp +++ b/src/qcir/optimizer/basic_optimization.cpp @@ -311,9 +311,9 @@ void Optimizer::_add_cx(QubitIdType t1, QubitIdType t2, bool do_swap) { _available[t2].clear(); _available[t2].emplace_back(cnot); std::swap(_permutation.at(t2), _permutation.at(t1)); - Optimizer::_swap_element(_ElementType::h, t1, t2); - Optimizer::_swap_element(_ElementType::x, t1, t2); - Optimizer::_swap_element(_ElementType::z, t1, t2); + Optimizer::_swap_element(ElementType::h, t1, t2); + Optimizer::_swap_element(ElementType::x, t1, t2); + Optimizer::_swap_element(ElementType::z, t1, t2); return; } } diff --git a/src/qcir/optimizer/gate_optimization.cpp b/src/qcir/optimizer/gate_optimization.cpp index 5e5c66ee..455d54d1 100644 --- a/src/qcir/optimizer/gate_optimization.cpp +++ b/src/qcir/optimizer/gate_optimization.cpp @@ -58,7 +58,7 @@ void Optimizer::_match_hadamards(QCirGate* gate) { return; } } - _toggle_element(_ElementType::h, qubit); + _toggle_element(ElementType::h, qubit); } void Optimizer::_match_xs(QCirGate* gate) { @@ -68,7 +68,7 @@ void Optimizer::_match_xs(QCirGate* gate) { spdlog::trace("Cancel X-X into Id"); _statistics.X_CANCEL++; } - _toggle_element(_ElementType::x, qubit); + _toggle_element(ElementType::x, qubit); } void Optimizer::_match_z_rotations(QCirGate* gate) { @@ -88,7 +88,7 @@ void Optimizer::_match_z_rotations(QCirGate* gate) { gate->set_phase(-1 * (gate->get_phase())); } if (gate->get_phase() == dvlab::Phase(1)) { - _toggle_element(_ElementType::z, qubit); + _toggle_element(ElementType::z, qubit); return; } // REVIEW - Neglect adjoint due to S and Sdg is separated @@ -96,20 +96,20 @@ void Optimizer::_match_z_rotations(QCirGate* gate) { _add_hadamard(qubit, true); } QCirGate* available = get_available_z_rotation(qubit); - if (_availty[qubit] == false && available != nullptr) { + if (!_availty[qubit] && available) { std::erase(_available[qubit], available); std::erase(_gates[qubit], available); auto const phase = available->get_phase() + gate->get_phase(); _statistics.FUSE_PHASE++; if (phase == dvlab::Phase(1)) { - _toggle_element(_ElementType::z, qubit); + _toggle_element(ElementType::z, qubit); return; } if (phase != dvlab::Phase(0)) { _add_rotation_gate(qubit, phase, GateRotationCategory::pz); } } else { - if (_availty[qubit] == true) { + if (_availty[qubit]) { _availty[qubit] = false; _available[qubit].clear(); } @@ -129,9 +129,9 @@ void Optimizer::_match_czs(QCirGate* gate, bool do_swap, bool do_minimize_czs) { // NOTE - Push NOT gates trough the CZ // REVIEW - Seems strange if (_xs.contains(control_qubit)) - _toggle_element(_ElementType::z, target_qubit); + _toggle_element(ElementType::z, target_qubit); if (_xs.contains(target_qubit)) - _toggle_element(_ElementType::z, control_qubit); + _toggle_element(ElementType::z, control_qubit); if (_hadamards.contains(control_qubit) && _hadamards.contains(target_qubit)) { _add_hadamard(control_qubit, true); _add_hadamard(target_qubit, true); @@ -153,9 +153,9 @@ void Optimizer::_match_cxs(QCirGate* gate, bool do_swap, bool do_minimize_czs) { auto target_qubit = gate->get_targets()._qubit; if (_xs.contains(control_qubit)) - _toggle_element(_ElementType::x, target_qubit); + _toggle_element(ElementType::x, target_qubit); if (_zs.contains(target_qubit)) - _toggle_element(_ElementType::z, control_qubit); + _toggle_element(ElementType::z, control_qubit); if (_hadamards.contains(control_qubit) && _hadamards.contains(target_qubit)) { _add_cx(target_qubit, control_qubit, do_swap); } else if (!_hadamards.contains(control_qubit) && !_hadamards.contains(target_qubit)) { diff --git a/src/qcir/optimizer/optimizer.cpp b/src/qcir/optimizer/optimizer.cpp index 4cb3c119..0e0a3f2f 100644 --- a/src/qcir/optimizer/optimizer.cpp +++ b/src/qcir/optimizer/optimizer.cpp @@ -52,15 +52,15 @@ QCir Optimizer::parse_backward(QCir const& qcir, bool do_minimize_czs, BasicOpti * @param type 0: _hadamards, 1: _xs, and 2: _zs * @param element */ -void Optimizer::_toggle_element(Optimizer::_ElementType type, QubitIdType element) { +void Optimizer::_toggle_element(Optimizer::ElementType type, QubitIdType element) { switch (type) { - case _ElementType::h: + case ElementType::h: (_hadamards.contains(element)) ? (void)_hadamards.erase(element) : (void)_hadamards.emplace(element); break; - case _ElementType::x: + case ElementType::x: (_xs.contains(element)) ? (void)_xs.erase(element) : (void)_xs.emplace(element); break; - case _ElementType::z: + case ElementType::z: (_zs.contains(element)) ? (void)_zs.erase(element) : (void)_zs.emplace(element); break; } @@ -72,9 +72,9 @@ void Optimizer::_toggle_element(Optimizer::_ElementType type, QubitIdType elemen * @param type 0: _hadamards, 1: _xs, and 2: _zs * @param element */ -void Optimizer::_swap_element(Optimizer::_ElementType type, QubitIdType e1, QubitIdType e2) { +void Optimizer::_swap_element(Optimizer::ElementType type, QubitIdType e1, QubitIdType e2) { switch (type) { - case _ElementType::h: + case ElementType::h: if (_hadamards.contains(e1) && !_hadamards.contains(e2)) { _hadamards.erase(e1); _hadamards.emplace(e2); @@ -83,7 +83,7 @@ void Optimizer::_swap_element(Optimizer::_ElementType type, QubitIdType e1, Qubi _hadamards.emplace(e1); } break; - case _ElementType::x: + case ElementType::x: if (_xs.contains(e1) && !_xs.contains(e2)) { _xs.erase(e1); _xs.emplace(e2); @@ -92,7 +92,7 @@ void Optimizer::_swap_element(Optimizer::_ElementType type, QubitIdType e1, Qubi _xs.emplace(e1); } break; - case _ElementType::z: + case ElementType::z: if (_zs.contains(e1) && !_zs.contains(e2)) { _zs.erase(e1); _zs.emplace(e2); diff --git a/src/qcir/optimizer/optimizer.hpp b/src/qcir/optimizer/optimizer.hpp index b00120de..06ca2106 100644 --- a/src/qcir/optimizer/optimizer.hpp +++ b/src/qcir/optimizer/optimizer.hpp @@ -82,13 +82,13 @@ class Optimizer { } _statistics; // Utils - enum class _ElementType { + enum class ElementType { h, x, z }; - void _toggle_element(_ElementType type, QubitIdType element); - void _swap_element(_ElementType type, QubitIdType e1, QubitIdType e2); + void _toggle_element(ElementType type, QubitIdType element); + void _swap_element(ElementType type, QubitIdType e1, QubitIdType e2); static std::vector _compute_stats(QCir const& circuit); QCir _parse_once(QCir const& qcir, bool reversed, bool do_minimize_czs, BasicOptimizationConfig const& config); diff --git a/src/qcir/qcir_cmd.cpp b/src/qcir/qcir_cmd.cpp index 437dd6a0..457263c6 100644 --- a/src/qcir/qcir_cmd.cpp +++ b/src/qcir/qcir_cmd.cpp @@ -454,7 +454,7 @@ dvlab::Command qcir_gate_add_cmd(QCirMgr& qcir_mgr) { if (is_gate_category(single_qubit_gates_no_phase) || is_gate_category(single_qubit_gates_with_phase)) { - if (bits.size() < 1) { + if (bits.empty()) { spdlog::error("Too few qubits are supplied for gate {}!!", type); return CmdExecResult::error; } else if (bits.size() > 1) { diff --git a/src/qcir/qcir_gate.hpp b/src/qcir/qcir_gate.hpp index a5183db3..93415c78 100644 --- a/src/qcir/qcir_gate.hpp +++ b/src/qcir/qcir_gate.hpp @@ -81,7 +81,7 @@ class QCirGate { void set_target_qubit(QubitIdType qubit); void set_control_qubit(QubitIdType qubit) { _qubits[0]._qubit = qubit; } // DFS - bool is_visited(unsigned global) { return global == _dfs_counter; } + bool is_visited(unsigned global) const { return global == _dfs_counter; } void set_visited(unsigned global) { _dfs_counter = global; } void add_dummy_child(QCirGate* c); diff --git a/src/qsyn/qsyn_helper.cpp b/src/qsyn/qsyn_helper.cpp index 0466f133..02aecbc8 100644 --- a/src/qsyn/qsyn_helper.cpp +++ b/src/qsyn/qsyn_helper.cpp @@ -31,7 +31,7 @@ namespace qsyn { namespace { -static std::filesystem::path const default_qsynrc_path = std::invoke([]() { +std::filesystem::path const default_qsynrc_path = std::invoke([]() { auto const home_dir = dvlab::utils::get_home_directory(); if (!home_dir) { spdlog::critical("Cannot find home directory"); diff --git a/src/qsyn/qsyn_helper.hpp b/src/qsyn/qsyn_helper.hpp index d39e1dac..e45334aa 100644 --- a/src/qsyn/qsyn_helper.hpp +++ b/src/qsyn/qsyn_helper.hpp @@ -22,6 +22,6 @@ bool read_qsynrc_file(dvlab::CommandLineInterface& cli, std::filesystem::path qs bool initialize_qsyn(dvlab::CommandLineInterface& cli, qsyn::device::DeviceMgr& device_mgr, qsyn::qcir::QCirMgr& qcir_mgr, qsyn::tensor::TensorMgr& tensor_mgr, qsyn::zx::ZXGraphMgr& zxgraph_mgr, qsyn::experimental::TableauMgr& tableau_mgr); -dvlab::argparse::ArgumentParser get_qsyn_parser(std::string_view const prog_name); +dvlab::argparse::ArgumentParser get_qsyn_parser(std::string_view prog_name); } // namespace qsyn diff --git a/src/qsyn/qsyn_main.cpp b/src/qsyn/qsyn_main.cpp index 52271faa..1fb44295 100644 --- a/src/qsyn/qsyn_main.cpp +++ b/src/qsyn/qsyn_main.cpp @@ -35,13 +35,14 @@ #endif namespace { - +// NOLINTBEGIN(readability-identifier-naming) dvlab::CommandLineInterface cli{"qsyn> "}; qsyn::device::DeviceMgr device_mgr{"Device"}; qsyn::qcir::QCirMgr qcir_mgr{"QCir"}; qsyn::tensor::TensorMgr tensor_mgr{"Tensor"}; qsyn::zx::ZXGraphMgr zxgraph_mgr{"ZXGraph"}; qsyn::experimental::TableauMgr tableau_mgr{"Tableau"}; +// NOLINTEND(readability-identifier-naming) std::string const version_str = fmt::format( "qsyn {} - Copyright © 2022-{:%Y}, DVLab NTUEE.\n" diff --git a/src/tableau/pauli_rotation.cpp b/src/tableau/pauli_rotation.cpp index 49475041..4cff823e 100644 --- a/src/tableau/pauli_rotation.cpp +++ b/src/tableau/pauli_rotation.cpp @@ -62,13 +62,13 @@ std::string to_string(CliffordOperatorType type) { } uint8_t power_of_i(Pauli a, Pauli b) { - if (a == Pauli::X && b == Pauli::Y) return 1; - if (a == Pauli::Y && b == Pauli::Z) return 1; - if (a == Pauli::Z && b == Pauli::X) return 1; + if (a == Pauli::x && b == Pauli::y) return 1; + if (a == Pauli::y && b == Pauli::z) return 1; + if (a == Pauli::z && b == Pauli::x) return 1; - if (a == Pauli::X && b == Pauli::Z) return 3; - if (a == Pauli::Z && b == Pauli::Y) return 3; - if (a == Pauli::Y && b == Pauli::X) return 3; + if (a == Pauli::x && b == Pauli::z) return 3; + if (a == Pauli::z && b == Pauli::y) return 3; + if (a == Pauli::y && b == Pauli::x) return 3; return 0; } @@ -80,17 +80,17 @@ PauliProduct::PauliProduct(std::initializer_list const& pauli_list, bool for (size_t i = 0; i < pauli_list.size(); ++i) { switch (pauli_list.begin()[i]) { - case Pauli::I: + case Pauli::i: break; - case Pauli::Z: - _bitset.set(z_idx(i)); + case Pauli::z: + _bitset.set(_z_idx(i)); break; - case Pauli::Y: - _bitset.set(z_idx(i)); - _bitset.set(x_idx(i)); + case Pauli::y: + _bitset.set(_z_idx(i)); + _bitset.set(_x_idx(i)); break; - case Pauli::X: - _bitset.set(x_idx(i)); + case Pauli::x: + _bitset.set(_x_idx(i)); break; } } @@ -113,14 +113,14 @@ PauliProduct::PauliProduct(std::string_view pauli_str) { case 'I': break; case 'Z': - _bitset.set(z_idx(i)); + _bitset.set(_z_idx(i)); break; case 'Y': - _bitset.set(z_idx(i)); - _bitset.set(x_idx(i)); + _bitset.set(_z_idx(i)); + _bitset.set(_x_idx(i)); break; case 'X': - _bitset.set(x_idx(i)); + _bitset.set(_x_idx(i)); break; } } @@ -134,7 +134,7 @@ PauliProduct& PauliProduct::operator*=(PauliProduct const& rhs) { power_of_i += qsyn::experimental::power_of_i(get_pauli_type(i), rhs.get_pauli_type(i)); } if ((power_of_i % 4) >> 1 == 1) { - _bitset.flip(r_idx()); + _bitset.flip(_r_idx()); } _bitset ^= rhs._bitset; return *this; @@ -152,16 +152,16 @@ std::string PauliProduct::to_string(char signedness) const { for (size_t i = 0; i < n_qubits(); ++i) { switch (get_pauli_type(i)) { - case Pauli::I: + case Pauli::i: str += 'I'; break; - case Pauli::X: + case Pauli::x: str += 'X'; break; - case Pauli::Y: + case Pauli::y: str += 'Y'; break; - case Pauli::Z: + case Pauli::z: str += 'Z'; break; } @@ -198,18 +198,18 @@ void bitset_swap_two(size_t i, size_t j, sul::dynamic_bitset<>& bitset) { PauliProduct& PauliProduct::h(size_t qubit) { if (qubit >= n_qubits()) return *this; if (is_y(qubit)) { - _bitset.flip(r_idx()); + _bitset.flip(_r_idx()); } - bitset_swap_two(z_idx(qubit), x_idx(qubit), _bitset); + bitset_swap_two(_z_idx(qubit), _x_idx(qubit), _bitset); return *this; } PauliProduct& PauliProduct::s(size_t qubit) { if (qubit >= n_qubits()) return *this; if (is_y(qubit)) { - _bitset.flip(r_idx()); + _bitset.flip(_r_idx()); } - _bitset[z_idx(qubit)] ^= _bitset[x_idx(qubit)]; + _bitset[_z_idx(qubit)] ^= _bitset[_x_idx(qubit)]; return *this; } @@ -217,11 +217,11 @@ PauliProduct& PauliProduct::cx(size_t control, size_t target) { if (control >= n_qubits() || target >= n_qubits()) { return *this; } - if (_bitset[x_idx(control)] && _bitset[z_idx(target)] && (_bitset[x_idx(target)] == _bitset[z_idx(control)])) { - _bitset.flip(r_idx()); + if (_bitset[_x_idx(control)] && _bitset[_z_idx(target)] && (_bitset[_x_idx(target)] == _bitset[_z_idx(control)])) { + _bitset.flip(_r_idx()); } - _bitset[x_idx(target)] ^= _bitset[x_idx(control)]; - _bitset[z_idx(control)] ^= _bitset[z_idx(target)]; + _bitset[_x_idx(target)] ^= _bitset[_x_idx(control)]; + _bitset[_z_idx(control)] ^= _bitset[_z_idx(target)]; return *this; } @@ -236,10 +236,10 @@ bool PauliProduct::is_commutative(PauliProduct const& rhs) const { } PauliRotation::PauliRotation(std::initializer_list const& pauli_list, dvlab::Phase const& phase) - : _pauli_product(pauli_list, false), _phase(phase) { normalize(); } + : _pauli_product(pauli_list, false), _phase(phase) { _normalize(); } PauliRotation::PauliRotation(std::string_view pauli_str, dvlab::Phase const& phase) - : _pauli_product(pauli_str), _phase(phase) { normalize(); } + : _pauli_product(pauli_str), _phase(phase) { _normalize(); } std::string PauliRotation::to_string(char signedness) const { return fmt::format("exp(i * {} * {})", _phase.get_print_string(), _pauli_product.to_string(signedness)); @@ -251,19 +251,19 @@ std::string PauliRotation::to_bit_string() const { PauliRotation& PauliRotation::h(size_t qubit) { _pauli_product.h(qubit); - normalize(); + _normalize(); return *this; } PauliRotation& PauliRotation::s(size_t qubit) { _pauli_product.s(qubit); - normalize(); + _normalize(); return *this; } PauliRotation& PauliRotation::cx(size_t control, size_t target) { _pauli_product.cx(control, target); - normalize(); + _normalize(); return *this; } @@ -271,15 +271,15 @@ std::pair extract_clifford_operators(PauliRotati using COT = CliffordOperatorType; std::vector clifford_ops; for (size_t i = 0; i < pauli_rotation.n_qubits(); ++i) { - if (pauli_rotation.get_pauli_type(i) == Pauli::X) { + if (pauli_rotation.get_pauli_type(i) == Pauli::x) { clifford_ops.emplace_back(COT::h, std::array{i}); - } else if (pauli_rotation.get_pauli_type(i) == Pauli::Y) { + } else if (pauli_rotation.get_pauli_type(i) == Pauli::y) { clifford_ops.emplace_back(COT::v, std::array{i}); } } auto const non_I_qubits = std::ranges::views::iota(0ul, pauli_rotation.n_qubits()) | std::ranges::views::filter([&pauli_rotation](size_t i) { - return pauli_rotation.get_pauli_type(i) != Pauli::I; + return pauli_rotation.get_pauli_type(i) != Pauli::i; }) | tl::to(); diff --git a/src/tableau/pauli_rotation.hpp b/src/tableau/pauli_rotation.hpp index b005aebf..ef1d09dd 100644 --- a/src/tableau/pauli_rotation.hpp +++ b/src/tableau/pauli_rotation.hpp @@ -25,10 +25,10 @@ namespace qsyn { namespace experimental { enum class Pauli { - I, - X, - Y, - Z + i, + x, + y, + z }; uint8_t power_of_i(Pauli a, Pauli b); @@ -166,7 +166,7 @@ class PauliProduct : public PauliProductTrait { for (auto it = first; it != last; ++it) { set_pauli_type(i++, *it); } - _bitset[r_idx()] = is_neg; + _bitset[_r_idx()] = is_neg; } template @@ -176,8 +176,8 @@ class PauliProduct : public PauliProductTrait { inline size_t n_qubits() const { return (_bitset.size() - 1) / 2; } inline Pauli get_pauli_type(size_t i) const { - return is_z_set(i) ? (is_x_set(i) ? Pauli::Y : Pauli::Z) - : (is_x_set(i) ? Pauli::X : Pauli::I); + return is_z_set(i) ? (is_x_set(i) ? Pauli::y : Pauli::z) + : (is_x_set(i) ? Pauli::x : Pauli::i); } inline bool is_i(size_t i) const { return !is_z_set(i) && !is_x_set(i); } @@ -185,7 +185,7 @@ class PauliProduct : public PauliProductTrait { inline bool is_y(size_t i) const { return is_z_set(i) && is_x_set(i); } inline bool is_z(size_t i) const { return is_z_set(i) && !is_x_set(i); } - inline bool is_neg() const { return _bitset[r_idx()]; } + inline bool is_neg() const { return _bitset[_r_idx()]; } PauliProduct& operator*=(PauliProduct const& rhs); @@ -205,7 +205,7 @@ class PauliProduct : public PauliProductTrait { PauliProduct& cx(size_t control, size_t target) override; inline PauliProduct& negate() { - _bitset.flip(r_idx()); + _bitset.flip(_r_idx()); return *this; } @@ -213,27 +213,27 @@ class PauliProduct : public PauliProductTrait { inline void set_pauli_type(size_t i, Pauli type) { switch (type) { - case Pauli::I: - _bitset[z_idx(i)] = false; - _bitset[x_idx(i)] = false; + case Pauli::i: + _bitset[_z_idx(i)] = false; + _bitset[_x_idx(i)] = false; break; - case Pauli::X: - _bitset[z_idx(i)] = false; - _bitset[x_idx(i)] = true; + case Pauli::x: + _bitset[_z_idx(i)] = false; + _bitset[_x_idx(i)] = true; break; - case Pauli::Y: - _bitset[z_idx(i)] = true; - _bitset[x_idx(i)] = true; + case Pauli::y: + _bitset[_z_idx(i)] = true; + _bitset[_x_idx(i)] = true; break; - case Pauli::Z: - _bitset[z_idx(i)] = true; - _bitset[x_idx(i)] = false; + case Pauli::z: + _bitset[_z_idx(i)] = true; + _bitset[_x_idx(i)] = false; break; } } - inline bool is_z_set(size_t i) const { return _bitset[z_idx(i)] == true; } - inline bool is_x_set(size_t i) const { return _bitset[x_idx(i)] == true; } + inline bool is_z_set(size_t i) const { return _bitset[_z_idx(i)]; } + inline bool is_x_set(size_t i) const { return _bitset[_x_idx(i)]; } inline bool is_diagonal() const { return std::ranges::all_of(std::views::iota(0ul, n_qubits()), [this](size_t i) { return is_i(i) || is_z(i); }); @@ -246,9 +246,9 @@ class PauliProduct : public PauliProductTrait { private: sul::dynamic_bitset<> _bitset; - inline size_t z_idx(size_t i) const { return i; } - inline size_t x_idx(size_t i) const { return i + n_qubits(); } - inline size_t r_idx() const { return n_qubits() * 2; } + inline size_t _z_idx(size_t i) const { return i; } + inline size_t _x_idx(size_t i) const { return i + n_qubits(); } + inline size_t _r_idx() const { return n_qubits() * 2; } }; inline bool is_commutative(PauliProduct const& lhs, PauliProduct const& rhs) { @@ -261,12 +261,12 @@ class PauliRotation : public PauliProductTrait { PauliRotation(std::string_view pauli_str, dvlab::Phase const& phase); PauliRotation(PauliProduct const& pauli_product, dvlab::Phase const& phase) : _pauli_product(pauli_product), _phase(phase) { - normalize(); + _normalize(); } template S> PauliRotation(I first, S last, dvlab::Phase const& phase) : _pauli_product(first, last, false), _phase(phase) { - normalize(); + _normalize(); } template @@ -308,7 +308,7 @@ class PauliRotation : public PauliProductTrait { PauliProduct _pauli_product; dvlab::Phase _phase; - inline void normalize() { + inline void _normalize() { if (_pauli_product.is_neg()) { _pauli_product.negate(); _phase *= -1; @@ -335,16 +335,16 @@ struct fmt::formatter { auto format(qsyn::experimental::Pauli c, FormatContext& ctx) { string_view name = "I"; switch (c) { - case qsyn::experimental::Pauli::I: + case qsyn::experimental::Pauli::i: name = "I"; break; - case qsyn::experimental::Pauli::X: + case qsyn::experimental::Pauli::x: name = "X"; break; - case qsyn::experimental::Pauli::Y: + case qsyn::experimental::Pauli::y: name = "Y"; break; - case qsyn::experimental::Pauli::Z: + case qsyn::experimental::Pauli::z: name = "Z"; break; } diff --git a/src/tableau/stabilizer_tableau.hpp b/src/tableau/stabilizer_tableau.hpp index d4f95505..f37d3723 100644 --- a/src/tableau/stabilizer_tableau.hpp +++ b/src/tableau/stabilizer_tableau.hpp @@ -30,8 +30,8 @@ class StabilizerTableau : public PauliProductTrait { public: StabilizerTableau(size_t n_qubits) : _stabilizers(2 * n_qubits, PauliProduct(std::string(n_qubits, 'I'))) { for (size_t i = 0; i < n_qubits; ++i) { - _stabilizers[stabilizer_idx(i)].set_pauli_type(i, Pauli::Z); - _stabilizers[destabilizer_idx(i)].set_pauli_type(i, Pauli::X); + _stabilizers[stabilizer_idx(i)].set_pauli_type(i, Pauli::z); + _stabilizers[destabilizer_idx(i)].set_pauli_type(i, Pauli::x); } } diff --git a/src/util/cin_cout_cerr.hpp b/src/util/cin_cout_cerr.hpp index 7bdfb133..5847fc9e 100644 --- a/src/util/cin_cout_cerr.hpp +++ b/src/util/cin_cout_cerr.hpp @@ -12,8 +12,10 @@ #include namespace std { +// NOLINTBEGIN(readability-identifier-naming) extern istream cin; extern ostream cout; extern ostream cerr; +// NOLINTEND(readability-identifier-naming) } // namespace std #endif diff --git a/src/util/scope_guard.hpp b/src/util/scope_guard.hpp index cb195bc6..870ddc70 100644 --- a/src/util/scope_guard.hpp +++ b/src/util/scope_guard.hpp @@ -11,7 +11,7 @@ namespace dvlab { namespace utils { -class scope_exit { +class scope_exit { // NOLINT(readability-identifier-naming) // emulate library public: template inline scope_exit(Callable&& undo_func) try : _undo_func(std::forward(undo_func)) { diff --git a/src/util/usage.cpp b/src/util/usage.cpp index ad4064cc..30a832bb 100644 --- a/src/util/usage.cpp +++ b/src/util/usage.cpp @@ -17,29 +17,29 @@ using namespace dvlab::utils; // for Memory usage (in MB) -double Usage::_initial_memory = 0.0; -double Usage::_current_memory = 0.0; +double Usage::INITIAL_MEMORY = 0.0; +double Usage::CURRENT_MEMORY = 0.0; // for CPU time usage -double Usage::_current_tick = 0.0; -double Usage::_period_used_time = 0.0; -double Usage::_total_used_time = 0.0; +double Usage::CURRENT_TICK = 0.0; +double Usage::PERIOD_USED_TIME = 0.0; +double Usage::TOTAL_USED_TIME = 0.0; void Usage::reset() { - _initial_memory = Usage::_check_memory(); - _current_tick = Usage::_check_tick(); - _period_used_time = _total_used_time = 0.0; + INITIAL_MEMORY = Usage::_check_memory(); + CURRENT_TICK = Usage::_check_tick(); + PERIOD_USED_TIME = TOTAL_USED_TIME = 0.0; } void Usage::report(bool report_time, bool report_mem) { if (report_time) { _set_time_usage(); - fmt::println("Period time used : {:.4f} seconds", _period_used_time); - fmt::println("Total time used : {:.4f} seconds", _total_used_time); + fmt::println("Period time used : {:.4f} seconds", PERIOD_USED_TIME); + fmt::println("Total time used : {:.4f} seconds", TOTAL_USED_TIME); } if (report_mem) { _set_memory_usage(); - fmt::println("Total memory used: {:.4f} M Bytes", _current_memory); + fmt::println("Total memory used: {:.4f} M Bytes", CURRENT_MEMORY); } } @@ -55,10 +55,10 @@ double Usage::_check_tick() { times(&buffer); return gsl::narrow_cast(buffer.tms_utime); } -void Usage::_set_memory_usage() { _current_memory = _check_memory() - _initial_memory; } +void Usage::_set_memory_usage() { CURRENT_MEMORY = _check_memory() - INITIAL_MEMORY; } void Usage::_set_time_usage() { double const this_tick = _check_tick(); - _period_used_time = (this_tick - _current_tick) / double(sysconf(_SC_CLK_TCK)); - _total_used_time += _period_used_time; - _current_tick = this_tick; + PERIOD_USED_TIME = (this_tick - CURRENT_TICK) / double(sysconf(_SC_CLK_TCK)); + TOTAL_USED_TIME += PERIOD_USED_TIME; + CURRENT_TICK = this_tick; } diff --git a/src/util/usage.hpp b/src/util/usage.hpp index 9378d42f..20923ffe 100644 --- a/src/util/usage.hpp +++ b/src/util/usage.hpp @@ -21,13 +21,13 @@ class Usage { private: // for Memory usage (in MB) - static double _initial_memory; - static double _current_memory; + static double INITIAL_MEMORY; + static double CURRENT_MEMORY; // for CPU time usage - static double _current_tick; - static double _period_used_time; - static double _total_used_time; + static double CURRENT_TICK; + static double PERIOD_USED_TIME; + static double TOTAL_USED_TIME; // private functions static double _check_memory();