Repository navigation
Observations instead of taps, and the QPSK of the standards - #44
Merged
Merged
Conversation
An observation is simply the output of a named mechanism, explicitly
retained for experimental analysis. It performs no computation and does
not alter the signal -- same shape, same dtype, dimensions never
reduced; power, SNR or SER stay with the metrics, applied to the
observation afterwards.
- Sequential(observations=["tx"]) declares what to retain;
chain.observation("tx") reads it back after the run
- observation names are the block names already used by set_params,
wiring and the profile table -- no new naming system
- renamed with it: tapped_ -> observed_, the "taps" key of graph() and
of the JSON export -> "observations", the "tapped" mermaid class ->
"observed"; wiring sources are now "observed automatically"
- an empty observations list retains nothing, so large batches and
fibre propagations pay only for what they declare
- the FIR sense of the word (filter taps, channel taps,
TappedDelayLine) is untouched
- vocabulary swept through the docstrings, CONVENTIONS.md,
ARCHITECTURE.md, README, tutorials, getting-started pages, examples
(figure titles regenerated), validation scripts and the tutorial
skill; tests/core/test_taps.py becomes test_chain_observations.py
One breaking-change window, no compatibility layer (D9): taps=/tap()
are gone.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
get_alphabet("PSK", 4) sampled the raw circle exp(2j*pi*m/4): points on
the axes, a constellation rotated by pi/4 from the QPSK of the
standards (3GPP, 802.11) and of every textbook figure. QPSK now sits on
the diagonals -- the same point set as QAM-4. BPSK and M >= 8 keep the
phase-0 convention. Rotation changes no error rate (mapper and demapper
share the alphabet, the noise is circular), but it removes the pi/4
surprise against any other tool, and the tx-PSK/rx-QAM mixing trap
whose points landed exactly on the decision boundaries.
The table pin of tests/core/test_alphabet.py now asserts the documented
relationship for this one deliberate deviation: built = historical
table * exp(j*pi/4), labelling untouched. The Gauss-Hermite accuracy
note of capacity.py is re-measured for the diagonal orientation
(1.9e-5 bit at 40 nodes -- the node grid is axis-aligned, so the
quadrature error is not rotation-invariant even though the capacity
is).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Alamouti and MIMO Monte-Carlo tables shift in the third digit (the same noise draws now land on rotated symbols) and the constellation figures turn by 45 degrees; both pages are re-pasted from one fresh run of their script. The MIMO cost block also catches up with the script's actual output -- all seven SNR points, ML and SD interleaved, with the title line -- where the page still showed a three-point grouped format from an earlier version. The PAPR and PDM pages are re-checked and unchanged: a global rotation moves neither an envelope nor the CMA+BPS round trip, and their pasted numbers reproduce to the digit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two changes, both closing gaps between what the library says and what the reader expects.
tapsbecomesobservationsThe retained-signal mechanism of
Sequentialis renamed after what it is: an observation is simply the output of a named mechanism, explicitly retained for experimental analysis. It performs no computation and does not alter the signal — same shape, same dtype, dimensions never reduced; power, SNR or SER stay with the metrics, applied to the observation afterwards.Sequential([...], observations=["tx"])declares what to retain;chain.observation("tx")reads it back after the run.set_params,wiringand the profile table — no new naming system.tapped_→observed_, the"taps"key ofgraph()and of the JSON export →"observations", thetappedmermaid class →observed; wiring sources are now "observed automatically".observationslist retains nothing, so large batches and fibre propagations pay only for what they declare.TappedDelayLine) is untouched.tests/core/test_taps.pybecomestest_chain_observations.py.One breaking-change window, no compatibility layer (D9):
taps=/tap()are gone.QPSK carries the pi/4 offset of the standards
get_alphabet("PSK", 4)sampled the raw circleexp(2j*pi*m/4): points on the axes, a constellation rotated by pi/4 from the QPSK of the standards (3GPP, 802.11) and of every textbook figure. QPSK now sits on the diagonals — the same point set as QAM-4. BPSK and M ≥ 8 keep the phase-0 convention.Rotation changes no error rate (mapper and demapper share the alphabet, the noise is circular), but it removes the pi/4 surprise against any other tool, and the tx-
PSK/rx-QAMmixing trap whose points landed exactly on the decision boundaries.tests/core/test_alphabet.pyasserts the one deliberate deviation as the relationship it is: built = table ×exp(j*pi/4), labelling untouched.capacity.pyis re-measured for the diagonal orientation (1.9e-5 bit at 40 nodes — the node grid is axis-aligned, so the quadrature error is not rotation-invariant even though the capacity is).Verification
ruff check .clean, pyright 0 errors,sphinx -Wclean🤖 Generated with Claude Code
https://claude.ai/code/session_01Pn2F8X4HZhS8fEJcL5enzw
Generated by Claude Code