Skip to content

Commit

Permalink
Adding test_mocks for unittests
Browse files Browse the repository at this point in the history
Signed-off-by: Sachin Pisal <spisal@nvidia.com>
  • Loading branch information
sacpis committed Jan 31, 2025
1 parent ac98d3d commit 3ccc0d1
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 39 deletions.
2 changes: 1 addition & 1 deletion runtime/cudaq/dynamics/cudm_time_stepper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ cudm_state cudm_time_stepper::compute(cudm_state &state, double t,
state.get_raw_data().size(), {0.0, 0.0});
cudm_state next_state(handle_, zero_initiailized_data,
state.get_hilbert_space_dims());

if (!next_state.is_initialized()) {
throw std::runtime_error("Next state failed to initialize.");
}
Expand Down
51 changes: 13 additions & 38 deletions unittests/dynamics/test_cudm_time_stepper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,40 +6,23 @@
* the terms of the Apache License 2.0 which accompanies this distribution. *
******************************************************************************/

#include "test_mocks.h"
#include <cudaq/cudm_error_handling.h>
#include <cudaq/cudm_helpers.h>
#include <cudaq/cudm_state.h>
#include <cudaq/cudm_time_stepper.h>
#include <gtest/gtest.h>
#include <iostream>
#include <memory>

using namespace cudaq;

// Mock Liouvillian operator creation
cudensitymatOperator_t mock_liouvillian(cudensitymatHandle_t handle) {
cudensitymatOperator_t liouvillian;
std::vector<int64_t> dimensions = {2, 2};
HANDLE_CUDM_ERROR(cudensitymatCreateOperator(
handle, static_cast<int32_t>(dimensions.size()), dimensions.data(),
&liouvillian));
return liouvillian;
}

// Mock Hilbert space dimensions
std::vector<std::complex<double>> mock_initial_state_data() {
return {{1.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}};
}

// Mock initial raw state data
std::vector<int64_t> mock_hilbert_space_dims() { return {2, 2}; }

class CuDensityMatTimeStepperTest : public ::testing::Test {
protected:
cudensitymatHandle_t handle_;
cudensitymatOperator_t liouvillian_;
cudm_time_stepper *time_stepper_;
cudm_state *state_;

// CuDensityMatTimeStepperTest() : state_(mock_initial_state_data()) {};
std::unique_ptr<cudm_time_stepper> time_stepper_;
std::unique_ptr<cudm_state> state_;

void SetUp() override {
// Create library handle
Expand All @@ -49,12 +32,10 @@ class CuDensityMatTimeStepperTest : public ::testing::Test {
liouvillian_ = mock_liouvillian(handle_);

// Initialize the time stepper
time_stepper_ = new cudm_time_stepper(handle_, liouvillian_);

state_ = new cudm_state(handle_, mock_initial_state_data());
time_stepper_ = std::make_unique<cudm_time_stepper>(handle_, liouvillian_);

// Initialize the state
state_->init_state(mock_hilbert_space_dims());
state_ = std::make_unique<cudm_state>(handle_, mock_initial_state_data(),
mock_hilbert_space_dims());

ASSERT_TRUE(state_->is_initialized());
}
Expand All @@ -63,25 +44,19 @@ class CuDensityMatTimeStepperTest : public ::testing::Test {
// Clean up
HANDLE_CUDM_ERROR(cudensitymatDestroyOperator(liouvillian_));
HANDLE_CUDM_ERROR(cudensitymatDestroy(handle_));
delete time_stepper_;
delete state_;
}
};

// Test initialization of cudm_time_stepper
// TEST_F(CuDensityMatTimeStepperTest, Initialization) {
// ASSERT_NE(time_stepper_, nullptr);
// ASSERT_TRUE(state_->is_initialized());
// ASSERT_FALSE(state_->is_density_matrix());
// }
TEST_F(CuDensityMatTimeStepperTest, Initialization) {
ASSERT_NE(time_stepper_, nullptr);
ASSERT_TRUE(state_->is_initialized());
ASSERT_FALSE(state_->is_density_matrix());
}

// Test a single compute step
TEST_F(CuDensityMatTimeStepperTest, ComputeStep) {
ASSERT_TRUE(state_->is_initialized());
EXPECT_NO_THROW(time_stepper_->compute(*state_, 0.0, 1.0));
ASSERT_TRUE(state_->is_initialized());
}

// // Add test to use construct_liouvillian and then use compute to step using
// this liouvillian
// // z0 * z1
33 changes: 33 additions & 0 deletions unittests/dynamics/test_mocks.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/****************************************************************-*- C++ -*-****
* Copyright (c) 2022 - 2025 NVIDIA Corporation & Affiliates. *
* All rights reserved. *
* *
* This source code and the accompanying materials are made available under *
* the terms of the Apache License 2.0 which accompanies this distribution. *
******************************************************************************/

#pragma once

#include <cmath>
#include <complex>
#include <cudaq/cudm_error_handling.h>
#include <cudensitymat.h>
#include <iostream>

// Mock Liouvillian operator creation
inline cudensitymatOperator_t mock_liouvillian(cudensitymatHandle_t handle) {
cudensitymatOperator_t liouvillian;
std::vector<int64_t> dimensions = {2, 2};
HANDLE_CUDM_ERROR(cudensitymatCreateOperator(
handle, static_cast<int32_t>(dimensions.size()), dimensions.data(),
&liouvillian));
return liouvillian;
}

// Mock Hilbert space dimensions
inline std::vector<std::complex<double>> mock_initial_state_data() {
return {{1.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}};
}

// Mock initial raw state data
inline std::vector<int64_t> mock_hilbert_space_dims() { return {2, 2}; }

0 comments on commit 3ccc0d1

Please sign in to comment.