From 8a301faf6dfc21dfe891ed8aa2c29238e8e4b161 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 15:56:24 +0000 Subject: [PATCH 1/5] Bump mistune from 3.1.4 to 3.2.1 in the uv group across 1 directory Bumps the uv group with 1 update in the / directory: [mistune](https://github.com/lepture/mistune). Updates `mistune` from 3.1.4 to 3.2.1 - [Release notes](https://github.com/lepture/mistune/releases) - [Changelog](https://github.com/lepture/mistune/blob/main/docs/changes.rst) - [Commits](https://github.com/lepture/mistune/compare/v3.1.4...v3.2.1) --- updated-dependencies: - dependency-name: mistune dependency-version: 3.2.1 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 50a11056e..15706c18f 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11, <3.15" resolution-markers = [ "python_full_version >= '3.14'", @@ -1442,11 +1442,11 @@ wheels = [ [[package]] name = "mistune" -version = "3.1.4" +version = "3.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload-time = "2025-08-29T07:20:43.594Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, ] [[package]] From ef4bdc4355781301ba4c5629e48cb359ac614642 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 15:56:33 +0000 Subject: [PATCH 2/5] Bump jupyter-server in the uv group across 1 directory Bumps the uv group with 1 update in the / directory: [jupyter-server](https://github.com/jupyter-server/jupyter_server). Updates `jupyter-server` from 2.17.0 to 2.18.0 - [Release notes](https://github.com/jupyter-server/jupyter_server/releases) - [Changelog](https://github.com/jupyter-server/jupyter_server/blob/main/CHANGELOG.md) - [Commits](https://github.com/jupyter-server/jupyter_server/compare/v2.17.0...v2.18.0) --- updated-dependencies: - dependency-name: jupyter-server dependency-version: 2.18.0 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 50a11056e..fc7b20151 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11, <3.15" resolution-markers = [ "python_full_version >= '3.14'", @@ -1090,7 +1090,7 @@ wheels = [ [[package]] name = "jupyter-server" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1113,9 +1113,9 @@ dependencies = [ { name = "traitlets" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/ec/9302cec1ccacdd33c1b1312ac31681c8975cae56c626d783ab49edf9c681/jupyter_server-2.18.0.tar.gz", hash = "sha256:568b27bce4320a53c3eebf1bdcbee9acf48a8ab7f66ec83d900ca9909d4fb770", size = 751152, upload-time = "2026-05-04T13:39:29.685Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, + { url = "https://files.pythonhosted.org/packages/cf/f9/050312d92072ddb9ce14c11171804c07435790c98d4350935a780d9e10c2/jupyter_server-2.18.0-py3-none-any.whl", hash = "sha256:69a5397a039d689da81a45955f9b23e95ee167f6d8a8d64372fb616f2aac650a", size = 391687, upload-time = "2026-05-04T13:39:27.549Z" }, ] [[package]] From 988b1f129913b1686b82d18b867f2d4775ba2419 Mon Sep 17 00:00:00 2001 From: Robert Hayek Date: Tue, 12 May 2026 14:20:04 -0500 Subject: [PATCH 3/5] Revert "Bump jupyter-server from 2.17.0 to 2.18.0 in the uv group across 1 directory" --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 04e5ce292..97184130d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.11, <3.15" resolution-markers = [ "python_full_version >= '3.14'", @@ -1090,7 +1090,7 @@ wheels = [ [[package]] name = "jupyter-server" -version = "2.18.0" +version = "2.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1113,9 +1113,9 @@ dependencies = [ { name = "traitlets" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/ec/9302cec1ccacdd33c1b1312ac31681c8975cae56c626d783ab49edf9c681/jupyter_server-2.18.0.tar.gz", hash = "sha256:568b27bce4320a53c3eebf1bdcbee9acf48a8ab7f66ec83d900ca9909d4fb770", size = 751152, upload-time = "2026-05-04T13:39:29.685Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/f9/050312d92072ddb9ce14c11171804c07435790c98d4350935a780d9e10c2/jupyter_server-2.18.0-py3-none-any.whl", hash = "sha256:69a5397a039d689da81a45955f9b23e95ee167f6d8a8d64372fb616f2aac650a", size = 391687, upload-time = "2026-05-04T13:39:27.549Z" }, + { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, ] [[package]] From 03df4439904e106d0830a2f8286efe634f2d8c9e Mon Sep 17 00:00:00 2001 From: Robert Hayek Date: Tue, 12 May 2026 14:22:35 -0500 Subject: [PATCH 4/5] Revert "Bump mistune from 3.1.4 to 3.2.1 in the uv group across 1 directory" --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 04e5ce292..fc7b20151 100644 --- a/uv.lock +++ b/uv.lock @@ -1442,11 +1442,11 @@ wheels = [ [[package]] name = "mistune" -version = "3.2.1" +version = "3.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload-time = "2025-08-29T07:20:43.594Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, ] [[package]] From d7041a328fd42c807e32b007b00ff19f89f7760c Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Thu, 21 May 2026 13:22:27 -0500 Subject: [PATCH 5/5] Fix dropped state collapse in FreeQuantumState.measure_multiple After projecting onto the chosen basis vector, measure_multiple wrote the post-measurement state to attributes that FreeQuantumState does not have: for state in entangled_list: state.quantum_state = new_state # should be .state state.entangled_photons = entangled_list # should be .entangled_states FreeQuantumState stores its vector in `state` and its partners in `entangled_states` (see the single-qubit `measure` method). Writing to the wrong names silently created unused attributes and left the actual quantum state uncollapsed: the entangled photons kept their pre-measurement superposition after measure_multiple. Assign the collapsed vector to `state` and update `entangled_states`, mirroring the single-qubit `measure` method. Adds a regression test that checks the state collapses to the measured basis vector. Co-Authored-By: Claude Opus 4.7 --- sequence/kernel/quantum_state.py | 11 ++++++----- tests/components/test_photon.py | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/sequence/kernel/quantum_state.py b/sequence/kernel/quantum_state.py index a5abcf8c8..a1374c66f 100644 --- a/sequence/kernel/quantum_state.py +++ b/sequence/kernel/quantum_state.py @@ -361,11 +361,12 @@ def measure_multiple(basis, states, rng: Generator): possible_results = arange(0, basis_dimension, 1) # result gives index of the basis vector that will be projected to res = rng.choice(possible_results, p=probabilities) - # project to new state, then reassign quantum state and entangled photons - new_state = new_states[res] - for state in entangled_list: - state.quantum_state = new_state - state.entangled_photons = entangled_list + # project to new state, then reassign quantum state and entangled list + new_state = tuple(new_states[res]) + for qs in entangled_list: + if qs is not None: + qs.state = new_state + qs.entangled_states = entangled_list return res diff --git a/tests/components/test_photon.py b/tests/components/test_photon.py index f564f3980..bd444d91c 100644 --- a/tests/components/test_photon.py +++ b/tests/components/test_photon.py @@ -80,6 +80,27 @@ def test_measure_multiple(): assert Photon.measure_multiple(basis, [photon1, photon2], rng) == 0 +def test_measure_multiple_collapses_state(): + """After measure_multiple, the shared FreeQuantumState must collapse to the + measured basis vector (and stay shared between the entangled photons).""" + tl = Timeline() + photon1 = Photon("p1", tl, quantum_state=(complex(2 ** -0.5), complex(2 ** -0.5))) + photon2 = Photon("p2", tl, quantum_state=(complex(2 ** -0.5), complex(2 ** -0.5))) + photon1.combine_state(photon2) + + basis = ((complex(1), complex(0), complex(0), complex(0)), + (complex(0), complex(1), complex(0), complex(0)), + (complex(0), complex(0), complex(1), complex(0)), + (complex(0), complex(0), complex(0), complex(1))) + + res = Photon.measure_multiple(basis, [photon1, photon2], np.random.default_rng(0)) + + expected = tuple(complex(1) if i == res else complex(0) for i in range(4)) + assert tuple(photon1.quantum_state.state) == expected, "state did not collapse to measured basis vector" + # both photons must keep sharing the same collapsed state object + assert photon1.quantum_state.state is photon2.quantum_state.state + + def test_add_loss(): tl = Timeline() photon = Photon("", tl, encoding_type=single_atom)