Skip to content

Decomposition#920

Open
cs-tum-st wants to merge 91 commits intomunich-quantum-toolkit:mainfrom
cs-tum-st:decomposition
Open

Decomposition#920
cs-tum-st wants to merge 91 commits intomunich-quantum-toolkit:mainfrom
cs-tum-st:decomposition

Conversation

@cs-tum-st
Copy link

@cs-tum-st cs-tum-st commented Jan 27, 2026

Description

Added a decomposer class which takes single qubit layers and decomposes them into local Rz and global Ry gates.

Checklist:

  • The pull request only contains commits that are focused and relevant to this change.
  • I have added appropriate tests that cover the new/changed functionality.
  • I have updated the documentation to reflect these changes.
  • I have added entries to the changelog for any noteworthy additions, changes, fixes, or removals.
  • I have added migration instructions to the upgrade guide (if needed).
  • The changes follow the project's style guidelines and introduce no new warnings.
  • The changes are fully tested and pass the CI checks.
  • I have reviewed my own code changes.

@mergify
Copy link

mergify bot commented Jan 27, 2026

🧪 CI Insights

Here's what we observed from your CI run for 9134d22.

🟢 All jobs passed!

But CI Insights is watching 👀

@ystade ystade changed the base branch from ystade/na-compiler-upgrade to main January 28, 2026 08:48
@ystade ystade added feature New feature or request usability Anything related to usability c++ Anything related to C++ code labels Jan 28, 2026
@ystade ystade added this to the Neutral Atom Compilation milestone Jan 28, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 28, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a RoutingAwareNativeGateCompiler and a new quaternion-based NativeGateDecomposer, changes DecomposerBase/NoOpDecomposer.decompose to accept nQubits (non-const), and adds unit and integration tests for the decomposer and compiler. (33 words)

Changes

Cohort / File(s) Summary
Compiler Integration
include/na/zoned/Compiler.hpp
Add RoutingAwareNativeGateCompiler using NativeGateDecomposer; new constructors and include.
Decomposer Interface
include/na/zoned/decomposer/DecomposerBase.hpp
Change decompose signature to decompose(size_t nQubits, const std::vector<...>&) and remove const (affects implementers and callers).
NativeGateDecomposer (API & Impl)
include/na/zoned/decomposer/NativeGateDecomposer.hpp, src/na/zoned/decomposer/NativeGateDecomposer.cpp
New quaternion-based decomposer: gate→quaternion conversion, quaternion composition, U3-angle extraction, theta-max, transformToU3, getDecompositionAngles, and full decompose producing layered SingleQubitGateLayer outputs.
NoOpDecomposer Updates
include/na/zoned/decomposer/NoOpDecomposer.hpp, src/na/zoned/decomposer/NoOpDecomposer.cpp
Update decompose to match base signature (size_t nQubits, ...) and remove const; simplify Config JSON friend templates.
Tests
test/na/zoned/test_compiler.cpp, test/na/zoned/test_native_gate_decomposer.cpp
Add compiler instantiation for RoutingAwareNativeGateCompiler and extensive unit tests for quaternion ops, gate conversions, U3 extraction, and decomposition scenarios.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Compiler as RoutingAwareNativeGateCompiler
    participant Decomposer as NativeGateDecomposer
    participant Scheduler as ASAPScheduler
    participant Reuse as VertexMatchingReuseAnalyzer
    participant Synth as RoutingAwareSynthesizer
    participant Codegen as CodeGenerator

    User->>Compiler: submit scheduled circuit
    Compiler->>Decomposer: decompose(nQubits, singleQubitLayers)
    Decomposer-->>Compiler: per-layer SingleQubitGateLayer sequences
    Compiler->>Scheduler: schedule decomposed layers
    Scheduler-->>Compiler: timed layers
    Compiler->>Reuse: analyze reuse/layout
    Reuse-->>Compiler: reuse decisions
    Compiler->>Synth: synthesize layout-aware single-qubit blocks
    Synth-->>Compiler: synthesized gates
    Compiler->>Codegen: generate target code
    Codegen-->>User: compiled output
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

enhancement, documentation

Suggested reviewers

  • burgholzer

Poem

🐰 I hop through qubits with joyful cheer,
I spin quaternions both far and near,
I split each layer into three,
Route and stitch with nimble glee,
A compiled carrot for every peer.

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.02% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Decomposition' is vague and generic. It describes the general feature area but lacks specificity about what decomposition is being implemented or its key purpose. Revise the title to be more specific, such as 'Add NativeGateDecomposer for quaternion-based single-qubit gate decomposition' to clearly convey the main change.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The description adequately summarizes the main change and includes most checklist items. However, it lacks clarity on technical details, dependencies, and related issue references.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
📝 Coding Plan for PR comments
  • Generate coding plan

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

🤖 Fix all issues with AI agents
In `@include/na/zoned/decomposer/Decomposer.hpp`:
- Around line 83-95: Fix the typos in the Doxygen comment above
get_decomposition_angles: change "hate" to "gate" in the first sentence (qubit
hate -> qubit gate) and change "qate" to "gate" in the `@param` description
(single-qubit qate layer -> single-qubit gate layer); update the comment block
associated with the get_decomposition_angles declaration in Decomposer.hpp
accordingly.
- Around line 54-61: The doc comment for get_U3_angles_from_quaternion in
Decomposer.hpp contains a typo ("U§") in the `@returns` description; update that
comment so the `@returns` line reads that it returns an array of three qc::fp
values [theta, phi, lambda] giving the U3 gate angles (replace "U§" with "U3")
to accurately document the function get_U3_angles_from_quaternion.

