@huukhanhnguyen/model / lanes/tables/nodes
lanes/tables/nodes
evaluateTable()
Parameters
model
key
string
operationCount?
number
Returns
runAnalysis()
runAnalysis(
model,mode,config):AnalyzeRunResult
tableAnalyze's runAnalysis hook (see tables.ts's module doc) — runs sweep/optimize/monteCarlo SYNCHRONOUSLY (table resolution is sync engine law) against a fresh DETACHED COPY of this model, never this directly: sweep/optimize/monteCarlo mutate every touched ParameterNode's input for the run's duration (restored in a finally, but only on whichever model instance they were handed) — a tableAnalyze step resolving mid-render on the LIVE model must never be observed to touch that model's own params, even transiently. _isAnalysisCopy (stamped on the copy right after it's built) is the copy-spawns-copy guard: this.toJSON() carries this very tableAnalyze chain along into the copy's own tables[], so a measure/objective calling Table.get() on ANY analysis chain from INSIDE the copy would otherwise spawn a second detached copy, which spawns a third, forever — a fresh copy gets fresh LaneNode instances (see nodes/LaneNode.ts), so LaneNode.track's own per-instance "already resolving" cycle guard never sees it (it guards ONE Model's call stack, not across instances). An analysis chain read from within an analysis run therefore resolves to an EMPTY result instead — fail- soft, never a stack overflow, same spirit as the old Model._resolvingTables guard this whole LaneNode mechanism replaced.
Parameters
model
mode
config
Returns
tableNodeOf()
tableNodeOf(
model,key):ChainNode<TableChain,Table>
Parameters
model
key
string
Returns
tableValueOf()
tableValueOf(
model,key,operationCount?):Table
Internal unwrapped table value (ExpressionNode / Table.get).
Parameters
model
key
string
operationCount?
number