Skip to content

UCCSD operator pool correction and integration in adapt simulator #65

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 46 commits into from
Mar 25, 2025
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
b763bd1
fix to uccsd operator pool
kvmto Jan 29, 2025
8cec893
Linted files.
kvmto Jan 30, 2025
f888443
Fixed tests issue 28 and linted.
kvmto Jan 31, 2025
f0bc450
updated tests
kvmto Jan 31, 2025
9114ac9
Fix signed int overflow in uccsd (#64)
annagrin Feb 2, 2025
77ebc62
Commented operator pools.
kvmto Feb 3, 2025
28d228e
Rectified insertion of i coefficient.
kvmto Feb 3, 2025
d540e7e
Linting.
kvmto Feb 3, 2025
ad420a2
Merge branch 'NVIDIA:main' into fix_issue_28
kvmto Feb 5, 2025
0f715df
Updated test adapt and adapt simulator
kvmto Feb 5, 2025
694d3e9
New update test adapt
kvmto Feb 5, 2025
d354de6
Finished dev of tests adapt vqe.
kvmto Feb 5, 2025
ec45a39
Linted.
kvmto Feb 5, 2025
7cff303
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Feb 18, 2025
be814f3
Added molecules to test adapt.
kvmto Feb 20, 2025
1204bf8
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Feb 20, 2025
1f6a081
Tolerances reduced.
kvmto Feb 20, 2025
bff8818
Tests refactored and reset
kvmto Feb 21, 2025
a22cf61
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Feb 24, 2025
eb22a1d
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Mar 6, 2025
00a1b67
New tests for test_adapt
kvmto Mar 6, 2025
e42e204
change of norm calculation, adapt_kernel, uccsd coefficients
kvmto Mar 13, 2025
dbfbfdf
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Mar 13, 2025
1fe364b
Update libs/solvers/include/cudaq/solvers/operators/operator_pools/qa…
kvmto Mar 13, 2025
0c928d8
Update libs/solvers/include/cudaq/solvers/operators/operator_pools/qa…
kvmto Mar 13, 2025
9a00b5a
Update libs/solvers/include/cudaq/solvers/operators/operator_pools/uc…
kvmto Mar 13, 2025
d0f4629
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Mar 13, 2025
9ec771b
Update libs/solvers/include/cudaq/solvers/operators/operator_pools/sp…
kvmto Mar 13, 2025
62798e1
Python test of UCCSD operator pool updated.
kvmto Mar 14, 2025
6df8730
Introduced new options and clean up of the commutators
kvmto Mar 14, 2025
c243f3b
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Mar 14, 2025
c3d2cd2
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Mar 17, 2025
1baf2a6
Formatting fixed
kvmto Mar 17, 2025
6c78ed5
Try to fix python format
melody-ren Mar 17, 2025
e44bdd8
verbose step print
kvmto Mar 19, 2025
ab418bd
Removed includes not used
kvmto Mar 19, 2025
482cb80
Commented adat-vqe cpp and added new options to adapt-vqe in python b…
kvmto Mar 19, 2025
c98a5ec
Merge remote-tracking branch 'upstream/main' into fix_issue_28
kvmto Mar 19, 2025
e556bd1
Merge remote-tracking branch 'origin/fix_issue_28' into fix_issue_28
kvmto Mar 19, 2025
91b410e
Linted libs/solvers/lib/adapt/adapt_simulator.cpp
kvmto Mar 19, 2025
326b1d4
Introduced performance improvement and made docs aware
kvmto Mar 21, 2025
91d745b
Change to adapt_vqe options
kvmto Mar 21, 2025
5b3be90
set new option dynamic_start
kvmto Mar 22, 2025
a522028
Consistency fixed in docs
kvmto Mar 22, 2025
44be85c
Align to adapt_vqe. Added tol options for vqe when optimizer is not s…
kvmto Mar 22, 2025
a8aa1b7
Small change in docs
kvmto Mar 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 22 additions & 26 deletions libs/solvers/lib/operators/operator_pools/uccsd_operator_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ uccsd::generate(const heterogeneous_map &config) const {
for (std::size_t i = p + 1; i < q; i++)
o *= cudaq::spin::z(i);

ops.emplace_back(cudaq::spin::y(p) * o * cudaq::spin::x(q));
ops.emplace_back(cudaq::spin::x(p) * o * cudaq::spin::y(q));
cudaq::spin_op t = cudaq::spin::y(p) * o * cudaq::spin::x(q) -
cudaq::spin::x(p) * o * cudaq::spin::y(q);
ops.emplace_back(cudaq::spin::y(p) * o * cudaq::spin::x(q) -
cudaq::spin::x(p) * o * cudaq::spin::y(q));
};

auto addDoublesExcitation = [numQubits](std::vector<cudaq::spin_op> &ops,
Expand Down Expand Up @@ -79,30 +81,24 @@ uccsd::generate(const heterogeneous_map &config) const {
for (std::size_t i = a_virt + 1; i < b_virt; i++)
parity_b *= cudaq::spin::z(i);

ops.emplace_back(cudaq::spin::x(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::x(a_virt) * parity_b *
cudaq::spin::y(b_virt));
ops.emplace_back(cudaq::spin::x(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::y(a_virt) * parity_b *
cudaq::spin::x(b_virt));
ops.emplace_back(cudaq::spin::x(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::y(a_virt) * parity_b *
cudaq::spin::y(b_virt));
ops.emplace_back(cudaq::spin::y(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::y(a_virt) * parity_b *
cudaq::spin::y(b_virt));
ops.emplace_back(cudaq::spin::x(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::x(a_virt) * parity_b *
cudaq::spin::x(b_virt));
ops.emplace_back(cudaq::spin::y(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::x(a_virt) * parity_b *
cudaq::spin::x(b_virt));
ops.emplace_back(cudaq::spin::y(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::x(a_virt) * parity_b *
cudaq::spin::y(b_virt));
ops.emplace_back(cudaq::spin::y(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::y(a_virt) * parity_b *
cudaq::spin::x(b_virt));
auto op_term_temp = cudaq::spin::x(i_occ) * parity_a *
cudaq::spin::x(j_occ) * cudaq::spin::x(a_virt) *
parity_b * cudaq::spin::y(b_virt);
op_term_temp += cudaq::spin::x(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::y(a_virt) * parity_b * cudaq::spin::x(b_virt);
op_term_temp += cudaq::spin::x(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::y(a_virt) * parity_b * cudaq::spin::y(b_virt);
op_term_temp += cudaq::spin::y(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::y(a_virt) * parity_b * cudaq::spin::y(b_virt);
op_term_temp -= cudaq::spin::x(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::x(a_virt) * parity_b * cudaq::spin::x(b_virt);
op_term_temp -= cudaq::spin::y(i_occ) * parity_a * cudaq::spin::x(j_occ) *
cudaq::spin::x(a_virt) * parity_b * cudaq::spin::x(b_virt);
op_term_temp -= cudaq::spin::y(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::x(a_virt) * parity_b * cudaq::spin::y(b_virt);
op_term_temp -= cudaq::spin::y(i_occ) * parity_a * cudaq::spin::y(j_occ) *
cudaq::spin::y(a_virt) * parity_b * cudaq::spin::x(b_virt);
ops.emplace_back(op_term_temp);
};

for (auto &sa : singlesAlpha)
Expand Down
49 changes: 34 additions & 15 deletions libs/solvers/unittests/test_operator_pools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ TEST(UCCSDTest, GenerateWithDefaultConfig) {

auto operators = pool->generate(config);
ASSERT_FALSE(operators.empty());
EXPECT_EQ(operators.size(), 2 * 2 + 1 * 8);
EXPECT_EQ(operators.size(), 2 + 1);

for (const auto &op : operators) {
EXPECT_EQ(op.num_qubits(), 4);
Expand All @@ -30,7 +30,7 @@ TEST(UCCSDTest, GenerateFromAPIFunction) {
auto operators = cudaq::solvers::get_operator_pool(
"uccsd", {{"num-qubits", 4}, {"num-electrons", 2}});
ASSERT_FALSE(operators.empty());
EXPECT_EQ(operators.size(), 2 * 2 + 1 * 8);
EXPECT_EQ(operators.size(), 2 + 1);

for (const auto &op : operators) {
EXPECT_EQ(op.num_qubits(), 4);
Expand All @@ -46,12 +46,20 @@ TEST(UCCSDTest, GenerateWithCustomCoefficients) {
auto operators = pool->generate(config);

ASSERT_FALSE(operators.empty());
EXPECT_EQ(operators.size(), (2 * 2 + 1 * 8));
EXPECT_EQ(operators.size(), 2 + 1);

std::vector<std::complex<double>> temp_coeffs;
for (size_t i = 0; i < operators.size(); ++i) {
EXPECT_EQ(operators[i].num_qubits(), 4);
EXPECT_DOUBLE_EQ(1.0, operators[i].get_coefficient().real());

operators[i].for_each_term([&](const auto &term) {
temp_coeffs.push_back(term.get_coefficient());
});
}

for (size_t j = 0; j < temp_coeffs.size(); ++j)
EXPECT_DOUBLE_EQ(1.0, std::abs(temp_coeffs[j].real()));
// EXPECT_DOUBLE_EQ(1.0, operators[i].get_coefficient().real());
}

TEST(UCCSDTest, GenerateWithOddElectrons) {
Expand All @@ -64,7 +72,7 @@ TEST(UCCSDTest, GenerateWithOddElectrons) {
auto operators = pool->generate(config);

ASSERT_FALSE(operators.empty());
EXPECT_EQ(operators.size(), 2 * 4 + 4 * 8);
EXPECT_EQ(operators.size(), 2 * 2 + 4);

for (const auto &op : operators)
EXPECT_EQ(op.num_qubits(), 6);
Expand All @@ -79,7 +87,7 @@ TEST(UCCSDTest, GenerateWithLargeSystem) {
auto operators = pool->generate(config);

ASSERT_FALSE(operators.empty());
EXPECT_GT(operators.size(), 875);
EXPECT_GT(operators.size(), 825);

for (const auto &op : operators) {
EXPECT_EQ(op.num_qubits(), 20);
Expand All @@ -97,32 +105,43 @@ TEST(UccsdOperatorPoolTest, GeneratesCorrectOperators) {
auto operators = pool->generate(config);

// Convert SpinOperators to strings
std::vector<std::string> terms_strings;
std::vector<std::string> operator_strings;
for (const auto &op : operators) {
op.for_each_term([&](const auto &term) {
terms_strings.push_back(term.to_string(false));
});
operator_strings.push_back(op.to_string(false));
}

// Assert
std::vector<std::string> expected_terms = {"XZYI", "YZXI", "IXZY", "IYZX",
"YYYX", "YXXX", "XXYX", "YYXY",
"XYYY", "XXXY", "YXYY", "XYXX"};

std::vector<std::string> expected_operators = {
"YZXI", "XZYI", "IYZX", "IXZY", "XXXY", "XXYX",
"XYYY", "YXYY", "XYXX", "YXXX", "YYXY", "YYYX"};
"XZYIYZXI", "IXZYIYZX", "XXXYXXYXXYXXXYYYYXXXYXYYYYXYYYYX"};

ASSERT_EQ(operator_strings.size(), expected_operators.size())
ASSERT_EQ(terms_strings.size(), expected_terms.size())
<< "Number of generated operators does not match expected count";

for (size_t i = 0; i < expected_terms.size(); ++i) {
EXPECT_EQ(terms_strings[i], expected_terms[i]) << "Mismatch at index " << i;
}

for (size_t i = 0; i < expected_operators.size(); ++i) {
EXPECT_EQ(operator_strings[i], expected_operators[i])
<< "Mismatch at index " << i;
<< "Mismatch operators at index " << i;
}

// Additional checks
for (const auto &op_string : operator_strings) {
EXPECT_EQ(op_string.length(), 4)
<< "Operator " << op_string
for (const auto &term_string : terms_strings) {
EXPECT_EQ(term_string.length(), 4)
<< "Operator " << term_string
<< " does not have the expected length of 4";

EXPECT_TRUE(op_string.find_first_not_of("IXYZ") == std::string::npos)
<< "Operator " << op_string << " contains invalid characters";
EXPECT_TRUE(term_string.find_first_not_of("IXYZ") == std::string::npos)
<< "Operator " << term_string << " contains invalid characters";
}
}

Expand Down
Loading