In `@src/na/zoned/decomposer/Decomposer.cpp`:
- Around line 144-152: The loop in Decomposer::calc_theta_max copies each
struct_U3 from the layer vector on every iteration; change the range loop to
iterate by const reference (e.g., const auto& gate) so you avoid unnecessary
copies when accessing gate.angles[0] while preserving immutability and behavior.
- Around line 169-172: The loop in Decomposer.cpp uses a signed loop variable
(auto i = 1) compared against qubit_gates.size() which is unsigned, causing a
signed/unsigned comparison; change the loop variable to an unsigned type (e.g.,
size_t i = 1) to match qubit_gates.size(), keeping the loop logic that calls
combine_quaternions(quat, convert_gate_to_quaternion(qubit_gates[i])) unchanged
and ensuring any other similar loops in the Decomposer class use size_t for
indices.
- Line 14: The include path casing is wrong: update the include in
Decomposer.cpp to match the actual header filename by replacing
"na/zoned/decomposer/decomposer.hpp" with the correctly-cased
"na/zoned/decomposer/Decomposer.hpp" so the compiler can find the header on
case-sensitive filesystems; check for any other mismatched includes referencing
"decomposer.hpp" and fix them likewise.
- Around line 135-139: The else branch in Decomposer.cpp currently sets phi and
lambda to 0 when an impossible path is hit; instead, make this an explicit
failure: replace the silent fallback with throwing a descriptive exception
(e.g., throw std::runtime_error) or an assert so the impossible state is caught
immediately, and add the necessary include (<stdexcept> or <cassert>). Reference
the variables phi and lambda and the containing Decomposer code path so the
thrown message explains the unexpected branch and includes any relevant
contextual values if available.
- Around line 225-241: The range-for is copying each struct_U3 into the loop
(for (auto gate : layer)), which is wasteful; change the loop to use a const
reference (for (const auto& gate : layer)) so you don't copy the struct before
calling get_decomposition_angles(gate.angles, theta_max) and constructing the
qc::StandardOperation objects that are emplaced into FrontLayer, MidLayer and
BackLayer.
- Around line 247-252: Replace raw new expressions used when populating GR_plus
and GR_minus with std::make_unique to avoid manual memory management: in the
loop that currently does GR_plus.emplace_back(new qc::StandardOperation(i,
qc::RY, {theta_max / 2})); and GR_minus.emplace_back(new
qc::StandardOperation(i, qc::RY, {-1 * theta_max / 2})); construct and emplace
unique_ptrs via std::make_unique<qc::StandardOperation>(...) instead; ensure the
container element type supports std::unique_ptr and include <memory> if not
already included.
- Line 23: The constructor Decomposer::Decomposer currently assigns N_qubits
inside the body; change it to use a member initializer list to initialize the
N_qubits member (e.g., initialize N_qubits with n_qubits in the constructor
signature) and remove the in-body assignment, keeping the constructor body
empty; update the Decomposer::Decomposer definition accordingly to use the
initializer list for efficiency and idiomatic C++.
- Around line 70-71: The Y gate quaternion is wrong: when checking
op.get().getType() == qc::Y in Decomposer.cpp, quat is incorrectly set to
{0,1,0,0} (same as X); change the assignment so quat is {0,0,1,0} to represent
the Pauli-Y (π rotation about Y-axis) in the branch that handles qc::Y.
- Around line 162-176: The loops currently copy elements (use "auto gate :
layer" and "auto qubit_gates : gates") causing unnecessary copies and potential
overhead; change those to const references (use "const auto& gate" and "const
auto& qubit_gates") to iterate by reference, and also ensure the index variable
for iterating qubit_gates.size() is an unsigned type (e.g., size_t) to avoid
signed/unsigned issues while using functions convert_gate_to_quaternion,
combine_quaternions, get_U3_angles_from_quaternion and constructing struct_U3.

In `@test/na/zoned/test_decomposer.cpp`:
- Around line 168-175: The test RXDecompositionTest declares an unused variable
n; remove the declaration of size_t n = 1; from the TEST(Test,
RXDecompositionTest) block so only the meaningful variables and the EXPECT_THAT
assertion remain (locate the TEST named RXDecompositionTest and delete the
unused `n` variable).
- Around line 206-209: The local variable n is declared as int but is passed to
qc::QuantumComputation and Decomposer which expect size_t, causing implicit
signed-to-unsigned conversion; change the declaration of n to size_t (used by
qc::QuantumComputation qc and Decomposer decomposer) so both
qc::QuantumComputation qc(n) and Decomposer decomposer = Decomposer(n) receive
the correct unsigned type and eliminate the warning.
- Around line 188-200: The test DoubleDecompositionTest declares an unused
variable `n` which should be removed; edit the TEST (DoubleDecompositionTest)
and delete the line "size_t n = 1;" so only the arrays x1 and z2 and the
EXPECT_THAT assertions remain (or alternatively suppress the unused-variable by
casting to void, but preferred fix is to remove the unused declaration).
- Around line 177-186: The test declares an unused variable 'n' in TEST(Test,
U3DecompositionTest); remove the unused declaration (the line "size_t n = 1;")
from test_decomposer.cpp so the test only sets up the u3 array and calls
Decomposer::get_decomposition_angles; if 'n' was intended to be used, instead
incorporate it into the test assertions or function call consistently rather
than leaving it unused.
- Around line 236-239: The test uses a signed int for the qubit count and
indices which can cause sign-conversion warnings; change the variable
declaration and related uses to size_t (replace "int n = 1;" with "size_t n =
1;" and construct Decomposer with Decomposer(n)), and ensure any index arguments
passed to qc::QuantumComputation::u and Decomposer constructors/methods use
size_t to keep types consistent (references: the variable n,
qc::QuantumComputation qc, qc.u(..., 0), and Decomposer decomposer).
- Around line 149-166: Remove the unused variable 'n' and eliminate the heap
allocation for op to fix the memory leak: create a stack-allocated
qc::StandardOperation (e.g., qc::StandardOperation op(0, qc::U, {0, qc::PI,
qc::PI_2});) and pass it into Decomposer::convert_gate_to_quaternion by wrapping
a const base-reference (e.g., std::reference_wrapper<const
qc::Operation>(static_cast<const qc::Operation&>(op))). This removes the need
for new/delete and removes the unused variable.
- Around line 131-147: The test allocates qc::StandardOperation with new and
declares an unused size_t n, causing a leak; replace the raw new and unused
variable by creating the operation as an automatic (stack) object or a smart
pointer and remove n. For example, instantiate qc::StandardOperation op(0,
qc::U, {qc::PI, qc::PI, qc::PI_2}) (or use std::make_unique and deref) and pass
std::reference_wrapper<const qc::Operation>(op) into
Decomposer::convert_gate_to_quaternion, eliminating the raw pointer and ensuring
no leak or unused variables remain.
- Around line 112-129: The test SingleU3GateAngleTest leaks memory by allocating
a qc::StandardOperation with raw new (op) and never deleting it, and declares an
unused variable n; replace the heap allocation with a stack-allocated
qc::StandardOperation (or use a smart pointer) and pass a reference to it into
Decomposer::convert_gate_to_quaternion, and remove the unused variable n so only
the used symbols remain (op -> stack object,
Decomposer::convert_gate_to_quaternion, and remove n).
- Around line 97-110: The test `SingleXGateAngleTest` leaks memory by allocating
`qc::Operation* op = new qc::StandardOperation(0, qc::X)` without deleting it;
replace the raw new with a stack-allocated `qc::StandardOperation` or manage it
with `std::unique_ptr` and pass the correct reference to
`Decomposer::convert_gate_to_quaternion`, and also remove the unused `n` and the
unused `qc` `QuantumComputation` instance; ensure you call
`Decomposer::convert_gate_to_quaternion` with a reference/wrapper to the managed
or stack object and leave `Decomposer::get_U3_angles_from_quaternion` unchanged.

@ystade ystade self-requested a review January 28, 2026 10:04
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
include/na/zoned/Compiler.hpp (1)

204-207: Missing nQubits argument in decompose() call.

The decompose method signature was updated to require nQubits as the first parameter, but this call site was not updated. This will cause a compilation error.

🐛 Proposed fix
     SPDLOG_DEBUG("Decomposing...");
     const auto decomposingStart = std::chrono::system_clock::now();
     const auto& decomposedSingleQubitGateLayers =
-        SELF.decompose(singleQubitGateLayers);
+        SELF.decompose(qComp.getNqubits(), singleQubitGateLayers);
     const auto decomposingEnd = std::chrono::system_clock::now();
🤖 Fix all issues with AI agents
In `@include/na/zoned/Compiler.hpp`:
- Around line 316-319: The CRTP instantiation is using the wrong concrete type:
change the base of class RoutingAwareNativeGateCompiler from
Compiler<RoutingAwareCompiler, ...> to Compiler<RoutingAwareNativeGateCompiler,
...> so the SELF/CRTP casts are correct; update the template parameter in the
class declaration for RoutingAwareNativeGateCompiler to use its own class name
as the first template argument.

In `@include/na/zoned/decomposer/NativeGateDecomposer.hpp`:
- Around line 37-38: Document the rationale for the epsilon multiplier on the
constant epsilon used for quaternion tolerancing: add a brief inline comment
next to the declaration of constexpr static qc::fp epsilon that explains why
std::numeric_limits<qc::fp>::epsilon() is multiplied by 1024 (e.g., to allow ~10
bits of accumulated floating‑point error margin for quaternion operations and
comparisons), mentioning any empirical or theoretical basis if applicable; keep
the comment short and tied to the symbol epsilon in NativeGateDecomposer.hpp so
future readers understand the tolerance choice.

In `@src/na/zoned/decomposer/NativeGateDecomposer.cpp`:
- Around line 29-31: The quaternion for RZ and P gates is using the full
rotation angle; update the assignment in the branch checking op.get().getType()
== qc::RZ || op.get().getType() == qc::P so it uses half the angle (parameter/2)
when computing the quaternion components (i.e., mirror how RX/RY use
parameter/2) by reading op.get().getParameter().front(), dividing it by 2, and
using that value in the cos(...) and sin(...) calls.
- Around line 249-254: The loop uses a signed int for i which triggers
signed/unsigned comparison against this->nQubits_; change the loop variable to
an unsigned type (e.g. size_t or std::size_t) to match nQubits_ and avoid
warnings. Update the for loop that builds GR_plus and GR_minus (the loop
referencing this->nQubits_, qc::StandardOperation and qc::RY) so i has the same
unsigned type as nQubits_ and ensure any uses of i elsewhere in that scope
remain correct.

In `@test/na/zoned/test_native_gate_decomposer.cpp`:
- Around line 268-299: The final RZ angle assertion in the TwoPauliGatesOneQubit
test is brittle because equivalent phases like 3π/2 and -π/2 should both be
accepted; update the assertion on decomp[0][4]->getParameter() to compare angles
modulo 2π (or normalize both actual and expected to the principal range, e.g.,
(-π, π]) before using ::testing::DoubleNear) so equivalent phases pass; locate
this in the TEST_F named TwoPauliGatesOneQubit and change the expectation that
checks decomp[0][4]->getParameter() (currently comparing to 3 * qc::PI_2) to a
modulo-2π/normalization-based comparison.

Comment on lines +268 to +299
TEST_F(DecomposerTest, TwoPauliGatesOneQubit) {
// ┌───────┐ ┌───────┐
// q: ┤ X ├──┤ Z ├
// └───────┘ └───────┘
size_t n = 1;
qc::QuantumComputation qc(n);
qc.x(0);
qc.z(0);
const auto& sched = scheduler.schedule(qc);
auto decomp = decomposer.decompose(qc.getNqubits(), sched.first);

EXPECT_EQ(decomp.size(), 1);
EXPECT_EQ(decomp[0].size(), 5);
EXPECT_EQ(decomp[0][0]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][0]->getTargets(), ::testing::ElementsAre(0));
EXPECT_THAT(decomp[0][0]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(qc::PI_2, epsilon)));
EXPECT_TRUE(decomp[0][1]->isCompoundOperation());
EXPECT_TRUE(decomp[0][1]->isGlobal(n));
EXPECT_EQ(decomp[0][2]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][2]->getTargets(), ::testing::ElementsAre(0));
EXPECT_THAT(decomp[0][2]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(qc::PI, epsilon)));
EXPECT_TRUE(decomp[0][3]->isCompoundOperation());
EXPECT_TRUE(decomp[0][3]->isGlobal(n));
EXPECT_EQ(decomp[0][4]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][4]->getTargets(), ::testing::ElementsAre(0));
// TODO: FIgure out i this is always Positive
EXPECT_THAT(
decomp[0][4]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(3 * qc::PI_2, epsilon)));
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Make the final RZ angle assertion robust to equivalent phases.

