Skip to content

Commit 33ce9d2

Browse files
elainethaleclaude
andcommitted
docs: record v2.1.0 progress (Phase 0/Step 1/Phase A) and alias-as-Set in ROADMAP
- v2.1.0 status block: Phase 0, Step 1, and Phase A (read backend) landed on eh/gams-transfer; Phase B (write) remaining. - Record the two read-side decisions: aliases read as Sets (both backends), and HAVE_GAMS_TRANSFER means usable (not just importable). - Known-warts membership entry + v3.0.0 candidate now note aliases share the Set membership wart (fixed together). - PR/branch map reflects read-path completion. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 2fc182e commit 33ce9d2

1 file changed

Lines changed: 28 additions & 7 deletions

File tree

dev/ROADMAP.md

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Each PR branches off `main`, in order:
4242
| `eh/ruff-typing-tooling` | **v1.6.0** | typing + tooling; finish with the `to_dataframe` deprecation warning, version bump, CHANGES entry |
4343
| e.g. `eh/breaking-cleanup` | **v2.0.0** | remove `.py` CLI shims, gdx2py, and `to_dataframe(old_interface=...)` |
4444
| `eh/test-gaps` | _(no tag)_ | test-gap groundwork; the correctness oracle for the speedup — **landed** (PR #109) |
45-
| `eh/gams-transfer` | **v2.1.0** | extract gdxcc backend (Phase 0), then read + write fast path behind a backend switch (spike done) |
45+
| `eh/gams-transfer` | **v2.1.0** | Phase 0 (gdxcc extracted) + Step 1 (backend switch) + Phase A (read fast path) **done**; Phase B (write) remaining |
4646
| e.g. `eh/gams-transfer-default` | **v3.0.0** | flip default to gams.transfer + add set-text-write (breaking, coordinated) |
4747

4848
Ordering: the test-gap PR lands before the speedup PR — those tests are the
@@ -122,6 +122,25 @@ back): read 776.6 s → 9.0 s (~86x), write 1002.0 s → 11.5 s (~87x). The "pro
122122
only if the speedup is material" gate is decisively met — which is why this release
123123
now also covers writes, not just reads.
124124

125+
**Status (branch `eh/gams-transfer`, landed locally in order).** Phase 0 (gdxcc
126+
extracted behind a `GdxBackend` ABC; set-text reads unified), Step 1 (`Backend`
127+
enum + `backend=` kwarg + `GDXPDS_BACKEND` env var + `HAVE_GAMS_TRANSFER` +
128+
`to_dataframes(symbols=...)` subset + `BackendError`/`SymbolNotFoundError`), and
129+
**Phase A** (the gams.transfer read backend, parity-tested vs gdxcc over all
130+
fixtures incl. set text, special values, subset, and aliases). Two read-side
131+
decisions firmed up during Phase A:
132+
133+
- *Aliases read as Sets* (both backends). Legacy gdxpds read an alias as a
134+
degenerate float column — an untested/unused path; it now reads like the set it
135+
aliases (`c_bool` membership), so it shares the Set membership-boolean wart and
136+
is fixed together with it in v3.0.0.
137+
- *`HAVE_GAMS_TRANSFER` means usable, not merely importable.* The probe constructs
138+
a Container, so a version-skewed gamsapi (imports but can't load the GAMS shared
139+
libraries) reads as unavailable and transfer-gated tests skip cleanly rather
140+
than crashing. `info()` reports `gams.transfer usable: yes/no`.
141+
142+
**Remaining:** Phase B (the write path) + the v2.1.0 version bump / CHANGES entry.
143+
125144
**Why this is riskier than gdx2py was.** gdx2py was a clean drop-in (returned a
126145
plain list). gams.transfer is not:
127146

@@ -197,8 +216,8 @@ together under one major bump (one migration note, not two).
197216
item calls for.
198217

199218
Candidate third payload for the same release: fixing the membership-boolean wart
200-
(`Value` reliably `True` for members) — also breaking, also touches read + write +
201-
`load_set_text`. See "Known warts" below.
219+
for **Sets and Aliases** (`Value` reliably `True` for members) — also breaking,
220+
also touches read + write + `load_set_text`. See "Known warts" below.
202221

203222
## Known warts / deferred cleanups
204223

@@ -214,10 +233,12 @@ v3.0.0; future entries may be unscheduled.)
214233
written value at `0.0` because `isinstance(c_bool(True), Number)` is False. The
215234
current behavior is now pinned by tests in
216235
[../tests/test_read.py](../tests/test_read.py) so the gams.transfer backend
217-
can't drift. Fixing it (membership reliably `True`) is a deliberate behavior
218-
change touching the read path, the write path, and `load_set_text` — coordinate
219-
with the gams.transfer work and treat it as breaking. **Slated for v3.0.0** as a
220-
candidate payload alongside the default-flip and set-text-write.
236+
can't drift. **Aliases now read as Sets (v2.1.0), so they share this wart**
237+
the fix must cover Set and Alias together. Fixing it (membership reliably
238+
`True`) is a deliberate behavior change touching the read path, the write path,
239+
and `load_set_text` — coordinate with the gams.transfer work and treat it as
240+
breaking. **Slated for v3.0.0** as a candidate payload alongside the
241+
default-flip and set-text-write.
221242

222243
- **`GdxFile.H` is a gdxcc-specific escape hatch on an engine-agnostic
223244
interface.** After the Phase 0 extraction it delegates to

0 commit comments

Comments
 (0)