Skip to content

Commit

Permalink
Merge pull request #161 from qulacs/145
Browse files Browse the repository at this point in the history
change method name
  • Loading branch information
gandalfr-KY authored Sep 3, 2024
2 parents cc1a09b + 1128a80 commit a24aac3
Show file tree
Hide file tree
Showing 30 changed files with 360 additions and 365 deletions.
174 changes: 86 additions & 88 deletions python/binding.cpp

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions scaluq/circuit/circuit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ std::uint64_t Circuit::calculate_depth() const {
std::vector<std::uint64_t> filled_step(_n_qubits, 0ULL);
for (const auto& gate : _gate_list) {
std::vector<std::uint64_t> control_qubits =
gate.index() == 0 ? std::get<0>(gate)->get_control_qubit_list()
: std::get<1>(gate).first->get_control_qubit_list();
gate.index() == 0 ? std::get<0>(gate)->control_qubit_list()
: std::get<1>(gate).first->control_qubit_list();
std::vector<std::uint64_t> target_qubits =
gate.index() == 0 ? std::get<0>(gate)->get_target_qubit_list()
: std::get<1>(gate).first->get_target_qubit_list();
gate.index() == 0 ? std::get<0>(gate)->target_qubit_list()
: std::get<1>(gate).first->target_qubit_list();
std::uint64_t max_step_amount_target_qubits = 0;
for (std::uint64_t control : control_qubits) {
if (max_step_amount_target_qubits < filled_step[control]) {
Expand Down Expand Up @@ -123,8 +123,8 @@ Circuit Circuit::get_inverse() const {
}

void Circuit::check_gate_is_valid(const Gate& gate) const {
auto targets = gate->get_target_qubit_list();
auto controls = gate->get_control_qubit_list();
auto targets = gate->target_qubit_list();
auto controls = gate->control_qubit_list();
bool valid = true;
if (!targets.empty()) valid &= *std::max_element(targets.begin(), targets.end()) < _n_qubits;
if (!controls.empty()) valid &= *std::max_element(controls.begin(), controls.end()) < _n_qubits;
Expand All @@ -134,8 +134,8 @@ void Circuit::check_gate_is_valid(const Gate& gate) const {
}

void Circuit::check_gate_is_valid(const ParamGate& param_gate) const {
auto targets = param_gate->get_target_qubit_list();
auto controls = param_gate->get_control_qubit_list();
auto targets = param_gate->target_qubit_list();
auto controls = param_gate->control_qubit_list();
bool valid = true;
if (!targets.empty()) valid &= *std::max_element(targets.begin(), targets.end()) < _n_qubits;
if (!controls.empty()) valid &= *std::max_element(controls.begin(), controls.end()) < _n_qubits;
Expand Down
8 changes: 4 additions & 4 deletions scaluq/circuit/circuit.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,21 @@ class Circuit {

[[nodiscard]] inline std::uint64_t n_qubits() const { return _n_qubits; }
[[nodiscard]] inline const std::vector<GateWithKey>& gate_list() const { return _gate_list; }
[[nodiscard]] inline std::uint64_t gate_count() { return _gate_list.size(); }
[[nodiscard]] inline std::uint64_t n_gates() { return _gate_list.size(); }
[[nodiscard]] inline const std::set<std::string> key_set() const {
std::set<std::string> key_set;
for (auto&& gate : _gate_list) {
if (gate.index() == 1) key_set.insert(std::get<1>(gate).second);
}
return key_set;
}
[[nodiscard]] inline const GateWithKey& get(std::uint64_t idx) const {
[[nodiscard]] inline const GateWithKey& get_gate_at(std::uint64_t idx) const {
if (idx >= _gate_list.size()) {
throw std::runtime_error("Circuit::get(std::uint64_t): index out of bounds");
throw std::runtime_error("Circuit::get_gate_at(std::uint64_t): index out of bounds");
}
return _gate_list[idx];
}
[[nodiscard]] inline std::optional<std::string> get_key(std::uint64_t idx) {
[[nodiscard]] inline std::optional<std::string> get_param_key_at(std::uint64_t idx) {
if (idx >= _gate_list.size()) {
throw std::runtime_error(
"Circuit::get_parameter_key(std::uint64_t): index out of bounds");
Expand Down
12 changes: 6 additions & 6 deletions scaluq/gate/gate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,18 +148,18 @@ class GateBase : public std::enable_shared_from_this<GateBase> {
}
virtual ~GateBase() = default;

[[nodiscard]] virtual std::vector<std::uint64_t> get_target_qubit_list() const {
[[nodiscard]] virtual std::vector<std::uint64_t> target_qubit_list() const {
return mask_to_vector(_target_mask);
}
[[nodiscard]] virtual std::vector<std::uint64_t> get_control_qubit_list() const {
[[nodiscard]] virtual std::vector<std::uint64_t> control_qubit_list() const {
return mask_to_vector(_control_mask);
}
[[nodiscard]] virtual std::vector<std::uint64_t> get_operand_qubit_list() const {
[[nodiscard]] virtual std::vector<std::uint64_t> operand_qubit_list() const {
return mask_to_vector(_target_mask | _control_mask);
}
[[nodiscard]] virtual std::uint64_t get_target_qubit_mask() const { return _target_mask; }
[[nodiscard]] virtual std::uint64_t get_control_qubit_mask() const { return _control_mask; }
[[nodiscard]] virtual std::uint64_t get_operand_qubit_mask() const {
[[nodiscard]] virtual std::uint64_t target_qubit_mask() const { return _target_mask; }
[[nodiscard]] virtual std::uint64_t control_qubit_mask() const { return _control_mask; }
[[nodiscard]] virtual std::uint64_t operand_qubit_mask() const {
return _target_mask | _control_mask;
}

Expand Down
2 changes: 1 addition & 1 deletion scaluq/gate/gate_factory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ inline Gate TwoTargetMatrix(std::uint64_t target1,
}
// まだ
inline Gate Pauli(const PauliOperator& pauli, const std::vector<std::uint64_t>& controls = {}) {
auto tar = pauli.get_target_qubit_list();
auto tar = pauli.target_qubit_list();
return internal::GateFactory::create_gate<internal::PauliGateImpl>(
internal::vector_to_mask(controls), pauli);
}
Expand Down
11 changes: 5 additions & 6 deletions scaluq/gate/gate_pauli.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@ class PauliGateImpl : public GateBase {

public:
PauliGateImpl(std::uint64_t control_mask, const PauliOperator& pauli)
: GateBase(vector_to_mask<false>(pauli.get_target_qubit_list()), control_mask),
_pauli(pauli) {}
: GateBase(vector_to_mask<false>(pauli.target_qubit_list()), control_mask), _pauli(pauli) {}

PauliOperator pauli() const { return _pauli; };
std::vector<std::uint64_t> get_pauli_id_list() const { return _pauli.get_pauli_id_list(); }
std::vector<std::uint64_t> pauli_id_list() const { return _pauli.pauli_id_list(); }

Gate get_inverse() const override { return shared_from_this(); }
ComplexMatrix get_matrix() const override { return this->_pauli.get_matrix(); }
Expand All @@ -33,12 +32,12 @@ class PauliRotationGateImpl : public GateBase {

public:
PauliRotationGateImpl(std::uint64_t control_mask, const PauliOperator& pauli, double angle)
: GateBase(vector_to_mask<false>(pauli.get_target_qubit_list()), control_mask),
: GateBase(vector_to_mask<false>(pauli.target_qubit_list()), control_mask),
_pauli(pauli),
_angle(angle) {}

PauliOperator pauli() const { return _pauli; }
std::vector<std::uint64_t> get_pauli_id_list() const { return _pauli.get_pauli_id_list(); }
std::vector<std::uint64_t> pauli_id_list() const { return _pauli.pauli_id_list(); }
double angle() const { return _angle; }

Gate get_inverse() const override {
Expand All @@ -47,7 +46,7 @@ class PauliRotationGateImpl : public GateBase {

ComplexMatrix get_matrix() const override {
ComplexMatrix mat = this->_pauli.get_matrix_ignoring_coef();
Complex true_angle = _angle * _pauli.get_coef();
Complex true_angle = _angle * _pauli.coef();
StdComplex imag_unit(0, 1);
mat = (StdComplex)Kokkos::cos(-true_angle / 2) *
ComplexMatrix::Identity(mat.rows(), mat.cols()) +
Expand Down
24 changes: 12 additions & 12 deletions scaluq/gate/gate_probablistic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,34 +31,34 @@ class ProbablisticGateImpl : public GateBase {
const std::vector<Gate>& gate_list() const { return _gate_list; }
const std::vector<double>& distribution() const { return _distribution; }

std::vector<std::uint64_t> get_target_qubit_list() const override {
std::vector<std::uint64_t> target_qubit_list() const override {
throw std::runtime_error(
"ProbablisticGateImpl::get_target_qubit_list(): This function must not be used in "
"ProbablisticGateImpl::target_qubit_list(): This function must not be used in "
"ProbablisticGateImpl.");
}
std::vector<std::uint64_t> get_control_qubit_list() const override {
std::vector<std::uint64_t> control_qubit_list() const override {
throw std::runtime_error(
"ProbablisticGateImpl::get_control_qubit_list(): This function must not be used in "
"ProbablisticGateImpl::control_qubit_list(): This function must not be used in "
"ProbablisticGateImpl.");
}
std::vector<std::uint64_t> get_operand_qubit_list() const override {
std::vector<std::uint64_t> operand_qubit_list() const override {
throw std::runtime_error(
"ProbablisticGateImpl::get_operand_qubit_list(): This function must not be used in "
"ProbablisticGateImpl::operand_qubit_list(): This function must not be used in "
"ProbablisticGateImpl.");
}
std::uint64_t get_target_qubit_mask() const override {
std::uint64_t target_qubit_mask() const override {
throw std::runtime_error(
"ProbablisticGateImpl::get_target_qubit_mask(): This function must not be used in "
"ProbablisticGateImpl::target_qubit_mask(): This function must not be used in "
"ProbablisticGateImpl.");
}
std::uint64_t get_control_qubit_mask() const override {
std::uint64_t control_qubit_mask() const override {
throw std::runtime_error(
"ProbablisticGateImpl::get_control_qubit_mask(): This function must not be used in "
"ProbablisticGateImpl::control_qubit_mask(): This function must not be used in "
"ProbablisticGateImpl.");
}
std::uint64_t get_operand_qubit_mask() const override {
std::uint64_t operand_qubit_mask() const override {
throw std::runtime_error(
"ProbablisticGateImpl::get_operand_qubit_mask(): This function must not be used in "
"ProbablisticGateImpl::operand_qubit_mask(): This function must not be used in "
"ProbablisticGateImpl.");
}

Expand Down
32 changes: 16 additions & 16 deletions scaluq/gate/merge_gate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ std::pair<Gate, double> merge_gate(const Gate& gate1, const Gate& gate2) {
assert(!pauli_id1 || pauli_id1 != 0);
assert(!pauli_id2 || pauli_id2 != 0);
if (pauli_id1 && pauli_id2) {
std::uint64_t target1 = gate1->get_target_qubit_list()[0];
std::uint64_t target2 = gate2->get_target_qubit_list()[0];
std::uint64_t target1 = gate1->target_qubit_list()[0];
std::uint64_t target2 = gate2->target_qubit_list()[0];
if (target1 == target2) {
if (pauli_id1 == pauli_id2) return {gate::I(), 0.};
if (pauli_id1 == 1) {
Expand All @@ -54,11 +54,11 @@ std::pair<Gate, double> merge_gate(const Gate& gate1, const Gate& gate2) {
(pauli_id2 || gate2.gate_type() == GateType::Pauli)) {
auto pauli1 = gate_type1 == GateType::Pauli
? PauliGate(gate1)->pauli()
: PauliOperator(std::vector{gate1->get_target_qubit_list()[0]},
: PauliOperator(std::vector{gate1->target_qubit_list()[0]},
std::vector{pauli_id1.value()});
auto pauli2 = gate_type2 == GateType::Pauli
? PauliGate(gate2)->pauli()
: PauliOperator(std::vector{gate2->get_target_qubit_list()[0]},
: PauliOperator(std::vector{gate2->target_qubit_list()[0]},
std::vector{pauli_id2.value()});
return {gate::Pauli(pauli2 * pauli1), 0.};
}
Expand Down Expand Up @@ -87,17 +87,17 @@ std::pair<Gate, double> merge_gate(const Gate& gate1, const Gate& gate2) {
auto oct_phase1 = get_oct_phase(gate_type1);
auto oct_phase2 = get_oct_phase(gate_type2);
if (oct_phase1 && oct_phase2) {
std::uint64_t target1 = gate1->get_target_qubit_list()[0];
std::uint64_t target2 = gate2->get_target_qubit_list()[0];
std::uint64_t target1 = gate1->target_qubit_list()[0];
std::uint64_t target2 = gate2->target_qubit_list()[0];
if (target1 == target2) {
auto g = oct_phase_gate(oct_phase1.value() + oct_phase2.value(), target1);
if (g) return {g.value(), 0.};
}
}
if ((oct_phase1 || gate_type1 == GateType::RZ || gate_type1 == GateType::U1) &&
(oct_phase2 || gate_type2 == GateType::RZ || gate_type2 == GateType::U1)) {
std::uint64_t target1 = gate1->get_target_qubit_list()[0];
std::uint64_t target2 = gate2->get_target_qubit_list()[0];
std::uint64_t target1 = gate1->target_qubit_list()[0];
std::uint64_t target2 = gate2->target_qubit_list()[0];
if (target1 == target2) {
double phase1 = oct_phase1 ? oct_phase1.value() * PI() / 4
: gate_type1 == GateType::RZ ? RZGate(gate1)->angle()
Expand All @@ -123,8 +123,8 @@ std::pair<Gate, double> merge_gate(const Gate& gate1, const Gate& gate2) {
auto rx_param1 = get_rx_angle(gate1, gate_type1);
auto rx_param2 = get_rx_angle(gate2, gate_type2);
if (rx_param1 && rx_param2) {
std::uint64_t target1 = gate1->get_target_qubit_list()[0];
std::uint64_t target2 = gate2->get_target_qubit_list()[0];
std::uint64_t target1 = gate1->target_qubit_list()[0];
std::uint64_t target2 = gate2->target_qubit_list()[0];
double global_phase1 = gate_type1 == GateType::RX ? 0. : rx_param1.value() / 2;
double global_phase2 = gate_type2 == GateType::RX ? 0. : rx_param2.value() / 2;
if (target1 == target2) {
Expand All @@ -145,8 +145,8 @@ std::pair<Gate, double> merge_gate(const Gate& gate1, const Gate& gate2) {
auto ry_param1 = get_ry_angle(gate1, gate_type1);
auto ry_param2 = get_ry_angle(gate2, gate_type2);
if (ry_param1 && ry_param2) {
std::uint64_t target1 = gate1->get_target_qubit_list()[0];
std::uint64_t target2 = gate2->get_target_qubit_list()[0];
std::uint64_t target1 = gate1->target_qubit_list()[0];
std::uint64_t target2 = gate2->target_qubit_list()[0];
double global_phase1 = gate_type1 == GateType::RY ? 0. : ry_param1.value() / 2;
double global_phase2 = gate_type2 == GateType::RY ? 0. : ry_param2.value() / 2;
if (target1 == target2) {
Expand Down Expand Up @@ -188,10 +188,10 @@ std::pair<Gate, double> merge_gate(const Gate& gate1, const Gate& gate2) {
}

// General case
auto gate1_targets = gate1->get_target_qubit_list();
std::ranges::copy(gate1->get_control_qubit_list(), std::back_inserter(gate1_targets));
auto gate2_targets = gate2->get_target_qubit_list();
std::ranges::copy(gate2->get_control_qubit_list(), std::back_inserter(gate2_targets));
auto gate1_targets = gate1->target_qubit_list();
std::ranges::copy(gate1->control_qubit_list(), std::back_inserter(gate1_targets));
auto gate2_targets = gate2->target_qubit_list();
std::ranges::copy(gate2->control_qubit_list(), std::back_inserter(gate2_targets));
std::vector<std::uint64_t> merged_targets(gate1_targets.size() + gate2_targets.size());
std::ranges::copy(gate1_targets, merged_targets.begin());
std::ranges::copy(gate2_targets, merged_targets.begin() + gate1_targets.size());
Expand Down
38 changes: 19 additions & 19 deletions scaluq/gate/param_gate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,26 @@ class ParamGateBase;
template <typename T>
concept ParamGateImpl = std::derived_from<T, ParamGateBase>;

class PRXGateImpl;
class PRYGateImpl;
class PRZGateImpl;
class PPauliRotationGateImpl;
class ParamRXGateImpl;
class ParamRYGateImpl;
class ParamRZGateImpl;
class ParamPauliRotationGateImpl;

template <ParamGateImpl T>
class ParamGatePtr;
} // namespace internal
using ParamGate = internal::ParamGatePtr<internal::ParamGateBase>;

enum class ParamGateType { Unknown, PRX, PRY, PRZ, PPauliRotation };
enum class ParamGateType { Unknown, ParamRX, ParamRY, ParamRZ, ParamPauliRotation };

template <internal::ParamGateImpl T>
constexpr ParamGateType get_param_gate_type() {
if constexpr (std::is_same_v<T, internal::ParamGateBase>) return ParamGateType::Unknown;
if constexpr (std::is_same_v<T, internal::PRXGateImpl>) return ParamGateType::PRX;
if constexpr (std::is_same_v<T, internal::PRYGateImpl>) return ParamGateType::PRY;
if constexpr (std::is_same_v<T, internal::PRZGateImpl>) return ParamGateType::PRZ;
if constexpr (std::is_same_v<T, internal::PPauliRotationGateImpl>)
return ParamGateType::PPauliRotation;
if constexpr (std::is_same_v<T, internal::ParamRXGateImpl>) return ParamGateType::ParamRX;
if constexpr (std::is_same_v<T, internal::ParamRYGateImpl>) return ParamGateType::ParamRY;
if constexpr (std::is_same_v<T, internal::ParamRZGateImpl>) return ParamGateType::ParamRZ;
if constexpr (std::is_same_v<T, internal::ParamPauliRotationGateImpl>)
return ParamGateType::ParamPauliRotation;
static_assert("unknown ParamGateImpl");
return ParamGateType::Unknown;
}
Expand All @@ -51,8 +51,8 @@ class ParamGateBase {
}

public:
ParamGateBase(std::uint64_t target_mask, std::uint64_t control_mask, double pcoef = 1.)
: _target_mask(target_mask), _control_mask(control_mask), _pcoef(pcoef) {
ParamGateBase(std::uint64_t target_mask, std::uint64_t control_mask, double param_coef = 1.)
: _target_mask(target_mask), _control_mask(control_mask), _pcoef(param_coef) {
if (_target_mask & _control_mask) [[unlikely]] {
throw std::runtime_error(
"Error: ParamGate::ParamGate(std::uint64_t target_mask, std::uint64_t "
Expand All @@ -62,20 +62,20 @@ class ParamGateBase {
}
virtual ~ParamGateBase() = default;

[[nodiscard]] double pcoef() { return _pcoef; }
[[nodiscard]] double param_coef() { return _pcoef; }

[[nodiscard]] virtual std::vector<std::uint64_t> get_target_qubit_list() const {
[[nodiscard]] virtual std::vector<std::uint64_t> target_qubit_list() const {
return mask_to_vector(_target_mask);
}
[[nodiscard]] virtual std::vector<std::uint64_t> get_control_qubit_list() const {
[[nodiscard]] virtual std::vector<std::uint64_t> control_qubit_list() const {
return mask_to_vector(_control_mask);
}
[[nodiscard]] virtual std::vector<std::uint64_t> get_operand_qubit_list() const {
[[nodiscard]] virtual std::vector<std::uint64_t> operand_qubit_list() const {
return mask_to_vector(_target_mask | _control_mask);
}
[[nodiscard]] virtual std::uint64_t get_target_qubit_mask() const { return _target_mask; }
[[nodiscard]] virtual std::uint64_t get_control_qubit_mask() const { return _control_mask; }
[[nodiscard]] virtual std::uint64_t get_operand_qubit_mask() const {
[[nodiscard]] virtual std::uint64_t target_qubit_mask() const { return _target_mask; }
[[nodiscard]] virtual std::uint64_t control_qubit_mask() const { return _control_mask; }
[[nodiscard]] virtual std::uint64_t operand_qubit_mask() const {
return _target_mask | _control_mask;
}

Expand Down
Loading

0 comments on commit a24aac3

Please sign in to comment.