The TODO suggests the sign can flip. Consider accepting equivalent angles (e.g., 3π/2 and −π/2) to avoid a brittle test.

💡 Example adjustment
-  EXPECT_THAT(
-      decomp[0][4]->getParameter(),
-      ::testing::ElementsAre(::testing::DoubleNear(3 * qc::PI_2, epsilon)));
+  EXPECT_THAT(
+      decomp[0][4]->getParameter(),
+      ::testing::ElementsAre(::testing::AnyOf(
+          ::testing::DoubleNear(3 * qc::PI_2, epsilon),
+          ::testing::DoubleNear(-qc::PI_2, epsilon))));
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
TEST_F(DecomposerTest, TwoPauliGatesOneQubit) {
// ┌───────┐ ┌───────┐
// q: ┤ X ├──┤ Z ├
// └───────┘ └───────┘
size_t n = 1;
qc::QuantumComputation qc(n);
qc.x(0);
qc.z(0);
const auto& sched = scheduler.schedule(qc);
auto decomp = decomposer.decompose(qc.getNqubits(), sched.first);
EXPECT_EQ(decomp.size(), 1);
EXPECT_EQ(decomp[0].size(), 5);
EXPECT_EQ(decomp[0][0]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][0]->getTargets(), ::testing::ElementsAre(0));
EXPECT_THAT(decomp[0][0]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(qc::PI_2, epsilon)));
EXPECT_TRUE(decomp[0][1]->isCompoundOperation());
EXPECT_TRUE(decomp[0][1]->isGlobal(n));
EXPECT_EQ(decomp[0][2]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][2]->getTargets(), ::testing::ElementsAre(0));
EXPECT_THAT(decomp[0][2]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(qc::PI, epsilon)));
EXPECT_TRUE(decomp[0][3]->isCompoundOperation());
EXPECT_TRUE(decomp[0][3]->isGlobal(n));
EXPECT_EQ(decomp[0][4]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][4]->getTargets(), ::testing::ElementsAre(0));
// TODO: FIgure out i this is always Positive
EXPECT_THAT(
decomp[0][4]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(3 * qc::PI_2, epsilon)));
}
TEST_F(DecomposerTest, TwoPauliGatesOneQubit) {
// ┌───────┐ ┌───────┐
// q: ┤ X ├──┤ Z ├
// └───────┘ └───────┘
size_t n = 1;
qc::QuantumComputation qc(n);
qc.x(0);
qc.z(0);
const auto& sched = scheduler.schedule(qc);
auto decomp = decomposer.decompose(qc.getNqubits(), sched.first);
EXPECT_EQ(decomp.size(), 1);
EXPECT_EQ(decomp[0].size(), 5);
EXPECT_EQ(decomp[0][0]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][0]->getTargets(), ::testing::ElementsAre(0));
EXPECT_THAT(decomp[0][0]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(qc::PI_2, epsilon)));
EXPECT_TRUE(decomp[0][1]->isCompoundOperation());
EXPECT_TRUE(decomp[0][1]->isGlobal(n));
EXPECT_EQ(decomp[0][2]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][2]->getTargets(), ::testing::ElementsAre(0));
EXPECT_THAT(decomp[0][2]->getParameter(),
::testing::ElementsAre(::testing::DoubleNear(qc::PI, epsilon)));
EXPECT_TRUE(decomp[0][3]->isCompoundOperation());
EXPECT_TRUE(decomp[0][3]->isGlobal(n));
EXPECT_EQ(decomp[0][4]->getType(), qc::RZ);
EXPECT_THAT(decomp[0][4]->getTargets(), ::testing::ElementsAre(0));
// TODO: FIgure out i this is always Positive
EXPECT_THAT(
decomp[0][4]->getParameter(),
::testing::ElementsAre(::testing::AnyOf(
::testing::DoubleNear(3 * qc::PI_2, epsilon),
::testing::DoubleNear(-qc::PI_2, epsilon))));
}
🤖 Prompt for AI Agents
In `@test/na/zoned/test_native_gate_decomposer.cpp` around lines 268 - 299, The
final RZ angle assertion in the TwoPauliGatesOneQubit test is brittle because
equivalent phases like 3π/2 and -π/2 should both be accepted; update the
assertion on decomp[0][4]->getParameter() to compare angles modulo 2π (or
normalize both actual and expected to the principal range, e.g., (-π, π]) before
using ::testing::DoubleNear) so equivalent phases pass; locate this in the
TEST_F named TwoPauliGatesOneQubit and change the expectation that checks
decomp[0][4]->getParameter() (currently comparing to 3 * qc::PI_2) to a
modulo-2π/normalization-based comparison.

Copy link
Collaborator

@ystade ystade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @cs-tum-st, thanks for your efforts in implementing the decomposer in our neutral atom compiler. As you can see, I made some adoptions to the header file and incoporated the new omponent in the compilation flow.

I did not go through the code in the source file in detail yet because before doing that, I would like to request from you, that you satisfy the comments from @coderabbitai and fix all issues such that the CI show a green check mark. Thanks for your effort again.

pre-commit-ci bot and others added 29 commits March 10, 2026 14:13
## Description

This PR updates `.pre-commit-config.yml` to make use of `prek`'s
priority feature. The commits were initially part of munich-quantum-toolkit#921, which is
blocked due to a CD issue.

