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
{{ message }}
Repository navigation
Link: work-ceiling retries without alternatives cost ~6 min on fernflower #92
Follow-up to #89 (fix 9d4c768). With alternatives on, about a dozen methods per iteration reach the work ceiling in LinkComputerImpl.doMethod and are analysed a second time without alternatives. On fernflower (PARALLEL=1) that comes to:
The retries recur every iteration for the same methods: each time they spend the full ceiling and then fall back.
Ideas:
remember per method that the alternatives run hit the ceiling and go straight to the run without alternatives in later iterations (memo keyed on the method; reset if its inputs change shape);
Probably the same cause as #97. DomHelper.findGeneralStatement sits at 87% of the work ceiling with 15,302 ∩ facts out of about 16,950 (90%). About half are materialized from dying temporaries, and most of the rest is ∩ copied along aliases. Details and the proposed direction in #97.
Findings, 2026-11-08/09: computing ∩ on demand (class model)
Where things stand. The class model is opt-in (IMPLICIT=1). The old derivation is the default again (5b8e32f), because making the class model the default failed 10 tests in the maddi gate.
Who reads ∩
Analyzer, method and parameter independence: never judged. LinkToField deliberately skips ∩.
Analyzer, sensitive spots:
FieldAnalyzerImpl.computeIndependent: the catch-all for non-decoration links.
The one-hop local elimination: field ∩ local becomes field ~ p, a nature that is judged.
ShadowModificationPass.followsReturnLink: any link between two real variables carries modification.
The guard warning.
Link engine:
Modification within a method ignores ∩.
WriteLinksAndModification: a mutual rv ∩ Y becomes a §m ≡.
RedundantLinks: groups ∩ with ≤/≥, so a ∩ can drop a ≤/≥.
So ∩ moves verdicts mostly by being converted into something else.
Semantics
∩ is absorbing and ∩∘∩ = ∩. The complete fixpoint is therefore a set of classes, and the class model computes exactly that. The old engine's set is incomplete and order-dependent, so any complete algorithm differs from it somewhere.
∩ only for summary variables (OVLRELEVANT)
∩ was answered only for parameters, the return value, this and fields.
corpus
verdict-diff lines vs old engine, class model
the same, summary variables only
elasticsearch
2
0
langchain4j
40
16
fernflower
60
72
timefold
46
54
Fernflower's EcjSwitchCandidate fields become @Dependent. GenericType.parse and four ElementAwareLinkedListTest methods become modifying. The analyzer suite loses two expected local ∩s (TestInstanceOf, TestModificationBasics.test3). So ∩ between locals does reach verdicts, and restricting it to the summary is not an option.
Cost of the class model
On elasticsearch: 625 s, against 108 s for the old engine. The time goes to full rebuilds of the classes after every closure change, and to the before/after rebuilds of the freeze at every vertex removal.
Look-ups are cheap: 60–70% are cache hits. The worst method is DesiredBalanceComputer.compute, at 33 s per pass, 12 s of it in ∩.
Tried, measured and reverted. Both were exact; OVLCHECK found no mismatch and the corpus verdicts were identical:
Freeze skips the after-partition when no class can break. Saved ~10% of freeze time, nothing measurable overall.
Per-hub creation memo on per-row closure versions. No gain. A hub's creations are linear in its degree, and checking the signature costs as much as recomputing them.
What precedes each rebuild (langchain4j): 28% follow only new facts, and the classes only grew in all of them. 72% follow a removal or a label change, mostly temporaries leaving the graph.
Keeping the classes up to date incrementally therefore saves at most ~30–40% of the ∩ bookkeeping. That might bring elasticsearch to about 550 s, still far from 108 s. Not built.
Open
Per-statement snapshot: compute ∩ once per statement instead of per change. This is the only lever that cuts rebuilds by a large factor, but it changes results relative to the class model and would need its own verdict comparison.
Root causes of the verdict differences:
The ChatRequestOptions.Builder.addListenerAttribute context: the old engine derives key ∩ value, and an isolated probe does not reproduce it.
Fernflower ExprProcessor.
The ShallowMethodAnalyzer cascade in langchain4j (EmbeddingModel).
Diagnostic gates left in place
All are off by default: IMPLICIT, OVLSTATS (timing counters), OVLRELEVANT, OVERLAPSEARCH, NOCHAIN, NOOVERLAP. OVLCHECK went with the reverted shortcuts.
Activity
bnaudts commentedon Nov 6, 2026
Probably the same cause as #97.
DomHelper.findGeneralStatementsits at 87% of the work ceiling with 15,302∩facts out of about 16,950 (90%). About half are materialized from dying temporaries, and most of the rest is∩copied along aliases. Details and the proposed direction in #97.Link engine: an orphan that a surviving middle vertex re-derives is n…
Link engine: lazy materialization for '∩' orphans only; LAZYMATANY fo…
Link: gate NOOVERLAP drops '∩' from the closure (#92 measurement)
Link: '∩' computed on demand instead of derived (#92), WIP
Link: implicit '∩' search continues with the stored label of a pair t…
Link: implicit '∩' as union-find classes; removed temporaries leave f…
Link: implicit '∩' — class partners by default (OVERLAPSEARCH diagnos…
Link: MLVDUMP=<fqn substring> prints computed summaries (diagnostic, #92
Link: OVLSTATS timing and gate OVLRELEVANT for the implicit '∩' (diag…
Link: implicit '∩' opt-in (gate IMPLICIT) while #92 is open; old deri…
Link: OVLSTATS counts what triggers the implicit-'∩' freezes and wher…
Link: implicit '∩' freeze skips the after-partition when no class can…
Link: implicit '∩' remembers each hub's creations while the rows they…
Revert "Link: implicit '∩' remembers each hub's creations while the r…
Link: gate NOFREEZESKIP and OVLSTATS rebuild classification for the i…
Revert the implicit-'∩' freeze shortcut and its A/B gate (#92)
bnaudts commentedon Nov 9, 2026
Findings, 2026-11-08/09: computing
∩on demand (class model)Where things stand. The class model is opt-in (
IMPLICIT=1). The old derivation is the default again (5b8e32f), because making the class model the default failed 10 tests in the maddi gate.Who reads
∩LinkToFielddeliberately skips∩.FieldAnalyzerImpl.computeIndependent: the catch-all for non-decoration links.field ∩ localbecomesfield ~ p, a nature that is judged.ShadowModificationPass.followsReturnLink: any link between two real variables carries modification.∩.WriteLinksAndModification: a mutualrv ∩ Ybecomes a§m ≡.RedundantLinks: groups∩with≤/≥, so a∩can drop a≤/≥.So
∩moves verdicts mostly by being converted into something else.Semantics
∩is absorbing and∩∘∩ = ∩. The complete fixpoint is therefore a set of classes, and the class model computes exactly that. The old engine's set is incomplete and order-dependent, so any complete algorithm differs from it somewhere.∩only for summary variables (OVLRELEVANT)∩was answered only for parameters, the return value,thisand fields.Fernflower's
EcjSwitchCandidatefields become@Dependent.GenericType.parseand fourElementAwareLinkedListTestmethods become modifying. The analyzer suite loses two expected local∩s (TestInstanceOf,TestModificationBasics.test3). So∩between locals does reach verdicts, and restricting it to the summary is not an option.Cost of the class model
On elasticsearch: 625 s, against 108 s for the old engine. The time goes to full rebuilds of the classes after every closure change, and to the before/after rebuilds of the freeze at every vertex removal.
Look-ups are cheap: 60–70% are cache hits. The worst method is
DesiredBalanceComputer.compute, at 33 s per pass, 12 s of it in∩.Tried, measured and reverted. Both were exact;
OVLCHECKfound no mismatch and the corpus verdicts were identical:What precedes each rebuild (langchain4j): 28% follow only new facts, and the classes only grew in all of them. 72% follow a removal or a label change, mostly temporaries leaving the graph.
Keeping the classes up to date incrementally therefore saves at most ~30–40% of the
∩bookkeeping. That might bring elasticsearch to about 550 s, still far from 108 s. Not built.Open
∩once per statement instead of per change. This is the only lever that cuts rebuilds by a large factor, but it changes results relative to the class model and would need its own verdict comparison.ChatRequestOptions.Builder.addListenerAttributecontext: the old engine deriveskey ∩ value, and an isolated probe does not reproduce it.ExprProcessor.ShallowMethodAnalyzercascade in langchain4j (EmbeddingModel).Diagnostic gates left in place
All are off by default:
IMPLICIT,OVLSTATS(timing counters),OVLRELEVANT,OVERLAPSEARCH,NOCHAIN,NOOVERLAP.OVLCHECKwent with the reverted shortcuts.Link: gate OVLSNAPSHOT computes the implicit '∩' once per statement (…
Link: OVLSTATS counts all link computation time; OVLMETHODMS sets the…
Link: OVLSTATS counts statements without reuse, reused and extracted …
Link: OVLSTATS prints every 500 methods (diagnostic, #92)
Link: gate OVLLAST shows the implicit '∩' only to the last statement'…