Skip to content

Commit

Permalink
merge safely & deal with cuda (except Eigen usage)
Browse files Browse the repository at this point in the history
  • Loading branch information
KowerKoint authored and KowerKoint committed Jan 10, 2025
1 parent 554bf1e commit 7da4463
Show file tree
Hide file tree
Showing 23 changed files with 376 additions and 196 deletions.
13 changes: 9 additions & 4 deletions .devcontainer/cpu/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ RUN apt-get update && \
apt-get update && \
apt-get install -y gcc-13 g++-13 && \
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 \
&& apt-get install -y --no-install-recommends \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 && \
apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
clang-format \
Expand All @@ -27,8 +27,13 @@ RUN apt-get update && \
ninja-build \
python3 \
python3-pip \
wget \
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*
wget && \
apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* && \
update-alternatives --set gcc /usr/bin/gcc-13 && \
update-alternatives --set g++ /usr/bin/g++-13

ENV CC=gcc
ENV CXX=g++

RUN wget https://github.com/Kitware/CMake/releases/download/v3.28.0/cmake-3.28.0-Linux-x86_64.sh -q -O /tmp/cmake-install.sh && \
chmod u+x /tmp/cmake-install.sh && \
Expand Down
13 changes: 9 additions & 4 deletions .devcontainer/gpu/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ RUN apt-get update && \
apt-get update && \
apt-get install -y gcc-13 g++-13 && \
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 \
&& apt-get install -y --no-install-recommends \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100 && \
apt-get install -y --no-install-recommends \
ca-certificates \
clang-format \
curl \
Expand All @@ -26,8 +26,13 @@ RUN apt-get update && \
ninja-build \
python3 \
python3-pip \
wget \
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*
wget && \
apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* && \
update-alternatives --set gcc /usr/bin/gcc-13 && \
update-alternatives --set g++ /usr/bin/g++-13

ENV CC=gcc
ENV CXX=g++

RUN wget https://github.com/Kitware/CMake/releases/download/v3.28.0/cmake-3.28.0-Linux-x86_64.sh -q -O /tmp/cmake-install.sh && \
chmod u+x /tmp/cmake-install.sh && \
Expand Down
8 changes: 0 additions & 8 deletions include/scaluq/circuit/circuit.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,10 @@ class Circuit {
check_gate_is_valid(gate);
_gate_list.push_back(gate);
}
void add_gate(Gate<Fp>&& gate) {
check_gate_is_valid(gate);
_gate_list.push_back(std::move(gate));
}
void add_param_gate(const ParamGate<Fp>& param_gate, std::string_view parameter_key) {
check_gate_is_valid(param_gate);
_gate_list.push_back(std::make_pair(param_gate, std::string(parameter_key)));
}
void add_param_gate(ParamGate<Fp>&& param_gate, std::string_view parameter_key) {
check_gate_is_valid(param_gate);
_gate_list.push_back(std::make_pair(std::move(param_gate), std::string(parameter_key)));
}

void add_circuit(const Circuit<Fp>& circuit);
void add_circuit(Circuit<Fp>&& circuit);
Expand Down
14 changes: 12 additions & 2 deletions include/scaluq/gate/gate_pauli.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,18 @@ namespace internal {
vector_to_mask(controls), pauli, angle); \
}

DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_PAULIGATE_WITH_TYPE

} // namespace internal
Expand Down
16 changes: 13 additions & 3 deletions include/scaluq/gate/gate_probablistic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,23 @@ namespace internal {
#define DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(Type) \
template <> \
inline std::shared_ptr<const ProbablisticGateImpl<Type>> get_from_json(const Json& j) { \
auto distribution = j.at("distribution").get<std::vector<Type>>(); \
auto distribution = j.at("distribution").get<std::vector<double>>(); \
auto gate_list = j.at("gate_list").get<std::vector<Gate<Type>>>(); \
return std::make_shared<const ProbablisticGateImpl<Type>>(distribution, gate_list); \
}

DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_PROBGATE_WITH_TYPE

} // namespace internal
Expand Down
122 changes: 91 additions & 31 deletions include/scaluq/gate/gate_standard.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -639,8 +639,18 @@ namespace internal {
inline std::shared_ptr<const IGateImpl<Type>> get_from_json(const Json&) { \
return std::make_shared<const IGateImpl<Type>>(); \
}
DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE

#define DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(Type) \
Expand All @@ -650,37 +660,57 @@ DECLARE_GET_FROM_JSON_IGATE_WITH_TYPE(float)
Type phase = j.at("phase").get<Type>(); \
return std::make_shared<const GlobalPhaseGateImpl<Type>>(vector_to_mask(controls), phase); \
}
DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_GLOBALPHASEGATE_WITH_TYPE

