You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Prompt: Close the issue and open a follow up scoped to the absence question.
And link related PRs
Note
The following content was generated by AI.
What can be improved?
A missing row means two things by kind: a masked variable is absent and takes the row, while a missing parameter row reads as 0 and the row stands. A quantity that moves from decision to data changes meaning. parameters: could take absence: like variables:.
Evidence, proposal, related work
Follow-up to #750, scoped to the absence: question. The null point of #750 is settled by #788: a null or NaN parameter value is refused when the data is attached, so a gap in parameter data is only a missing row.
The law as written
absence.md: "A where: does not set a variable to zero. It leaves the variable unbuilt", and "A missing parameter row is not absence. It reads as the value that contributes nothing: 0 as a coefficient." Each rule holds on its own. The two differ only by the kind of name.
Where it breaks: a decision fixed as data
#748 (spec.fix, for #303) turns a variable into a parameter under the same name. For a variable with where: and absence: undefined, the row p <= cap * avail was not built where cap did not exist. Once cap is a parameter it reads 0 there, and p <= 0 stands. #249 (closed) found this first.
a read inside sum, sum(by=) or sum_back is safe, since an absent summand and a 0 one give the same sum;
a read under a mask that holds every conjunct of the variable's mask is safe;
an unguarded read directly in a constraint adds the variable's mask to that constraint's where:;
a read through shift, through at, or in an unguarded case is refused, because the mask cannot be carried to the row there.
Proposal
absence: zero | undefined on parameters:, with the values and meaning it has on variables::
zero, the default, is today's law: a missing row reads 0.
undefined: a missing row is absent. It spreads through arithmetic, shift and at, takes the row, and is one summand fewer inside a summing operator, as a masked variable is.
With it, fix copies the variable's absence, and every read keeps its meaning with no rewrite and no refusal. #748 shrinks to the dtype rule, the bounds assumption and the rows that become assumptions.
spec.sensitivity; meets the reverse case, a deleted dual that should count as 0. A read keyword like shift's edge=0 would answer it, and waits for a second caller
Note
The following content was generated by AI.
What can be improved?
A missing row means two things by kind: a masked variable is absent and takes the row, while a missing parameter row reads as
0and the row stands. A quantity that moves from decision to data changes meaning.parameters:could takeabsence:likevariables:.Evidence, proposal, related work
Follow-up to #750, scoped to the
absence:question. The null point of #750 is settled by #788: a null or NaN parameter value is refused when the data is attached, so a gap in parameter data is only a missing row.The law as written
absence.md: "Awhere:does not set a variable to zero. It leaves the variable unbuilt", and "A missing parameter row is not absence. It reads as the value that contributes nothing:0as a coefficient." Each rule holds on its own. The two differ only by the kind of name.Where it breaks: a decision fixed as data
#748 (
spec.fix, for #303) turns a variable into a parameter under the same name. For a variable withwhere:andabsence: undefined, the rowp <= cap * availwas not built wherecapdid not exist. Oncecapis a parameter it reads0there, andp <= 0stands. #249 (closed) found this first.#748 reconstructs the absence from the program:
sum,sum(by=)orsum_backis safe, since an absent summand and a0one give the same sum;where:;shift, throughat, or in an unguarded case is refused, because the mask cannot be carried to the row there.Proposal
absence: zero | undefinedonparameters:, with the values and meaning it has onvariables::zero, the default, is today's law: a missing row reads0.undefined: a missing row is absent. It spreads through arithmetic,shiftandat, takes the row, and is one summand fewer inside a summing operator, as a masked variable is.With it,
fixcopies the variable'sabsence, and every read keeps its meaning with no rewrite and no refusal. #748 shrinks to the dtype rule, the bounds assumption and the rows that become assumptions.Related
absence:has one form to decidespec.fix; shrinks if this landsfixanswersspec.sensitivity; meets the reverse case, a deleted dual that should count as0. A read keyword likeshift'sedge=0would answer it, and waits for a second callercoverage: total | maskedsays whether a table may have gaps;absence:says what a gap reads as. Orthogonaldefault:fills a missing row. It interacts withabsence: undefined: a default and an absent gap cannot both applyfix, with a coverage keymainno longer hassum(..., where=). A separate needOpen
absence:, as on variables, or a word that reads better on data.undefinedparameter has no value, instead of reading0. specsolve needs that rule.absence: undefinedanddefault:(a parameter cannot declare a default, so a bound that data prep fills no longer tells awhere:which rows the modeller gave #773) combine on one parameter: refuse both, or let the default win.