Skip to content

Commit 9d29177

Browse files
ehsun-shclaude
andcommitted
Rename the project to Maiman Studio
"OpenOptiSim" sat one letter away from OptiSystem, the commercial tool this project cites as its benchmark — a bad place to stand for something that argues its models from published literature rather than from a competitor. The architecture document flagged it and said to rename while renaming was still cheap; before the first public release, with no dependents and no published package, is exactly that moment. Theodore Maiman built the first working laser in 1960, so the name points at the physics instead of at anyone else's product. The rename goes all the way down rather than stopping at the display name: the Python package is `maiman`, project files are `.maiman`, and the schema key is `maiman_version`. Leaving `oosim` underneath would have meant carrying the old name in every import line and every saved file forever. Screenshots are regenerated so the README shows the wordmark that ships, and the GitHub repository is renamed to match; old links redirect. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 45ee535 commit 9d29177

68 files changed

Lines changed: 286 additions & 284 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

DESIGN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Design
22

3-
The visual and interaction record for OpenOptiSim's interface. It exists because
3+
The visual and interaction record for Maiman Studio's interface. It exists because
44
[`docs/ui-mockup.html`](docs/ui-mockup.html) is a *build*, and a build without a
55
written rationale is a set of numbers nobody can argue with later. Everything
66
here was decided against the audience and use scene in [PRODUCT.md](PRODUCT.md);

PRODUCT.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# OpenOptiSim — product context
1+
# Maiman Studio — product context
22

33
## What it is
44

@@ -46,14 +46,14 @@ constantly and any latency compounds.
4646
2. Edit component parameters with their real units visible.
4747
3. Run, and show progress on a run that takes seconds to minutes.
4848
4. Display results: eye diagram, spectrum, BER curves, sweep results.
49-
5. Open and save `.oosim` projects.
49+
5. Open and save `.maiman` projects.
5050
6. Sweep a parameter and plot the curve.
5151

5252
## Constraints that are already decided
5353

5454
* **The GUI is a client of the public Python API.** If a feature is not reachable from Python, it
5555
does not exist. The GUI gets no privileged access.
56-
* **The component palette is generated** from `oosim.manifests()`, never hand-written, so it
56+
* **The component palette is generated** from `maiman.manifests()`, never hand-written, so it
5757
cannot drift from what the engine actually offers.
5858
* **Result data is reduced in the engine**, never in the browser. An eye diagram arrives as a
5959
binned histogram of fixed size; the browser never receives a raw sample buffer.

README.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# OpenOptiSim
1+
# Maiman Studio
22

33
**An open-source, modular simulator for optical communication links and photonic systems.**
44

