10
10
#include " cudaq/cudm_error_handling.h"
11
11
12
12
namespace cudaq {
13
- // Function to flatten a matrix into a 1D array
13
+ // Function to flatten a matrix into a 1D array (column major)
14
14
std::vector<std::complex<double >> flatten_matrix (const matrix_2 &matrix) {
15
15
std::vector<std::complex<double >> flat_matrix;
16
-
17
- for (size_t i = 0 ; i < matrix.get_rows (); i ++) {
18
- for (size_t j = 0 ; j < matrix.get_columns (); j ++) {
19
- flat_matrix.push_back (matrix[{i, j }]);
16
+ flat_matrix. reserve (matrix. get_size ());
17
+ for (size_t col = 0 ; col < matrix.get_columns (); col ++) {
18
+ for (size_t row = 0 ; row < matrix.get_rows (); row ++) {
19
+ flat_matrix.push_back (matrix[{row, col }]);
20
20
}
21
21
}
22
22
@@ -53,19 +53,14 @@ cudensitymatElementaryOperator_t create_elementary_operator(
53
53
54
54
cudensitymatElementaryOperator_t cudm_elem_op = nullptr ;
55
55
56
- std::vector<double > interleaved_matrix;
57
- interleaved_matrix.reserve (flat_matrix.size () * 2 );
58
-
59
- for (const auto &value : flat_matrix) {
60
- interleaved_matrix.push_back (value.real ());
61
- interleaved_matrix.push_back (value.imag ());
62
- }
56
+ // FIXME: leak (need to track this buffer somewhere and delete **after** the
57
+ // whole evolve)
58
+ auto *elementaryMat_d = create_array_gpu (flat_matrix);
63
59
64
60
cudensitymatStatus_t status = cudensitymatCreateElementaryOperator (
65
61
handle, static_cast <int32_t >(subspace_extents.size ()),
66
62
subspace_extents.data (), CUDENSITYMAT_OPERATOR_SPARSITY_NONE, 0 , nullptr ,
67
- CUDA_C_64F, static_cast <void *>(interleaved_matrix.data ()),
68
- {nullptr , nullptr }, &cudm_elem_op);
63
+ CUDA_C_64F, elementaryMat_d, {nullptr , nullptr }, &cudm_elem_op);
69
64
70
65
if (status != CUDENSITYMAT_STATUS_SUCCESS) {
71
66
std::cerr << " Error: Failed to create elementary operator. Status: "
@@ -92,7 +87,7 @@ void append_elementary_operator_to_term(
92
87
std::vector<cudensitymatElementaryOperator_t> elem_ops = {elem_op};
93
88
94
89
std::vector<int32_t > modeActionDuality (degrees.size (), 0 );
95
-
90
+ assert (elem_ops. size () == degrees. size ());
96
91
HANDLE_CUDM_ERROR (cudensitymatOperatorTermAppendElementaryProduct (
97
92
handle, term, static_cast <int32_t >(degrees.size ()), elem_ops.data (),
98
93
degrees.data (), modeActionDuality.data (), make_cuDoubleComplex (1.0 , 0.0 ),
@@ -233,13 +228,15 @@ cudensitymatOperator_t convert_to_cudensitymat_operator(
233
228
handle, operator_handle, term, 0 , make_cuDoubleComplex (1.0 , 0.0 ),
234
229
{nullptr , nullptr }));
235
230
231
+ // FIXME: leak
232
+ // We must track these handles and destroy **after** evolve finishes
236
233
// Destroy the term
237
- HANDLE_CUDM_ERROR (cudensitymatDestroyOperatorTerm (term));
234
+ // HANDLE_CUDM_ERROR(cudensitymatDestroyOperatorTerm(term));
238
235
239
- // Cleanup
240
- for (auto &elem_op : elementary_operators) {
241
- HANDLE_CUDM_ERROR (cudensitymatDestroyElementaryOperator (elem_op));
242
- }
236
+ // // Cleanup
237
+ // for (auto &elem_op : elementary_operators) {
238
+ // HANDLE_CUDM_ERROR(cudensitymatDestroyElementaryOperator(elem_op));
239
+ // }
243
240
}
244
241
245
242
return operator_handle;
0 commit comments