Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ it releases that version ([RELEASING.md](https://github.com/fluxopt/specsolve/bl

## Upcoming version

- docs(sweeps): the sweep reference says how many sessions a sweep opens on a remote Gurobi ([#1771](https://github.com/fluxopt/specsolve/pull/1771))

## 0.1.0 (2026-09-25)

🎉 specsolve is officially on PyPI!
Expand Down
2 changes: 1 addition & 1 deletion docs/reference/sweeps.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ than the table. Only `scan_parquet` is a reference.
| | |
|---|---|
| **a partition is a filter on the sources** | Not a narrower index: the containment check refuses parameter rows outside the declared coordinates, so the axis rewrites the rows and the index they are over in one mapping. |
| **one model, updated per slice** | A serial sweep builds once and [updates](api.md#re-solving-with-new-numbers), and a slice whose structure matches the last keeps the loaded solver. A sweep under `executor=` builds per slice, because a built model does not cross a process. |
| **one model, updated per slice** | A serial sweep builds once and [updates](api.md#re-solving-with-new-numbers), and a slice whose structure matches the last keeps the loaded solver. A sweep under `executor=` builds per slice, because a built model does not cross a process. The loaded solver holds Gurobi's environment, so a [remote Gurobi](api.md#choosing-a-solver), such as Instant Cloud, opens one session for a serial sweep unless `keep='nothing'`. It opens a new one at each slice that `sweep.metrics` marks `loaded`, and at every slice under `executor=`. |
| **`keep=` reaches every slice, and the fold chooses none of them** | It defaults to `'solver'`, as [`solve`](api.md#how-much-of-the-session-a-solve-keeps) does. `keep='progress'` has something to carry, since consecutive slices differ by one step; whether that pays is a fact about the *model*. Under `executor=` every slice is a first solve and keeps `'nothing'`. |
| **the model is asked before it is sliced** | The plan says what each axis can bear ([`separability`](https://mathspec.readthedocs.io/en/latest/reference/reading/#asking-whether-an-axis-can-be-cut)). `EachWindow` needs `into` *windowable*: it refuses a coupling by naming the declaration and the change that would lift it, reads an offset the data decides off the data, requires `length - step` to cover what the rows read ahead, and warns where a `position()` restarts per window. What the rows read *behind* is the rolling-horizon seed, met by the edge policy, and is not refused. `EachCoordinate` is not asked: the spec must not declare the column it slices, so the model never sees the axis. |
| **the spec is parsed once** | `solve_over` validates it up front, so a spec outside the language fails before the data is touched. Every worker is handed the lowered [program](glossary.md#the-chain), in this process or across one, and none reads the YAML or lowers it again. |
Expand Down
Loading