@beerwright/core
    Preparing search index...

    Interface WaterSolverInput

    interface WaterSolverInput {
        allowedSalts?: readonly SaltId[];
        dilutionFraction?: number;
        dilutionPenalty?: number;
        dilutionProfile?: WaterProfile;
        dilutionSteps?: number;
        fewerSaltsPenalty?: number;
        maxDilutionFraction?: number;
        maxSalts?: number;
        minSaltGrams?: number;
        roundToGrams?: number;
        searchDilution?: boolean;
        source: WaterProfile;
        splitStrategy?: SaltSplitStrategy;
        target: WaterProfile;
        tolerancePpm?: Partial<Record<WaterIon, number>>;
        volumes: WaterVolumes;
        weights?: Partial<Record<WaterIon, number>>;
    }
    Index
    allowedSalts?: readonly SaltId[]

    Salts the solver may use. Defaults to DEFAULT_SOLVER_SALTS.

    dilutionFraction?: number

    RO/distilled share of the brewing water, 0–1. Defaults to 0.

    dilutionPenalty?: number

    Score penalty per unit of dilution fraction, in tolerance units. Defaults to 0.5, so replacing 90 % of the water with RO costs 0.45. That's enough to stop the solver sending you out for 25 litres of bottled water to shave an ion that was already inside its tolerance, but not enough to stop it diluting a source that has too many minerals. Only used when searchDilution is on.

    dilutionProfile?: WaterProfile

    What the dilution water is. Defaults to ion-free RO.

    dilutionSteps?: number

    Grid points in the coarse dilution scan. Defaults to 19 (0.05 steps to 0.9).

    fewerSaltsPenalty?: number

    Score penalty per salt used, in tolerance units. Defaults to 0.05.

    maxDilutionFraction?: number

    Upper bound on a searched dilution. Defaults to 0.9.

    maxSalts?: number

    Maximum number of distinct salts. Defaults to 3.

    minSaltGrams?: number

    Reject any salt whose dose is below this, grams. Defaults to 0.2.

    roundToGrams?: number

    Round doses to this many grams. Defaults to 0.1, the resolution of a brewing scale.

    searchDilution?: boolean

    Let the solver choose the dilution too, by scanning a grid and then refining around the best point. Off by default, because most brewers have decided how much RO they're buying before they start.

    source: WaterProfile

    Water as it comes out of the tap.

    splitStrategy?: SaltSplitStrategy

    Where the salts go. Defaults to proportional.

    target: WaterProfile

    Profile to aim at.

    tolerancePpm?: Partial<Record<WaterIon, number>>

    Per-ion tolerances, ppm. Merged over DEFAULT_ION_TOLERANCE_PPM.

    volumes: WaterVolumes

    Mash and sparge volumes.

    weights?: Partial<Record<WaterIon, number>>

    Per-ion weights. Merged over DEFAULT_ION_WEIGHTS. Set an ion to 0 to ignore it.