#define DECLARE_GET_FROM_JSON_WITH_TYPE(Impl, Type) \
#define DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(Impl, Type) \
template <> \
inline std::shared_ptr<const Impl<Type>> get_from_json(const Json& j) { \
auto targets = j.at("target").get<std::vector<std::uint64_t>>(); \
auto controls = j.at("control").get<std::vector<std::uint64_t>>(); \
return std::make_shared<const Impl<Type>>(vector_to_mask(targets), \
vector_to_mask(controls)); \
}
#define DECLARE_GET_FROM_JSON(Impl) \
DECLARE_GET_FROM_JSON_WITH_TYPE(Impl, double) \
DECLARE_GET_FROM_JSON_WITH_TYPE(Impl, float)
DECLARE_GET_FROM_JSON(XGateImpl)
DECLARE_GET_FROM_JSON(YGateImpl)
DECLARE_GET_FROM_JSON(ZGateImpl)
DECLARE_GET_FROM_JSON(HGateImpl)
DECLARE_GET_FROM_JSON(SGateImpl)
DECLARE_GET_FROM_JSON(SdagGateImpl)
DECLARE_GET_FROM_JSON(TGateImpl)
DECLARE_GET_FROM_JSON(TdagGateImpl)
DECLARE_GET_FROM_JSON(SqrtXGateImpl)
DECLARE_GET_FROM_JSON(SqrtXdagGateImpl)
DECLARE_GET_FROM_JSON(SqrtYGateImpl)
DECLARE_GET_FROM_JSON(SqrtYdagGateImpl)
DECLARE_GET_FROM_JSON(P0GateImpl)
DECLARE_GET_FROM_JSON(P1GateImpl)
#undef DECLARE_GET_FROM_JSON
#undef DECLARE_GET_FROM_JSON_WITH_TYPE
#define DECALRE_GET_FROM_JSON_EACH_SINGLETARGETGATE_WITH_TYPE(Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(XGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(YGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(ZGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(HGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(SGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(SdagGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(TGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(TdagGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(SqrtXGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(SqrtXdagGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(SqrtYGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(SqrtYdagGateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(P0GateImpl, Type) \
DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE(P1GateImpl, Type)
#ifdef SCALUQ_FLOAT16
DECALRE_GET_FROM_JSON_EACH_SINGLETARGETGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECALRE_GET_FROM_JSON_EACH_SINGLETARGETGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECALRE_GET_FROM_JSON_EACH_SINGLETARGETGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECALRE_GET_FROM_JSON_EACH_SINGLETARGETGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_SINGLETARGETGATE_WITH_TYPE
#undef DECLARE_GET_FROM_JSON_EACH_SINGLETARGETGATE_WITH_TYPE

#define DECLARE_GET_FROM_JSON_RGATE_WITH_TYPE(Impl, Type) \
template <> \
Expand All @@ -695,9 +725,19 @@ DECLARE_GET_FROM_JSON(P1GateImpl)
DECLARE_GET_FROM_JSON_RGATE_WITH_TYPE(RXGateImpl, Type) \
DECLARE_GET_FROM_JSON_RGATE_WITH_TYPE(RYGateImpl, Type) \
DECLARE_GET_FROM_JSON_RGATE_WITH_TYPE(RZGateImpl, Type)
DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(float)
#undef DECLARE_GET_FROM_JSON_RGATE_WITH_TYPE
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_RGATE
#undef DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE

#define DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(Type) \
Expand Down Expand Up @@ -728,8 +768,18 @@ DECLARE_GET_FROM_JSON_EACH_RGATE_WITH_TYPE(float)
return std::make_shared<const U3GateImpl<Type>>( \
vector_to_mask(targets), vector_to_mask(controls), theta, phi, lambda); \
}
DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE

#define DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(Type) \
Expand All @@ -740,8 +790,18 @@ DECLARE_GET_FROM_JSON_UGATE_WITH_TYPE(float)
return std::make_shared<const SwapGateImpl<Type>>(vector_to_mask(targets), \
vector_to_mask(controls)); \
}
DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_SWAPGATE_WITH_TYPE

} // namespace internal
Expand Down
7 changes: 4 additions & 3 deletions include/scaluq/gate/merge_gate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
#include "gate.hpp"

