@beerwright/core
    Preparing search index...

    Interface WaterSolverResult

    Everything solveWaterProfile returns.

    interface WaterSolverResult {
        achieved: WaterProfile;
        additions: readonly SaltAddition[];
        candidatesEvaluated: number;
        dilutedSource: WaterProfile;
        dilutionFraction: number;
        explain: Explanation;
        fit: readonly IonFit[];
        maxAbsErrorPpm: number;
        saltCount: number;
        score: number;
        split: readonly SaltSplit[];
        treated: TreatedWater;
        warnings: readonly string[];
        withinTolerance: boolean;
    }

    Hierarchy (View Summary)

    Index
    achieved: WaterProfile

    The water the target was fitted against: total water, or mash water for mash-only.

    additions: readonly SaltAddition[]

    The recommended salt schedule. Already split by target.

    candidatesEvaluated: number

    Number of subsets evaluated, so callers can see what the solve cost.

    dilutedSource: WaterProfile

    The source after any dilution.

    dilutionFraction: number

    RO share of the brewing water, 0 to 1. The solver's choice when searchDilution is on.

    explain: Explanation

    How the schedule was worked out, for display.

    fit: readonly IonFit[]

    How each ion came out, one entry per ion.

    maxAbsErrorPpm: number

    Largest single-ion miss, ppm.

    saltCount: number

    Number of salt additions in the schedule.

    score: number

    Weighted RMS error in tolerance units. 0 is exact, and ≤ 1 means "every ion inside its tolerance on average".

    split: readonly SaltSplit[]

    Grams of each salt in each vessel.

    treated: TreatedWater

    The mash, sparge and combined waters the schedule produces.

    warnings: readonly string[]

    Problems worth telling the brewer about, as sentences.

    withinTolerance: boolean

    True when every weighted ion landed inside its tolerance.