## Checklist:

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] ~I have added appropriate tests that cover the new/changed
functionality.~
- [x] ~I have updated the documentation to reflect these changes.~
- [x] ~I have added entries to the changelog for any noteworthy
additions, changes, fixes, or removals.~
- [x] ~I have added migration instructions to the upgrade guide (if
needed).~
- [x] The changes follow the project's style guidelines and introduce no
new warnings.
- [x] The changes are fully tested and pass the CI checks.
- [x] I have reviewed my own code changes.
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi4xIiwidXBkYXRlZEluVmVyIjoiNDIuOTIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHl0aG9uIl19-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Type | Update | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
|
[adhtruong/mirrors-typos](https://redirect.github.com/adhtruong/mirrors-typos)
| repository | patch | `v1.42.1` → `v1.42.3` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/adhtruong%2fmirrors-typos/v1.42.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/adhtruong%2fmirrors-typos/v1.42.1/v1.42.3?slim=true)
|
|
[astral-sh/uv-pre-commit](https://redirect.github.com/astral-sh/uv-pre-commit)
| repository | patch | `0.9.26` → `0.9.28` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/astral-sh%2fuv-pre-commit/0.9.28?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/astral-sh%2fuv-pre-commit/0.9.26/0.9.28?slim=true)
|
| [mqt-core](https://redirect.github.com/munich-quantum-toolkit/core)
([changelog](https://redirect.github.com/munich-quantum-toolkit/core/blob/main/CHANGELOG.md))
| dependency-groups | patch | `==3.4.0` → `==3.4.1` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/mqt-core/3.4.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/mqt-core/3.4.0/3.4.1?slim=true)
|
| [mqt.core](https://redirect.github.com/munich-quantum-toolkit/core)
([changelog](https://redirect.github.com/munich-quantum-toolkit/core/blob/main/CHANGELOG.md))
| build-system.requires | patch | `==3.4.0` → `==3.4.1` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/mqt-core/3.4.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/mqt-core/3.4.0/3.4.1?slim=true)
|
| [mqt.core](https://redirect.github.com/munich-quantum-toolkit/core)
([changelog](https://redirect.github.com/munich-quantum-toolkit/core/blob/main/CHANGELOG.md))
| project.dependencies | patch | `==3.4.0` → `==3.4.1` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/mqt-core/3.4.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/mqt-core/3.4.0/3.4.1?slim=true)
|
|
[python-jsonschema/check-jsonschema](https://redirect.github.com/python-jsonschema/check-jsonschema)
| repository | patch | `0.36.0` → `0.36.1` |
![age](https://developer.mend.io/api/mc/badges/age/github-tags/python-jsonschema%2fcheck-jsonschema/0.36.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/python-jsonschema%2fcheck-jsonschema/0.36.0/0.36.1?slim=true)
|
| [ty](https://redirect.github.com/astral-sh/ty)
([changelog](https://redirect.github.com/astral-sh/ty/blob/main/CHANGELOG.md))
| dependency-groups | patch | `==0.0.13` → `==0.0.14` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/ty/0.0.14?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ty/0.0.13/0.0.14?slim=true)
|

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://redirect.github.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>adhtruong/mirrors-typos (adhtruong/mirrors-typos)</summary>

###
[`v1.42.3`](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.42.2...v1.42.3)

[Compare
Source](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.42.2...v1.42.3)

###
[`v1.42.2`](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.42.1...v1.42.2)

[Compare
Source](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.42.1...v1.42.2)

</details>

<details>
<summary>astral-sh/uv-pre-commit (astral-sh/uv-pre-commit)</summary>

###
[`v0.9.28`](https://redirect.github.com/astral-sh/uv-pre-commit/releases/tag/0.9.28)

[Compare
Source](https://redirect.github.com/astral-sh/uv-pre-commit/compare/0.9.27...0.9.28)

See: <https://github.com/astral-sh/uv/releases/tag/0.9.28>

###
[`v0.9.27`](https://redirect.github.com/astral-sh/uv-pre-commit/releases/tag/0.9.27)

[Compare
Source](https://redirect.github.com/astral-sh/uv-pre-commit/compare/0.9.26...0.9.27)

See: <https://github.com/astral-sh/uv/releases/tag/0.9.27>

</details>

<details>
<summary>munich-quantum-toolkit/core (mqt-core)</summary>

###
[`v3.4.1`](https://redirect.github.com/munich-quantum-toolkit/core/releases/tag/v3.4.1):
MQT Core 3.4.1 Release

[Compare
Source](https://redirect.github.com/munich-quantum-toolkit/core/compare/v3.4.0...v3.4.1)

##### 👀 What Changed

*Please refer to the
[changelog](https://redirect.github.com/munich-quantum-toolkit/core/blob/main/CHANGELOG.md)
and the [upgrade
guide](https://redirect.github.com/munich-quantum-toolkit/core/blob/main/UPGRADING.md)
for a structured overview of the changes.*

##### ⚛️ MQT Core IR

- 🎨 Reorganize QDMI Codebase (backport
[#&#8203;1444](https://redirect.github.com/munich-quantum-toolkit/core/issues/1444))
([#&#8203;1449](https://redirect.github.com/munich-quantum-toolkit/core/pull/1449))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 🐉 MQT Core MLIR

- 🔧 Allow C++ standards newer than 20 (backport
[#&#8203;1480](https://redirect.github.com/munich-quantum-toolkit/core/issues/1480))
([#&#8203;1482](https://redirect.github.com/munich-quantum-toolkit/core/pull/1482))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 🐲 MQT Core QIR

- ♻️ Use `llc` instead of random `clang` for compiling QIR test circuits
to improve robustness and handle opaque pointers correctly across LLVM
versions (backport
[#&#8203;1447](https://redirect.github.com/munich-quantum-toolkit/core/issues/1447))
([#&#8203;1450](https://redirect.github.com/munich-quantum-toolkit/core/pull/1450))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 🚀 Features and Enhancements

- 🎨 Reorganize QDMI Codebase (backport
[#&#8203;1444](https://redirect.github.com/munich-quantum-toolkit/core/issues/1444))
([#&#8203;1449](https://redirect.github.com/munich-quantum-toolkit/core/pull/1449))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 🐛 Bug Fixes

- 🔧 Allow C++ standards newer than 20 (backport
[#&#8203;1480](https://redirect.github.com/munich-quantum-toolkit/core/issues/1480))
([#&#8203;1482](https://redirect.github.com/munich-quantum-toolkit/core/pull/1482))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ♻️ Use `llc` instead of random `clang` for compiling QIR test circuits
to improve robustness and handle opaque pointers correctly across LLVM
versions (backport
[#&#8203;1447](https://redirect.github.com/munich-quantum-toolkit/core/issues/1447))
([#&#8203;1450](https://redirect.github.com/munich-quantum-toolkit/core/pull/1450))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 📄 Documentation

- 🔖 Prepare release of `v3.4.1`
([#&#8203;1495](https://redirect.github.com/munich-quantum-toolkit/core/pull/1495))
([**@&#8203;denialhaag**](https://redirect.github.com/denialhaag))
- 📝 Update templated files (backport
[#&#8203;1454](https://redirect.github.com/munich-quantum-toolkit/core/issues/1454))
([#&#8203;1457](https://redirect.github.com/munich-quantum-toolkit/core/pull/1457))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- 📝 Update templated files (backport
[#&#8203;1439](https://redirect.github.com/munich-quantum-toolkit/core/issues/1439))
([#&#8203;1448](https://redirect.github.com/munich-quantum-toolkit/core/pull/1448))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 🤖 CI

- 👷 Improve `stubs` session (backport
[#&#8203;1461](https://redirect.github.com/munich-quantum-toolkit/core/issues/1461))
([#&#8203;1462](https://redirect.github.com/munich-quantum-toolkit/core/pull/1462))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️ Update external dependencies and prek checks (backport
[#&#8203;1453](https://redirect.github.com/munich-quantum-toolkit/core/issues/1453))
([#&#8203;1455](https://redirect.github.com/munich-quantum-toolkit/core/pull/1455))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

##### 🧹 Code Quality

- 🔙 Backport switch from mypy to ty
([#&#8203;1451](https://redirect.github.com/munich-quantum-toolkit/core/pull/1451))
([**@&#8203;burgholzer**](https://redirect.github.com/burgholzer))

##### ⬆️ Dependencies

<details>
<summary>11 changes</summary>

- ⬆️🪝 Update patch versions (backport
[#&#8203;1493](https://redirect.github.com/munich-quantum-toolkit/core/issues/1493))
([#&#8203;1494](https://redirect.github.com/munich-quantum-toolkit/core/pull/1494))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️ Update `nanobind` to 2.11.0 (backport
[#&#8203;1481](https://redirect.github.com/munich-quantum-toolkit/core/issues/1481))
([#&#8203;1488](https://redirect.github.com/munich-quantum-toolkit/core/pull/1488))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️👨‍💻 Update actions/attest-build-provenance action to v3.2.0
(backport
[#&#8203;1491](https://redirect.github.com/munich-quantum-toolkit/core/issues/1491))
([#&#8203;1492](https://redirect.github.com/munich-quantum-toolkit/core/pull/1492))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️🔒️ Lock file maintenance (backport
[#&#8203;1478](https://redirect.github.com/munich-quantum-toolkit/core/issues/1478))
([#&#8203;1490](https://redirect.github.com/munich-quantum-toolkit/core/pull/1490))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️👨‍💻 Update patch versions (backport
[#&#8203;1476](https://redirect.github.com/munich-quantum-toolkit/core/issues/1476))
([#&#8203;1489](https://redirect.github.com/munich-quantum-toolkit/core/pull/1489))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️🔒️ Lock file maintenance (backport
[#&#8203;1473](https://redirect.github.com/munich-quantum-toolkit/core/issues/1473))
([#&#8203;1486](https://redirect.github.com/munich-quantum-toolkit/core/pull/1486))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️🪝 Update patch versions (backport
[#&#8203;1467](https://redirect.github.com/munich-quantum-toolkit/core/issues/1467))
([#&#8203;1484](https://redirect.github.com/munich-quantum-toolkit/core/pull/1484))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️👨‍💻 Update release-drafter/release-drafter action to v6.2.0
(backport
[#&#8203;1477](https://redirect.github.com/munich-quantum-toolkit/core/issues/1477))
([#&#8203;1487](https://redirect.github.com/munich-quantum-toolkit/core/pull/1487))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️🪝 Update pre-commit hook black to v26 (backport
[#&#8203;1469](https://redirect.github.com/munich-quantum-toolkit/core/issues/1469))
([#&#8203;1485](https://redirect.github.com/munich-quantum-toolkit/core/pull/1485))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️🪝 Update pre-commit hook rbubley/mirrors-prettier to v3.8.0
(backport
[#&#8203;1468](https://redirect.github.com/munich-quantum-toolkit/core/issues/1468))
([#&#8203;1483](https://redirect.github.com/munich-quantum-toolkit/core/pull/1483))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))
- ⬆️ Update external dependencies and prek checks (backport
[#&#8203;1453](https://redirect.github.com/munich-quantum-toolkit/core/issues/1453))
([#&#8203;1455](https://redirect.github.com/munich-quantum-toolkit/core/pull/1455))
(\[**@&#8203;[mergify\[bot\]](https://redirect.github.com/apps/mergify)**]\(<https://github.com/[mergify[bot>]]\(<https://github.com/apps/mergify>)))

</details>

**Full Changelog**:
<munich-quantum-toolkit/core@v3.4.0...v3.4.1>

</details>

<details>
<summary>python-jsonschema/check-jsonschema
(python-jsonschema/check-jsonschema)</summary>

###
[`v0.36.1`](https://redirect.github.com/python-jsonschema/check-jsonschema/blob/HEAD/CHANGELOG.rst#0361)

[Compare
Source](https://redirect.github.com/python-jsonschema/check-jsonschema/compare/0.36.0...0.36.1)

- Update vendored schemas: buildkite, circle-ci, dependabot,
github-issue-forms,
github-workflows, gitlab-ci, mergify, readthedocs, renovate, snapcraft,
taskfile
  (2026-01-25)

</details>

<details>
<summary>astral-sh/ty (ty)</summary>

###
[`v0.0.14`](https://redirect.github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0014)

[Compare
Source](https://redirect.github.com/astral-sh/ty/compare/0.0.13...0.0.14)

Released on 2026-01-26.

##### Bug fixes

- Consider keyword arguments when unpacking a variadic argument
([#&#8203;22796](https://redirect.github.com/astral-sh/ruff/pull/22796))
- Fix binary operator false-positive for constrained TypeVars
([#&#8203;22782](https://redirect.github.com/astral-sh/ruff/pull/22782))
- Fix docstring rendering for literal blocks after doctests
([#&#8203;22676](https://redirect.github.com/astral-sh/ruff/pull/22676))
- Fix false-positive `unsupported-operator` for "symmetric" TypeVars
([#&#8203;22756](https://redirect.github.com/astral-sh/ruff/pull/22756))
- Fix panic when overriding a final method using an assignment
([#&#8203;22831](https://redirect.github.com/astral-sh/ruff/pull/22831))
- Fix unary operator false-positive for constrained TypeVars
([#&#8203;22783](https://redirect.github.com/astral-sh/ruff/pull/22783))
- Fix generic functions with a generic (ParamSpec) decorator
([#&#8203;22544](https://redirect.github.com/astral-sh/ruff/pull/22544))
- Fix `memo.changed_at` assertion panics
([#&#8203;22498](https://redirect.github.com/astral-sh/ruff/pull/22498))

##### LSP server

- Look up attributes on metaclasses for Go to Definition
([#&#8203;22758](https://redirect.github.com/astral-sh/ruff/pull/22758))
- Suppress type inlay hints for leading-underscore assignments
([#&#8203;22855](https://redirect.github.com/astral-sh/ruff/pull/22855))

##### Configuration

- Add `allowed-unresolved-imports` setting
([#&#8203;22800](https://redirect.github.com/astral-sh/ruff/pull/22800))

##### Other changes

- Add `assert-type-unspellable-subtype` diagnostic, for failed
`assert_type()` where the actual type is a subtype of the named type
that can't be spelled in a type expression
([#&#8203;22815](https://redirect.github.com/astral-sh/ruff/pull/22815))
- Add a new `empty-body` return code for functions with stub bodies that
have non-`None` return annotations
([#&#8203;22846](https://redirect.github.com/astral-sh/ruff/pull/22846))
- Add diagnostic disambiguation for different type aliases with the same
name
([#&#8203;22852](https://redirect.github.com/astral-sh/ruff/pull/22852))
- Add support for dict literals and dict() calls as default values for
parameters with TypedDict types
([#&#8203;22161](https://redirect.github.com/astral-sh/ruff/pull/22161))
- Add support for subscripts on intersections
([#&#8203;22654](https://redirect.github.com/astral-sh/ruff/pull/22654))
- Avoid duplicate syntax errors for `await` outside functions
([#&#8203;22826](https://redirect.github.com/astral-sh/ruff/pull/22826))
- Emit an error if the same type parameter appears more than once in a
`Generic[]` subscript
([#&#8203;22738](https://redirect.github.com/astral-sh/ruff/pull/22738))
- Emit diagnostic for unimplemented abstract method on
[@&#8203;final](https://redirect.github.com/final) class
([#&#8203;22753](https://redirect.github.com/astral-sh/ruff/pull/22753))
- Fix GitLab Code Quality output format for empty diagnostics
([#&#8203;22833](https://redirect.github.com/astral-sh/ruff/pull/22833))
- Fix assignment in decorated method causing `Unknown` fallback
([#&#8203;22778](https://redirect.github.com/astral-sh/ruff/pull/22778))
- Fix false negative when using a non-runtime-checkable protocol in a
`match` class pattern
([#&#8203;22836](https://redirect.github.com/astral-sh/ruff/pull/22836))
- Improve completion rankings for raise-from/except contexts
([#&#8203;22775](https://redirect.github.com/astral-sh/ruff/pull/22775))
- Improve invalid assignment diagnostics with type context
([#&#8203;22643](https://redirect.github.com/astral-sh/ruff/pull/22643))
- Improve support for kwarg splats in dictionary literals
([#&#8203;22781](https://redirect.github.com/astral-sh/ruff/pull/22781))
- Infer `TypedDict` types with >=1 required key as being always truthy
([#&#8203;22808](https://redirect.github.com/astral-sh/ruff/pull/22808))
- Point to an overload with an invalid `@final` decoator when emitting
`invalid-overload` errors for invalid `@final` decorators
([#&#8203;22812](https://redirect.github.com/astral-sh/ruff/pull/22812))
- Require both `*args` and `**kwargs` when calling a `ParamSpec`
callable
([#&#8203;22820](https://redirect.github.com/astral-sh/ruff/pull/22820))
- Stricter validation of `TypedDict` definitions
([#&#8203;22811](https://redirect.github.com/astral-sh/ruff/pull/22811))
- Support recursive and stringified annotations in functional
`typing.NamedTuple`s
([#&#8203;22718](https://redirect.github.com/astral-sh/ruff/pull/22718))
- Support solving generics involving PEP 695 type aliases
([#&#8203;22678](https://redirect.github.com/astral-sh/ruff/pull/22678))
- Use a more lenient fallback type for failed `namedtuple()` and
`NamedTuple` calls
([#&#8203;22765](https://redirect.github.com/astral-sh/ruff/pull/22765))
- Use type context from augmented assignment dunder calls
([#&#8203;22540](https://redirect.github.com/astral-sh/ruff/pull/22540))
- Check that starred arguments in function calls are iterable
([#&#8203;22805](https://redirect.github.com/astral-sh/ruff/pull/22805))

##### Contributors

- [@&#8203;AlexWaygood](https://redirect.github.com/AlexWaygood)
- [@&#8203;maifeeulasad](https://redirect.github.com/maifeeulasad)
- [@&#8203;RasmusNygren](https://redirect.github.com/RasmusNygren)
- [@&#8203;ntBre](https://redirect.github.com/ntBre)
- [@&#8203;Imbuzi](https://redirect.github.com/Imbuzi)
- [@&#8203;dhruvmanila](https://redirect.github.com/dhruvmanila)
- [@&#8203;ibraheemdev](https://redirect.github.com/ibraheemdev)
- [@&#8203;carljm](https://redirect.github.com/carljm)
- [@&#8203;Hugo-Polloli](https://redirect.github.com/Hugo-Polloli)
- [@&#8203;charliermarsh](https://redirect.github.com/charliermarsh)
- [@&#8203;MichaReiser](https://redirect.github.com/MichaReiser)
- [@&#8203;bxff](https://redirect.github.com/bxff)
- [@&#8203;felixscherz](https://redirect.github.com/felixscherz)
- [@&#8203;denyszhak](https://redirect.github.com/denyszhak)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekend" (UTC), Automerge - At
any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi4xIiwidXBkYXRlZEluVmVyIjoiNDIuOTIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHJlLWNvbW1pdCIsInB5dGhvbiJdfQ==-->

---------

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Haag <121057143+denialhaag@users.noreply.github.com>
This pull request updates the
[munich-quantum-toolkit/core](https://github.com/munich-quantum-toolkit/core)
dependency from
munich-quantum-toolkit/core@6bcc01e
(version v3.4.0) to
munich-quantum-toolkit/core@8747a89
(version v3.4.1).

**Full Changelog**:
munich-quantum-toolkit/core@6bcc01e...8747a89

---------

Co-authored-by: mqt-app[bot] <219534693+mqt-app[bot]@users.noreply.github.com>
Co-authored-by: Daniel Haag <121057143+denialhaag@users.noreply.github.com>
…ch-quantum-toolkit#929)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[astral-sh/ruff-pre-commit](https://redirect.github.com/astral-sh/ruff-pre-commit)
| repository | minor | `v0.14.14` → `v0.15.0` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://redirect.github.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>astral-sh/ruff-pre-commit (astral-sh/ruff-pre-commit)</summary>

###
[`v0.15.0`](https://redirect.github.com/astral-sh/ruff-pre-commit/releases/tag/v0.15.0)

[Compare
Source](https://redirect.github.com/astral-sh/ruff-pre-commit/compare/v0.14.14...v0.15.0)

See: <https://github.com/astral-sh/ruff/releases/tag/0.15.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekend" (UTC), Automerge - At
any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHJlLWNvbW1pdCJdfQ==-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [ty](https://redirect.github.com/astral-sh/ty)
([changelog](https://redirect.github.com/astral-sh/ty/blob/main/CHANGELOG.md))
| `==0.0.14` → `==0.0.15` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/ty/0.0.15?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ty/0.0.14/0.0.15?slim=true)
|

---

### Release Notes

<details>
<summary>astral-sh/ty (ty)</summary>

###
[`v0.0.15`](https://redirect.github.com/astral-sh/ty/blob/HEAD/CHANGELOG.md#0015)

[Compare
Source](https://redirect.github.com/astral-sh/ty/compare/0.0.14...0.0.15)

Released on 2026-02-04.

##### Bug fixes

- Add support for resolving imports of packages installed into
Debian/Ubuntu `dist-packages` directories
([#&#8203;22466](https://redirect.github.com/astral-sh/ruff/pull/22466))
- Avoid `not-iterable` false positives when iterating over an instance
of an intersection type with only negated elements
([#&#8203;22089](https://redirect.github.com/astral-sh/ruff/pull/22089))
- Fix support for stringized annotations in very large files
([#&#8203;22913](https://redirect.github.com/astral-sh/ruff/pull/22913))
- Don't emit Liskov diagnostics for methods with mangled names
([#&#8203;23062](https://redirect.github.com/astral-sh/ruff/pull/23062))
- Enforce that a `Final` symbol cannot be reassigned even after a
conditional binding
([#&#8203;22986](https://redirect.github.com/astral-sh/ruff/pull/22986))
- Fix TypedDict construction from existing TypedDict values
([#&#8203;22904](https://redirect.github.com/astral-sh/ruff/pull/22904))
- Fix `Self` resolution for classes nested within methods
([#&#8203;22964](https://redirect.github.com/astral-sh/ruff/pull/22964))
- Fix bidirectional inference with PEP 695 union type aliases
([#&#8203;22988](https://redirect.github.com/astral-sh/ruff/pull/22988))
- Fix edge-case bugs when narrowing tagged unions in `match` statements
([#&#8203;22870](https://redirect.github.com/astral-sh/ruff/pull/22870))
- Fix false-positive diagnostics when iterating over an instance of an
intersection that includes a TypeVar of which the upper bound is a union
where the union includes a non-iterable type
([#&#8203;22117](https://redirect.github.com/astral-sh/ruff/pull/22117))
- Fix lookup of `__contains__` to respect descriptors
([#&#8203;23056](https://redirect.github.com/astral-sh/ruff/pull/23056))
- Fix narrowing of `nonlocal` variables with conditional assignments
([#&#8203;22966](https://redirect.github.com/astral-sh/ruff/pull/22966))
- Fix several bugs that could affect `NewType`s of `NewType`s of `float`
([#&#8203;22997](https://redirect.github.com/astral-sh/ruff/pull/22997))
- Fix several type narrowing bugs involving PEP-695 type aliases
([#&#8203;22894](https://redirect.github.com/astral-sh/ruff/pull/22894))
- Fix spurious query cycles in decorated functions with parameter
defaults, for improved performance and improved determinism
([#&#8203;23014](https://redirect.github.com/astral-sh/ruff/pull/23014))
- Fix unary and comparison operators for TypeVars with union bounds
([#&#8203;22925](https://redirect.github.com/astral-sh/ruff/pull/22925))
- Understand functions as method descriptors even if they are decorated
with a decorator annotated as returning a PEP-695 alias to a `Callable`
type
([#&#8203;22902](https://redirect.github.com/astral-sh/ruff/pull/22902))
- `dataclass_transform`: Fix visibility of field specifiers when models
are nested inside methods
([#&#8203;23069](https://redirect.github.com/astral-sh/ruff/pull/23069))

##### LSP server

- Fix hover showing `Unknown` for bare `Final` instance attributes
([#&#8203;23003](https://redirect.github.com/astral-sh/ruff/pull/23003))
- Improve support for goto-type, goto-declaration, hover, and
highlighting of string annotations
([#&#8203;22878](https://redirect.github.com/astral-sh/ruff/pull/22878))
- Include setters and deleters when renaming properties
([#&#8203;22999](https://redirect.github.com/astral-sh/ruff/pull/22999))
- Show type qualifiers like `Final` in on-hover hints
([#&#8203;23005](https://redirect.github.com/astral-sh/ruff/pull/23005))

##### Configuration

- Add new `unused-type-ignore-comment` rule
([#&#8203;22790](https://redirect.github.com/astral-sh/ruff/pull/22790))
- Add a mechanism to ignore/warn/select all rules
([#&#8203;22832](https://redirect.github.com/astral-sh/ruff/pull/22832))
- Support multiple workspace folders in a single ty LSP server instance
([#&#8203;22953](https://redirect.github.com/astral-sh/ruff/pull/22953))
- Only add `./src` as a search path if `./src/__init__.py(i)` does not
exist
([#&#8203;22851](https://redirect.github.com/astral-sh/ruff/pull/22851))

##### Type checking

- Add a diagnostic detecting if a variable is declared as `Final` but
never has any bindings
([#&#8203;23001](https://redirect.github.com/astral-sh/ruff/pull/23001))
- Add a diagnostic detecting overridden comparison dunder methods on
`order=True` dataclasses
([#&#8203;22689](https://redirect.github.com/astral-sh/ruff/pull/22689))
- Add a hint to `invalid-argument-type` and `invalid-assignment`
diagnostics if a variable is annotated with a type from the `numbers`
module
([#&#8203;22931](https://redirect.github.com/astral-sh/ruff/pull/22931),
[#&#8203;22938](https://redirect.github.com/astral-sh/ruff/pull/22938))
- Add diagnostic hint on `unresolved-reference` to suggest using "list"
instead of "List"
([#&#8203;22827](https://redirect.github.com/astral-sh/ruff/pull/22827))
- Add new diagnostic for invalid dataclass field orders
([#&#8203;19825](https://redirect.github.com/astral-sh/ruff/pull/19825))
- Allow a subclass method with a positional-only parameter to override a
superclass method without that parameter if the parameter in the
subclass method has a default value
([#&#8203;23037](https://redirect.github.com/astral-sh/ruff/pull/23037))
- Allow self-referential imports outside the global scope
([#&#8203;22963](https://redirect.github.com/astral-sh/ruff/pull/22963))
- Ban `...` in odd places inside tuple specializations
([#&#8203;22889](https://redirect.github.com/astral-sh/ruff/pull/22889))
- Ban `Required`, `NotRequired` and `ReadOnly` in parameter annotations
([#&#8203;22888](https://redirect.github.com/astral-sh/ruff/pull/22888))
- Ban legacy `TypeVar` bounds or constraints from containing type
variables
([#&#8203;22949](https://redirect.github.com/astral-sh/ruff/pull/22949))
- Ban multiple unpacked variadic tuples in a `tuple` specialization
([#&#8203;22884](https://redirect.github.com/astral-sh/ruff/pull/22884))
- Detect generic `Callable`s in the return type of function signatures
([#&#8203;22954](https://redirect.github.com/astral-sh/ruff/pull/22954))
- Detect invalid `isinstance()` and `issubclass()` calls against
`TypedDict` classes
([#&#8203;22887](https://redirect.github.com/astral-sh/ruff/pull/22887))
- Detect invalid `issubclass()` calls against `Protocol` classes with
non-method members
([#&#8203;22896](https://redirect.github.com/astral-sh/ruff/pull/22896))
- Detect invalid attempts to subclass `Protocol[]` and `Generic[]`
simultaneously
([#&#8203;22948](https://redirect.github.com/astral-sh/ruff/pull/22948))
- Emit a diagnostic on incorrect applications of the legacy convention
for specifying positional-only parameters
([#&#8203;22943](https://redirect.github.com/astral-sh/ruff/pull/22943))
- Emit an error if a `TypeVarTuple` is used to subscript `Generic` or
`Protocol` without being unpacked
([#&#8203;22952](https://redirect.github.com/astral-sh/ruff/pull/22952))
- Fallback to metaclass `__getattr__` or `__getattribute__` when looking
up attributes on class objects
([#&#8203;22985](https://redirect.github.com/astral-sh/ruff/pull/22985))
- Fix a bug where an overridden type in a dataclass subclass would not
be respected if the dataclass subclass field had a default value but the
superclass field did not
([#&#8203;22965](https://redirect.github.com/astral-sh/ruff/pull/22965))
- Improve bidirectional type inference involving PEP-695 type aliases
([#&#8203;22989](https://redirect.github.com/astral-sh/ruff/pull/22989))
- Improve detection of invalid `NewType`s with generic bases
([#&#8203;22961](https://redirect.github.com/astral-sh/ruff/pull/22961))
- Improve reachability analysis when evaluating the truthiness of
expressions that involve variables that may not be bound in all code
paths
([#&#8203;22971](https://redirect.github.com/astral-sh/ruff/pull/22971))
- Improve the error message if `**` is used with a non-mapping in the
context of a call to an overloaded function
([#&#8203;22921](https://redirect.github.com/astral-sh/ruff/pull/22921))
- Infer `ParamSpec` from class constructors for callable protocols
([#&#8203;22853](https://redirect.github.com/astral-sh/ruff/pull/22853))
- Move the location of some `invalid-overload` diagnostics
([#&#8203;22933](https://redirect.github.com/astral-sh/ruff/pull/22933))
- Point to an overload with an invalid `@final` decorator when emitting
`invalid-overload` errors for invalid `@final` decorators
([#&#8203;22893](https://redirect.github.com/astral-sh/ruff/pull/22893))
- Avoid false positives when iterating over an instance of an
intersection with only negated elements by preserving "pure negation"
types in descriptor lookups
([#&#8203;22907](https://redirect.github.com/astral-sh/ruff/pull/22907))
- Promote `Literal` types when inferring elements for very large
unannotated tuples, for improved performance
([#&#8203;22841](https://redirect.github.com/astral-sh/ruff/pull/22841))
- Recognize functions with stub bodies in `Protocol` classes as
implicitly abstract
([#&#8203;22838](https://redirect.github.com/astral-sh/ruff/pull/22838))
- Reduce false positives involving heterogeneous dicts by tracking
dictionary literal keys as individual places
([#&#8203;22882](https://redirect.github.com/astral-sh/ruff/pull/22882))
- Reduce false positives when subscripting classes generic over
`TypeVarTuple`s
([#&#8203;22950](https://redirect.github.com/astral-sh/ruff/pull/22950))
- Remove special handling for `Any()` in `match` class patterns
([#&#8203;23011](https://redirect.github.com/astral-sh/ruff/pull/23011))
- Support `type[None]` in type expressions
([#&#8203;22892](https://redirect.github.com/astral-sh/ruff/pull/22892))
- Support legacy namespace packages declared using
`pkg_resources.declare_namespace`
([#&#8203;22987](https://redirect.github.com/astral-sh/ruff/pull/22987))
- Sync vendored typeshed stubs
([#&#8203;23006](https://redirect.github.com/astral-sh/ruff/pull/23006)),
[Typeshed
diff](https://redirect.github.com/python/typeshed/compare/cd8b26b0ceef26cd84ab614088140d48680ac7f7...fa659b1def704dea3dc8e25c7857b23eac69df4d)
- Validate signatures of dataclass `__post_init__` methods
([#&#8203;22730](https://redirect.github.com/astral-sh/ruff/pull/22730))

##### Contributors

- [@&#8203;charliermarsh](https://redirect.github.com/charliermarsh)
- [@&#8203;stefanvanburen](https://redirect.github.com/stefanvanburen)
- [@&#8203;ibraheemdev](https://redirect.github.com/ibraheemdev)
-
[@&#8203;abhijeetbodas2001](https://redirect.github.com/abhijeetbodas2001)
- [@&#8203;MichaReiser](https://redirect.github.com/MichaReiser)
- [@&#8203;dcreager](https://redirect.github.com/dcreager)
- [@&#8203;PrettyWood](https://redirect.github.com/PrettyWood)
- [@&#8203;sharkdp](https://redirect.github.com/sharkdp)
- [@&#8203;oconnor663](https://redirect.github.com/oconnor663)
- [@&#8203;Feiyang472](https://redirect.github.com/Feiyang472)
- [@&#8203;denyszhak](https://redirect.github.com/denyszhak)
- [@&#8203;mtshiba](https://redirect.github.com/mtshiba)
- [@&#8203;AlexWaygood](https://redirect.github.com/AlexWaygood)
- [@&#8203;11happy](https://redirect.github.com/11happy)
- [@&#8203;BurntSushi](https://redirect.github.com/BurntSushi)
- [@&#8203;carljm](https://redirect.github.com/carljm)
- [@&#8203;Gankra](https://redirect.github.com/Gankra)
- [@&#8203;MentalMegalodon](https://redirect.github.com/MentalMegalodon)
- [@&#8203;thejchap](https://redirect.github.com/thejchap)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekend" (UTC), Automerge - At
any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHl0aG9uIl19-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHl0aG9uIl19-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…-quantum-toolkit#928)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[adhtruong/mirrors-typos](https://redirect.github.com/adhtruong/mirrors-typos)
| repository | minor | `v1.42.3` → `v1.43.2` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://redirect.github.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>adhtruong/mirrors-typos (adhtruong/mirrors-typos)</summary>

###
[`v1.43.2`](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.43.1...v1.43.2)

[Compare
Source](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.43.1...v1.43.2)

###
[`v1.43.1`](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.43.0...v1.43.1)

[Compare
Source](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.43.0...v1.43.1)

###
[`v1.43.0`](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.42.3...v1.43.0)

[Compare
Source](https://redirect.github.com/adhtruong/mirrors-typos/compare/v1.42.3...v1.43.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekend" (UTC), Automerge - At
any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHJlLWNvbW1pdCJdfQ==-->

---------

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Daniel Haag <121057143+denialhaag@users.noreply.github.com>
…o v2026.02.15 (munich-quantum-toolkit#934)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[henryiii/validate-pyproject-schema-store](https://redirect.github.com/henryiii/validate-pyproject-schema-store)
| repository | minor | `2026.01.22` → `2026.02.15` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://redirect.github.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>henryiii/validate-pyproject-schema-store
(henryiii/validate-pyproject-schema-store)</summary>

###
[`v2026.02.15`](https://redirect.github.com/henryiii/validate-pyproject-schema-store/compare/2026.01.22...2026.02.15)

[Compare
Source](https://redirect.github.com/henryiii/validate-pyproject-schema-store/compare/2026.01.22...2026.02.15)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekend" (UTC), Automerge - At
any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My44LjUiLCJ1cGRhdGVkSW5WZXIiOiI0My44LjUiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyIsInByZS1jb21taXQiXX0=-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/qmap).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My44LjUiLCJ1cGRhdGVkSW5WZXIiOiI0My44LjUiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyIsInB5dGhvbiJdfQ==-->

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
# Conflicts:
#	src/na/zoned/decomposer/NativeGateDecomposer.cpp
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Yannick Stade <100073938+ystade@users.noreply.github.com>
Copy link
Collaborator

@ystade ystade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cs-tum-st Thanks a lot for this contribution. Especially, the non-test code is very clean. I just pushed some minor simplifications. Feel free to check them. I think there are only two things that still need to be done:

  1. There are some comments formulated as questions in the source code. They should not remain there. If they are resolved, just remove them; if not, implement the necessary code to resolve them.
  2. In the test file, I left some comments on how the tests can still be improved. Please, also check whether the comments also apply in other places in the testing file. I have commented on each improvement potential just once.

After you have finished this, please tag @burgholzer for a review. He wants to have a last check before this can be merged.

Comment on lines +124 to +125
theta = qc::PI; // or § PI if sin(theta/2)=-1... Relevant? Or is the -1=
// exp(i*pi) just global phase
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cs-tum-st Have you seen this comment? I think, this should still be addressed.

Comment on lines +135 to +139
} else {
// This should never happen! Exception??
phi = 0.;
lambda = 0.;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would correspond to identity right? Since, there might be identities, this is a valid case and I would remove the comment. Otherwise, throw an exception.

"rydberg_range": [[[5, 70], [55, 110]]]
})";

class DecomposerTest : public ::testing::Test {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class DecomposerTest : public ::testing::Test {
class NativeGateDecomposerTest : public ::testing::Test {

// Test Translation of : S gate, Sdg Gate, T-gate, t dg gate, U2, RY, Y, Vdg,
// SX, Sxdg, Unrecognized, H _>Just do them all?

TEST(Test, ZRotGateTranslationTest) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
TEST(Test, ZRotGateTranslationTest) {
TEST(NativeGateDecomposerTest, ZRotGateTranslationTest) {

The first part should refer to the class that is tested. I do not know whether this causes a conflict because the test class has the same name. If so, choose a different name but the connection to the NativeGateDecomposer should still be clear.

::testing::DoubleNear(-0.5 * std::sqrt(2 - std::sqrt(2)), epsilon)));
}

TEST(Test, XYRotGateTranslationTest) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above. Whatever you chose as the name for the test above, substitute Test also here with it.

Comment on lines +188 to +190
qc::fp p = qc::PI_2;
qc::fp t = qc::PI_4;
qc::fp l = qc::PI_4;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
qc::fp p = qc::PI_2;
qc::fp t = qc::PI_4;
qc::fp l = qc::PI_4;
const auto p = qc::PI_2;
const auto t = qc::PI_4;
const auto l = qc::PI_4;

Not necessary, but nice for convenience.

Comment on lines +196 to +210
(std::cos(p / 2) * std::cos(t / 2) * std::cos(l / 2)) -
(std::sin(p / 2) * std::cos(t / 2) * std::sin(l / 2)),
epsilon),
::testing::DoubleNear(
std::cos(p / 2) * std::sin(t / 2) * std::sin(l / 2) -
std::sin(p / 2) * std::cos(l / 2) * std::sin(t / 2),
epsilon),
::testing::DoubleNear(
std::cos(p / 2) * std::sin(t / 2) * std::cos(l / 2) +
std::sin(p / 2) * std::sin(l / 2) * std::sin(t / 2),
epsilon),
::testing::DoubleNear(
std::cos(p / 2) * std::cos(t / 2) * std::sin(l / 2) +
std::sin(p / 2) * std::cos(l / 2) * std::cos(t / 2),
epsilon)));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these calculations copied over from the actual implementation of the function? If so, or also in general, for tests, I think it would be better to actually write out the resulting floating point values.

Comment on lines +268 to +270
std::array<qc::fp, 4> q1 = {cos(qc::PI_4), 0, 0, sin(qc::PI_4)};
std::array<qc::fp, 4> q2 = {cos(qc::PI_2), 0, sin(qc::PI_2), 0};
std::array<qc::fp, 4> q12 = NativeGateDecomposer::combineQuaternions(q1, q2);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
std::array<qc::fp, 4> q1 = {cos(qc::PI_4), 0, 0, sin(qc::PI_4)};
std::array<qc::fp, 4> q2 = {cos(qc::PI_2), 0, sin(qc::PI_2), 0};
std::array<qc::fp, 4> q12 = NativeGateDecomposer::combineQuaternions(q1, q2);
std::array<qc::fp, 4> q1{cos(qc::PI_4), 0, 0, sin(qc::PI_4)};
std::array<qc::fp, 4> q2{cos(qc::PI_2), 0, sin(qc::PI_2), 0};
const auto& q12 = NativeGateDecomposer::combineQuaternions(q1, q2);

Some simplifications that can also be applied further below.

Comment on lines +305 to +307
const qc::Operation* op = new qc::StandardOperation(0, qc::X);
std::array<qc::fp, 4> q = NativeGateDecomposer::convertGateToQuaternion(
std::reference_wrapper<const qc::Operation>(*op));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That seems overkill to me. Is the following possible? If the pointer is really needed, consider using std::unique_ptr.

Suggested change
const qc::Operation* op = new qc::StandardOperation(0, qc::X);
std::array<qc::fp, 4> q = NativeGateDecomposer::convertGateToQuaternion(
std::reference_wrapper<const qc::Operation>(*op));
const std::unique_ptr<qc::Operation> op = std::make_unique<qc::StandardOperation>(0, qc::X);
std::array<qc::fp, 4> q = NativeGateDecomposer::convertGateToQuaternion(
std::reference_wrapper<const qc::Operation>(*op));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c++ Anything related to C++ code feature New feature or request usability Anything related to usability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants