@@ -221,7 +221,7 @@ cudensitymatElementaryOperator_t cudm_helper::create_elementary_operator(
221221void 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 >> °rees) {
224+ const std::vector<std::vector<int >> °rees, 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