@@ -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
4848Ordering: 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
122122only if the speedup is material" gate is decisively met — which is why this release
123123now 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
126145plain 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
199218Candidate 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