@@ -89,6 +89,29 @@ void CuDensityMatState::dump(std::ostream &os) const {
8989 os << state << std::endl;
9090}
9191
92+ std::unique_ptr<SimulationState>
93+ CuDensityMatState::createFromData (const state_data &data) {
94+ if (std::holds_alternative<cudaq::complex_matrix>(data)) {
95+ auto &cMat = std::get<cudaq::complex_matrix>(data);
96+ if (cMat.rows () != cMat.cols ())
97+ throw std::runtime_error (
98+ " [CuDensityMatState] Density matrix input must be square." );
99+ const std::size_t size = cMat.rows () * cMat.cols ();
100+ void *dataPtr = const_cast <cudaq::complex_matrix &>(cMat).get_data (
101+ cudaq::complex_matrix::order::row_major);
102+ std::complex <double > *devicePtr = static_cast <std::complex <double > *>(
103+ cudaq::dynamics::DeviceAllocator::allocate (
104+ size * sizeof (std::complex <double >)));
105+ HANDLE_CUDA_ERROR (cudaMemcpy (devicePtr, dataPtr,
106+ size * sizeof (std::complex <double >),
107+ cudaMemcpyDefault));
108+ auto result = std::make_unique<CuDensityMatState>(size, devicePtr);
109+ result->isDensityMatrix = true ;
110+ return result;
111+ }
112+ return SimulationState::createFromData (data);
113+ }
114+
92115std::unique_ptr<SimulationState>
93116CuDensityMatState::createFromSizeAndPtr (std::size_t size, void *dataPtr,
94117 std::size_t type) {
0 commit comments