Skip to content

Commit c134c57

Browse files
committed
Updating compute_lindblad_op with the updated append_elementary_operator_to_term signature
Signed-off-by: Sachin Pisal <spisal@nvidia.com>
1 parent 1e1b44e commit c134c57

File tree

2 files changed

+14
-30
lines changed

2 files changed

+14
-30
lines changed

runtime/cudaq/cudm_helpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class cudm_helper {
8080
void append_elementary_operator_to_term(
8181
cudensitymatOperatorTerm_t term,
8282
const std::vector<cudensitymatElementaryOperator_t> &elem_ops,
83-
const std::vector<std::vector<int>> &degrees);
83+
const std::vector<std::vector<int>> &degrees, bool is_dagger);
8484

8585
// GPU memory management
8686
static void *

runtime/cudaq/dynamics/cudm_helpers.cpp

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ cudensitymatElementaryOperator_t cudm_helper::create_elementary_operator(
221221
void cudm_helper::append_elementary_operator_to_term(
222222
cudensitymatOperatorTerm_t term,
223223
const std::vector<cudensitymatElementaryOperator_t> &elem_ops,
224-
const std::vector<std::vector<int>> &degrees) {
224+
const std::vector<std::vector<int>> &degrees, bool is_dager) {
225225

226226
if (degrees.empty()) {
227227
throw std::invalid_argument("Degrees vector cannot be empty.");
@@ -248,21 +248,15 @@ void cudm_helper::append_elementary_operator_to_term(
248248
throw std::out_of_range("Degree cannot be negative!");
249249
}
250250
allDegrees.emplace_back(degree);
251-
allModeActionDuality.emplace_back(0); // left side
251+
allModeActionDuality.emplace_back(is_dager ? 1 : 0);
252252
}
253253
}
254254

255-
// std::cout << "append_elementary_operator_to_term: " << elem_op << " -> " <<
256-
// term << ": degree = "; for (int degree : degrees) {
257-
// std::cout << degree << " ";
258-
// }
259-
// std::cout << "\n";
260-
261255
assert(elem_ops.size() == degrees.size());
262256
HANDLE_CUDM_ERROR(cudensitymatOperatorTermAppendElementaryProduct(
263257
handle, term, static_cast<int32_t>(allDegrees.size()), elem_ops.data(),
264-
allDegrees.data(), allModeActionDuality.data(), make_cuDoubleComplex(1.0, 0.0),
265-
{nullptr, nullptr}));
258+
allDegrees.data(), allModeActionDuality.data(),
259+
make_cuDoubleComplex(1.0, 0.0), {nullptr, nullptr}));
266260
}
267261

268262
// Function to create and append a scalar to a term
@@ -310,6 +304,7 @@ cudensitymatOperator_t cudm_helper::compute_lindblad_operator(
310304

311305
std::vector<cudensitymatOperatorTerm_t> terms;
312306
std::vector<cudensitymatElementaryOperator_t> elem_ops;
307+
std::vector<std::vector<int>> all_degrees;
313308

314309
try {
315310
for (const auto &c_op : c_ops) {
@@ -352,18 +347,18 @@ cudensitymatOperator_t cudm_helper::compute_lindblad_operator(
352347
"compute_lindblad_operator.");
353348
}
354349

355-
elem_ops.push_back(L_elem_op);
356-
elem_ops.push_back(L_dagger_elem_op);
350+
elem_ops.emplace_back(L_elem_op);
351+
all_degrees.emplace_back(L_op.degrees);
352+
elem_ops.emplace_back(L_dagger_elem_op);
353+
all_degrees.emplace_back(L_dagger_op.degrees);
357354

358355
// D1 = L * Lt
359356
cudensitymatOperatorTerm_t term_D1;
360357
HANDLE_CUDM_ERROR(cudensitymatCreateOperatorTerm(
361358
handle, static_cast<int32_t>(mode_extents.size()),
362359
mode_extents.data(), &term_D1));
363360

364-
append_elementary_operator_to_term(term_D1, {L_elem_op}, {{0}});
365-
366-
append_elementary_operator_to_term(term_D1, {L_dagger_elem_op}, {{0}});
361+
append_elementary_operator_to_term(term_D1, elem_ops, all_degrees, false);
367362

368363
// Add term D1 to the Lindblad operator
369364

@@ -378,9 +373,7 @@ cudensitymatOperator_t cudm_helper::compute_lindblad_operator(
378373
handle, static_cast<int32_t>(mode_extents.size()),
379374
mode_extents.data(), &term_D2));
380375

381-
append_elementary_operator_to_term(term_D2, {L_dagger_elem_op}, {{0}});
382-
383-
append_elementary_operator_to_term(term_D2, {L_elem_op}, {{0}});
376+
append_elementary_operator_to_term(term_D2, elem_ops, all_degrees, false);
384377

385378
// Add term D2 to the Lindblad operator
386379
HANDLE_CUDM_ERROR(cudensitymatOperatorAppendTerm(
@@ -392,8 +385,7 @@ cudensitymatOperator_t cudm_helper::compute_lindblad_operator(
392385
HANDLE_CUDM_ERROR(cudensitymatCreateOperatorTerm(
393386
handle, static_cast<int32_t>(mode_extents.size()),
394387
mode_extents.data(), &term_D3));
395-
append_elementary_operator_to_term(term_D3, {L_elem_op}, {{0}});
396-
append_elementary_operator_to_term(term_D3, {L_dagger_elem_op}, {{0}});
388+
append_elementary_operator_to_term(term_D3, elem_ops, all_degrees, true);
397389

398390
// Add term D3 to the Lindblad operator
399391
HANDLE_CUDM_ERROR(cudensitymatOperatorAppendTerm(
@@ -459,10 +451,6 @@ cudensitymatOperator_t cudm_helper::convert_to_cudensitymat_operator(
459451

460452
for (const auto &product_op : op.get_terms()) {
461453
cudensitymatOperatorTerm_t term;
462-
// std::cout << "mode_extent: ";
463-
// for (const auto& mode_extent: mode_extents)
464-
// std::cout << mode_extent << " ";
465-
// std::cout << "\n";
466454
HANDLE_CUDM_ERROR(cudensitymatCreateOperatorTerm(
467455
handle, static_cast<int32_t>(mode_extents.size()),
468456
mode_extents.data(), &term));
@@ -483,16 +471,12 @@ cudensitymatOperator_t cudm_helper::convert_to_cudensitymat_operator(
483471
throw std::runtime_error("Unhandled type!");
484472
}
485473
}
486-
append_elementary_operator_to_term(term, elem_ops, all_degrees);
487-
// Handle the coefficient
488-
// Static value without parameter: as it is
489-
// Static value with parameter: Callback
474+
append_elementary_operator_to_term(term, elem_ops, all_degrees, false);
490475
auto coeff = product_op.get_coefficient();
491476
cudensitymatWrappedScalarCallback_t wrapped_callback = {nullptr, nullptr};
492477

493478
if (!coeff.get_generator()) {
494479
const auto coeffVal = coeff.evaluate();
495-
// std::cout << "Append product term " << term << " with coeff = " << coeffVal << " to operator " << operator_handle << "\n";
496480
HANDLE_CUDM_ERROR(cudensitymatOperatorAppendTerm(
497481
handle, operator_handle, term, 0,
498482
make_cuDoubleComplex(coeffVal.real(), coeffVal.imag()),

0 commit comments

Comments
 (0)