namespace scaluq {
template <std::floating_point Fp>
std::pair<Gate<Fp>, Fp> merge_gate(const Gate<Fp>& gate1, const Gate<Fp>& gate2);
template <FloatingPoint Fp>
inline std::pair<Gate<Fp>, Fp> merge_gate(const Gate<Fp>& gate1, const Gate<Fp>& gate2);

#ifdef SCALUQ_USE_NANOBIND
namespace internal {
template <FloatingPoint Fp>
void bind_gate_merge_gate_hpp(nb::module_& m) {
m.def("merge_gate",
&merge_gate<double>,
&merge_gate<Fp>,
"Merge two gates. return value is (merged gate, global phase).");
}
} // namespace internal
Expand Down
14 changes: 12 additions & 2 deletions include/scaluq/gate/param_gate_pauli.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,18 @@ namespace internal {
vector_to_mask(controls), pauli, param_coef); \
}

DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_PARAM_PAULIGATE_WITH_TYPE

} // namespace internal
Expand Down
22 changes: 15 additions & 7 deletions include/scaluq/gate/param_gate_probablistic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,10 @@ template <FloatingPoint Fp>
using ParamProbablisticGate = internal::ParamGatePtr<internal::ParamProbablisticGateImpl<Fp>>;

namespace internal {

#define DECLARE_GET_FROM_JSON_PARAM_PROBGATE_WITH_TYPE(Type) \
#define DECLARE_GET_FROM_JSON_PARAMPROBABLISTICGATE_WITH_TYPE(Type) \
template <> \
inline std::shared_ptr<const ParamProbablisticGateImpl<Type>> get_from_json(const Json& j) { \
auto distribution = j.at("distribution").get<std::vector<Type>>(); \
auto distribution = j.at("distribution").get<std::vector<double>>(); \
std::vector<std::variant<Gate<Type>, ParamGate<Type>>> gate_list; \
const Json& tmp_list = j.at("gate_list"); \
for (const Json& tmp_j : tmp_list) { \
Expand All @@ -97,10 +96,19 @@ namespace internal {
} \
return std::make_shared<const ParamProbablisticGateImpl<Type>>(distribution, gate_list); \
}
DECLARE_GET_FROM_JSON_PARAM_PROBGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_PARAM_PROBGATE_WITH_TYPE(float)
#undef DECLARE_GET_FROM_JSON_PARAM_PROBGATE_WITH_TYPE

#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_PARAMPROBABLISTICGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_PARAMPROBABLISTICGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_PARAMPROBABLISTICGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_PARAMPROBABLISTICGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_PARAM_PROBABLISTICGATE_WITH_TYPE
} // namespace internal

#ifdef SCALUQ_USE_NANOBIND
Expand Down
14 changes: 12 additions & 2 deletions include/scaluq/gate/param_gate_standard.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,18 @@ namespace internal {
DECLARE_GET_FROM_JSON_PARAM_RGATE_WITH_TYPE(ParamRYGateImpl, Type) \
DECLARE_GET_FROM_JSON_PARAM_RGATE_WITH_TYPE(ParamRZGateImpl, Type)

DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE(double)
DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE(float)
#ifdef SCALUQ_FLOAT16
DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE(F16)
#endif
#ifdef SCALUQ_FLOAT32
DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE(F32)
#endif
#ifdef SCALUQ_FLOAT64
DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE(F64)
#endif
#ifdef SCALUQ_BFLOAT16
DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE(BF16)
#endif
#undef DECLARE_GET_FROM_JSON_PARAM_RGATE_WITH_TYPE
#undef DECLARE_GET_FROM_JSON_EACH_PARAM_RGATE_WITH_TYPE

Expand Down
2 changes: 1 addition & 1 deletion include/scaluq/operator/operator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class Operator {
Operator<Fp> res(n);
for (const auto& term : j.at("terms")) {
std::string pauli_string = term.at("pauli_string").get<std::string>();
Kokkos::complex<Fp> coef = term.at("coef").get<Kokkos::complex<Fp>>();
Complex<Fp> coef = term.at("coef").get<Complex<Fp>>();
res.add_operator({pauli_string, coef});
}
op = res;
Expand Down
Loading

0 comments on commit 7da4463

Please sign in to comment.