5-
[![CI](https://github.com/ehsun-sh/OpenOptisim/actions/workflows/ci.yml/badge.svg)](https://github.com/ehsun-sh/OpenOptisim/actions/workflows/ci.yml)
5+
[![CI](https://github.com/ehsun-sh/maiman-studio/actions/workflows/ci.yml/badge.svg)](https://github.com/ehsun-sh/maiman-studio/actions/workflows/ci.yml)
66
![status](https://img.shields.io/badge/status-pre--alpha-orange)
77
![license](https://img.shields.io/badge/license-Apache--2.0-blue)
88
![python](https://img.shields.io/badge/python-3.11%2B-blue)
@@ -49,7 +49,7 @@ that would let you press Run and get a new one. Open
4949
[`docs/ui-mockup.html`](docs/ui-mockup.html) in a browser to click through it, and
5050
[DESIGN.md](DESIGN.md) for why it looks like this.
5151

52-
![The OpenOptiSim schematic editor on its paper ground](docs/images/studio-paper.png)
52+
![The Maiman Studio schematic editor on its paper ground](docs/images/studio-paper.png)
5353

5454
It ships two grounds and defaults to paper, because a schematic is a document before it is a
5555
screen and its plots leave the tool for reports and papers. Graphite is one click away:
@@ -70,8 +70,8 @@ pip install -e ".[dev]" && pytest
7070
```
7171

7272
```python
73-
from oosim import SimulationContext, Graph
74-
from oosim.components import CWLaser, Combiner, Fiber, PowerMeter
73+
from maiman import SimulationContext, Graph
74+
from maiman.components import CWLaser, Combiner, Fiber, PowerMeter
7575

7676
ctx = SimulationContext(bit_rate=10e9, samples_per_symbol=16, sequence_length=64)
7777
g = Graph(ctx)
@@ -131,7 +131,7 @@ filter and analyzer all have to agree for that to hold; it is
131131
[a test](tests/test_ber.py), not a coincidence.
132132

133133
Both curves come from `sweep()`, and the same script writes the schematic to
134-
[`examples/ook_link.oosim`](examples/ook_link.oosim) — versioned JSON, diffable, runnable headless.
134+
[`examples/ook_link.maiman`](examples/ook_link.maiman) — versioned JSON, diffable, runnable headless.
135135

136136
### Coherent
137137

@@ -155,7 +155,7 @@ and never look back.
155155

156156
Nothing here is configured to come out right. The shot-noise-limited SNR is asserted against
157157
`R·P/(2qB)`, the counted symbol errors against
158-
[`ser_qam()`](src/oosim/modulation.py), and the modulator's 3 dB against `10·log10(2)`.
158+
[`ser_qam()`](src/maiman/modulation.py), and the modulator's 3 dB against `10·log10(2)`.
159159

160160
### What carrier recovery is for
161161

@@ -171,7 +171,7 @@ tellingly, **launching more power stops helping**:
171171

172172
Twelve dB of extra power buys 1.3 dB. Laser phase noise is a random walk, so it is not removable by
173173
subtracting a constant or a line, and it puts a ceiling on SNR that no power budget lifts.
174-
[`CarrierRecovery`](src/oosim/components/coherent.py) removes the ceiling using the blind phase
174+
[`CarrierRecovery`](src/maiman/components/coherent.py) removes the ceiling using the blind phase
175175
search of Pfau et al. Both halves of that claim are [asserted](tests/test_dsp.py) — the second
176176
would be meaningless without the first.
177177

@@ -245,7 +245,7 @@ rotation without equaliser with equaliser
245245

246246
Past a few degrees the unequalised branches are not degraded — they carry no recoverable data at
247247
all, because each is a *mixture* of both tributaries. The
248-
[butterfly equaliser](src/oosim/dsp.py) separates them blind, with no training sequence anywhere in
248+
[butterfly equaliser](src/maiman/dsp.py) separates them blind, with no training sequence anywhere in
249249
the link. Read the two end rows together: 90° is a clean swap rather than a mixture, so it needs no
250250
equaliser at all and simply delivers the tributaries the other way round — which is also why
251251
nothing blind can label them, and why a real link recovers the pairing from framing.
@@ -374,7 +374,7 @@ exactly zero in double precision, which would make rejection infinite and a chai
374374
accumulate no crosstalk at all. Real hardware specifies 30–50 dB and it is that floor, not the
375375
shape, that decides what leaks through a long line of them.
376376

377-
The **[OSA](src/oosim/components/filters.py)** finally makes the signal model visible: bands and
377+
The **[OSA](src/maiman/components/filters.py)** finally makes the signal model visible: bands and
378378
noise bins rendered onto one grid, the way an instrument shows them. Its resolution bandwidth is
379379
not cosmetic — widening it raises the ASE trace decibel for decibel and leaves a carrier exactly
380380
where it is, which is the clearest demonstration of why OSNR needs a stated reference bandwidth.
@@ -469,7 +469,7 @@ What does not exist is a single coherent tool that puts them behind a usable int
469469
sound signal representation underneath.
470470

471471
So the gap is **integration and user experience**, not numerics. That shapes the whole strategy:
472-
where a mature open-source kernel exists, OpenOptiSim wraps or depends on it rather than
472+
where a mature open-source kernel exists, Maiman Studio wraps or depends on it rather than
473473
rewriting it. The value added here is the data model, the execution engine, the component
474474
library, and the UI.
475475

@@ -515,7 +515,7 @@ in the [architecture document](docs/ARCHITECTURE.md).
515515
└───────────────────┬──────────────────┘
516516
┌──────────────────────────────────────▼───────────────────────────────────────┐
517517
│ Public Python API │
518-
oosim.Graph · Component · run() · sweep() │
518+
maiman.Graph · Component · run() · sweep() │
519519
└──────────────┬─────────────────────────────────────┬─────────────────────────┘
520520
┌──────────────▼───────────────┐ ┌────────────────▼─────────────────┐
521521
│ Component Library │◄──►│ Execution Engine │
@@ -533,7 +533,7 @@ reachable from Python, it does not exist.**
533533

534534
## The core data model
535535

536-
The part most worth reviewing — see [`src/oosim/signals.py`](src/oosim/signals.py). An optical
536+
The part most worth reviewing — see [`src/maiman/signals.py`](src/maiman/signals.py). An optical
537537
signal is not one array of numbers:
538538

539539
```python
@@ -574,7 +574,7 @@ time window, and results are reproducible.
574574

575575
| Phase | Scope | Estimate¹ |
576576
| :--- | :--- | :--- |
577-
| **0 — Foundations**| Signal model, context, port types, component base, registry, scheduler, `.oosim` project format, sweeps, CI | ~1 month |
577+
| **0 — Foundations**| Signal model, context, port types, component base, registry, scheduler, `.maiman` project format, sweeps, CI | ~1 month |
578578
| **1 — MVP: linear link** *(essentially done)* | ✅ PRBS → NRZ → laser → MZM → fiber (α + CD) → PIN → filter → eye/Q/BER, validated end to end. **Python only, no GUI.** | ~2–3 months |
579579
| **1.5 — Nonlinear & amplified**| Adaptive-step SSFM, Kerr, EDFA with ASE, OSNR, PMD, APD | ~2 months |
580580
| **2 — Coherent transceiver**| Gray-coded M-QAM to 256, IQ modulator with bias and quadrature error, 90° hybrid, balanced detection, blind carrier phase recovery, dual polarization with a blind butterfly equaliser, root-raised-cosine shaping and matched filtering, differential quadrant encoding, receiver-side dispersion compensation over spans to 1000 km, EVM/MER, constellation diagram, validated against closed-form SER | ~3 months |
@@ -646,16 +646,16 @@ docstring — never from inspection of commercial tools.
646646
The core is small enough that changing it is still cheap, which makes right now the most useful
647647
time to push back on it. Most valuable first:
648648

649-
* **Review the signal model and scheduler**[`src/oosim/signals.py`](src/oosim/signals.py),
650-
[`src/oosim/graph.py`](src/oosim/graph.py), and §3–§4 of the
649+
* **Review the signal model and scheduler**[`src/maiman/signals.py`](src/maiman/signals.py),
650+
[`src/maiman/graph.py`](src/maiman/graph.py), and §3–§4 of the
651651
[architecture document](docs/ARCHITECTURE.md). If something there is wrong, it is far cheaper
652652
to fix now than after fifty components depend on it.
653653
* **Tell us if this duplicates existing work.** If a project already does this well, that is worth
654654
knowing before several months go into it.
655655
* **Describe your use case.** Which components, which measurements, what you currently use and
656656
what frustrates you about it.
657657
* **Add a component.** A component is a Python class with declared parameters and typed ports —
658-
see [`src/oosim/components/`](src/oosim/components/) for the pattern. Every physics block needs
658+
see [`src/maiman/components/`](src/maiman/components/) for the pattern. Every physics block needs
659659
a test against a closed-form result; a component without one will not be merged.
660660

661661
Open an issue for any of the above.

docs/ARCHITECTURE.md

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# OpenOptiSim — Architecture & Roadmap
1+
# Maiman Studio — Architecture & Roadmap
22

33
> **Vision:** An open-source, modular platform for system-level simulation of optical
44
> communication links and photonic circuits — the tool that fills the gap between
@@ -82,7 +82,7 @@ it rather than rewriting it.
8282
│ in-process
8383
┌──────────────────────────────────────▼───────────────────────────────────────┐
8484
│ Public Python API │
85-
oosim.Graph · Component · run() · sweep() · analysis helpers │
85+
maiman.Graph · Component · run() · sweep() · analysis helpers │
8686
│ (this is the product for scripting users) │
8787
└──────────────┬─────────────────────────────────────┬─────────────────────────┘
8888
│ │
@@ -390,15 +390,15 @@ never with exact float equality.
390390

391391
## 8. Project File Format
392392

393-
The saved schematic is a versioned, human-readable, git-diffable JSON document (`.oosim`):
393+
The saved schematic is a versioned, human-readable, git-diffable JSON document (`.maiman`):
394394

395395
```json
396396
{
397397
"schema_version": 1,
398398
"context": { "bit_rate": 10e9, "samples_per_symbol": 16,
399399
"sequence_length": 1024, "seed": 42 },
400400
"nodes": [
401-
{ "id": "laser1", "type": "oosim.sources.CWLaser",
401+
{ "id": "laser1", "type": "maiman.sources.CWLaser",
402402
"params": { "power": 10.0, "wavelength": 1550.0 },
403403
"ui": { "x": 100, "y": 200 } }
404404
],
@@ -441,7 +441,7 @@ Timelines assume one developer working part-time. They are estimates, not commit
441441
Repository, license, CI, packaging. `SimulationContext`, signal types, port typing, component
442442
base class and registry, scheduler, result store, project file format, test harness.
443443

444-
*Exit criterion:* a two-block graph runs end-to-end from Python and from a `.oosim` file.
444+
*Exit criterion:* a two-block graph runs end-to-end from Python and from a `.maiman` file.
445445
No physics yet — and that is the point.
446446

447447
### Phase 1 — MVP: linear optical link (~2–3 months)
@@ -501,9 +501,11 @@ top-level link simulation remains dataflow.
501501
(Agrawal, *Nonlinear Fiber Optics*; ITU-T G.652, G.694.1; relevant IEEE 802.3 clauses) and
502502
cite the source in each component's docstring. This protects the project and makes the models
503503
reviewable.
504-
* **Naming:** "OpenOptiSim" sits close to *OptiSystem* / Optiwave for a project that explicitly
505-
cites it as a benchmark. Worth choosing a more distinct name before the first public release,
506-
while renaming is still cheap.
504+
* **Naming:** the project was renamed from "OpenOptiSim" to **Maiman Studio** before the first
505+
public release, while renaming was still cheap. The old name sat close to *OptiSystem* /
506+
Optiwave for a project that explicitly cites it as a benchmark; the new one carries no such
507+
echo. Theodore Maiman built the first working laser in 1960 — the name points at the physics,
508+
not at a competitor. The Python package is `maiman` and project files are `.maiman`.
507509

508510
---
509511

@@ -516,7 +518,7 @@ top-level link simulation remains dataflow.
516518
generation.
517519
4. Implement the scheduler (topological sort, type validation, memory release) and prove it on a
518520
trivial pass-through graph.
519-
5. Define and freeze `.oosim` schema v1; round-trip test.
521+
5. Define and freeze `.maiman` schema v1; round-trip test.
520522
6. Build the Phase 1 chain: PRBS → NRZ → CW Laser → MZM → linear fiber → PIN → BER.
521523
7. Stand up the validation suite from §7 in CI, with every tolerance justified in a comment.
522524
8. Write the first example notebook — for a scientific open-source tool, the examples are the

docs/capture_screenshots.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#: rendering path, so a shorter budget yields a blank results dock.
4141
TIME_BUDGET_MS = 4000
4242

43-
THEME_DEFAULT = 'sessionStorage.getItem("oosim-theme") || "light"'
43+
THEME_DEFAULT = 'sessionStorage.getItem("maiman-theme") || "light"'
4444

4545
CANDIDATES = (
4646
r"C:\Program Files\Google\Chrome\Application\chrome.exe",

docs/images/studio-graphite.png

-209 Bytes
Loading

docs/images/studio-paper.png

-235 Bytes
Loading

0 commit comments

Comments
 (0)