OutWit.Controller.Sweep
2.1.0
dotnet add package OutWit.Controller.Sweep --version 2.1.0
NuGet\Install-Package OutWit.Controller.Sweep -Version 2.1.0
<PackageReference Include="OutWit.Controller.Sweep" Version="2.1.0" />
<PackageVersion Include="OutWit.Controller.Sweep" Version="2.1.0" />
<PackageReference Include="OutWit.Controller.Sweep" />
paket add OutWit.Controller.Sweep --version 2.1.0
#r "nuget: OutWit.Controller.Sweep, 2.1.0"
#:package OutWit.Controller.Sweep@2.1.0
#addin nuget:?package=OutWit.Controller.Sweep&version=2.1.0
#tool nuget:?package=OutWit.Controller.Sweep&version=2.1.0
OutWit.Controller.Sweep
Host-side orchestration of parameter studies for every solver family the host knows: submit a study - the parameters, the variant table and what the variants run on - and the pool computes it chunk by chunk, with everything harvested so far observable while the sweep runs.
| Family | The study's input | Node activity | Script |
|---|---|---|---|
| CalculiX | a base deck with baked tokens (a template study), or every variant's own deck (a deck set) | Ccx.Solve (OutWit.Controller.CalculiX) |
SweepCalculiX.wit |
| OpenFOAM | one case whose templated files carry the tokens | Foam.Run (OutWit.Controller.OpenFOAM) |
SweepOpenFOAM.wit |
| OpenFOAM | every variant's own ready case (a case set) | Foam.Run |
SweepOpenFOAMSet.wit |
The study travels as SweepOptionsData (OutWit.Controller.Sweep.Model): the
parameters, the variant table, the chunk bounds and exactly one family
block. Everything else - the plan, the chunking, the state, the manifest,
the result index - is one implementation for every family; a family is an
ISweepFamily inside this controller (how its block is validated, how a
chunk becomes its node activity's tasks, how a result becomes a manifest row,
which artifacts a row offers).
An OpenFOAM case set is a second input beside the study,
SweepOpenFOAMSetData: one ready case per variant (its name, its tree, its
recipe, its size), no tokens and no parameters. The study's OpenFOAM block then
carries only what the cases share - threads, responses, artifacts - and the
variants carry no values. The set is a job input of its own script rather than
a member of the study, so the study's layout stays what every released host
reads: a host without case sets refuses the unknown script, not every study.
Activities (all host-side)
| Activity | Purpose |
|---|---|
Sweep.Plan(opts) → SweepPlan, Sweep.Plan(opts, cases) → SweepPlan |
Validates the study (one family block, variants present with one value per parameter and unique indices) and its family block (CalculiX: every token in the base deck, or a deck set covering every variant exactly once; OpenFOAM: the case rules of OutWit.Controller.OpenFOAM.Model and every token placed in a templated file, every templated token declared; an OpenFOAM case set: every variant exactly one case, each case under the same rules and named in every finding, nothing templated, no tree or recipe in the block), naming every finding at once; then computes the progressive chunk schedule. The plan carries the case set. |
Sweep.InitState(plan) → SweepState |
The zero cursor. |
Sweep.ChunkCount(plan) → Int |
Loop bound of the bundled scripts. |
Sweep.MakeChunk(plan, state) → <family>TaskCollection |
The next chunk's tasks, of the family's node activity: CalculiX variant decks materialised by plain token substitution (this side never parses a deck), deck-set decks as uploaded; OpenFOAM tasks as metadata only (the case and each variant's values - substitution happens on the node, so the base files travel once per node; in a case set each task is its own case with the block's shared part). Checks that the script's task collection holds the family's tasks and fails loudly otherwise. |
Sweep.Harvest(plan, state, wave) → SweepState |
Appends the chunk's rows - the sweep's verdict (succeeded, failed, refused) and the node's own result, verbatim - to the manifest blob, and returns the advanced cursor with the counts by outcome and the result index (variant, verdict, label from the parameter values - "XMAX=300, T=250" - or the case's name in a case set, and the artifacts by kind: .frd, .dat, a case zip). |
Sweep.Finish(plan, state) → Blob |
Returns the final manifest blob. |
Why chunks
A sweep chunk is a product checkpoint, not an algorithmic barrier: after every
chunk the manifest holds all harvested variants, so a cancelled sweep keeps
everything already computed, and a monitoring client sees per-variant states
mid-run. Sizing is progressive - the first chunk small enough for fast
feedback (a broken scenario burns a handful of variants, not the night),
geometric growth to a cap (near-optimal allocator packing for the bulk; the
cap bounds both cancellation loss and a failed node's recompute radius). A
chunk is also a wave: the grid places its tasks on at most as many machines as
the chunk has tasks, so the plan never opens narrower than the fleet -
Sweep.Plan asks the engine how many machines can take a task of the job
(local nodes and the handles other clouds offer) and raises the first chunk,
and the cap with it, to that width. A client's larger first chunk stays as
asked.
A variant that fails - a nonzero exit, a diverged solve - or that its node refuses before running (OpenFOAM: run-time code, a step outside the allow-list) is a row in the manifest with its verdict and reasons; it never fails the task, so one bad variant cannot poison its node batch.
Result document
The state variable is rendered for document clients (the ParaView plugin's
cloud-open) as sweep.state@2: the counts by outcome, the manifest blob and
the result index with each variant's artifacts by kind, so a client knows
whether it downloads a CalculiX result file or an OpenFOAM case zip. The
schema and the C++ and Python bindings are generated into
OutWit.Controller.Sweep.Model/Documents/.
Module shape
Host-only (IWitControllerHost alone): never delivered to compute nodes,
which is what makes the declared dependencies on the host-only Grid and on
Special honest - dependency validation runs on nodes too, and a module that
carried node activities alongside these declarations would be refused there.
The families' node modules (CalculiX, OpenFOAM) are dependencies because
their task and result types ride through the scripts; node-side work lives
entirely in them.
Deploying Sweep 2.x: the host needs both family modules next to it -
CalculiX (>= 1.1.0) and OpenFOAM (>= 1.0.0). The host loader refuses a
module whose declared dependencies are missing, so a host without the
OpenFOAM module refuses the whole Sweep module, and CalculiX sweeps stop with
it, even though they never touch OpenFOAM. Install (or upgrade) the OpenFOAM
module on the host before, or together with, Sweep 2.x.
Scripts
Scripts/SweepCalculiX.wit, Scripts/SweepOpenFOAM.wit and
Scripts/SweepOpenFOAMSet.wit (shipped via OutWit.Controller.Sweep.Scripts):
plan → loop chunks { make → Grid.ForEach → harvest } → finish; they differ
only in the declared task and result collections, the node activity, and the
case set the last one takes beside the study.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- OutWit.Controller.Sweep.Model (>= 2.1.0)
- OutWit.Engine.Assets.MSBuild (>= 1.0.1)
- OutWit.Engine.Data (>= 1.1.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.1.0 | 46 | 9/27/2026 |
| 2.0.5 | 49 | 9/27/2026 |
| 2.0.4 | 49 | 9/26/2026 |
| 2.0.3 | 50 | 9/26/2026 |
| 2.0.2 | 48 | 9/26/2026 |
| 2.0.1 | 48 | 9/25/2026 |
| 1.0.1 | 88 | 9/22/2026 |
| 1.0.0 | 123 | 9/16/2026 |
| 0.2.2 | 191 | 8/26/2026 |
| 0.2.1 | 129 | 8/21/2026 |
| 0.2.0 | 117 | 8/21/2026 |
| 0.1.3 | 135 | 8/13/2026 |
| 0.1.2 | 111 | 8/13/2026 |
| 0.1.1 | 121 | 8/4/2026 |