feat(math): group-k-smoother in clojure-legacy engine mode (PR-D smoother)#2620
Draft
jucor wants to merge 1 commit into
Draft
feat(math): group-k-smoother in clojure-legacy engine mode (PR-D smoother)#2620jucor wants to merge 1 commit into
jucor wants to merge 1 commit into
Conversation
This was referenced Jul 18, 2026
jucor
marked this pull request as draft
July 18, 2026 01:48
This was referenced Jul 18, 2026
This was referenced Jul 18, 2026
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
…ther)
Ports Clojure's :group-k-smoother (conversation.clj:454-478), which damps K
(the number of opinion groups) so it only switches to a new best value after
:group-k-buffer (= 4, conversation.clj:154) consecutive ticks agree. Default
'improved' mode keeps the existing best_k logic bit-for-bit.
- New polismath/pca_kmeans_rep/group_k_smoother.py: pure
group_k_smoother_update(prev_state, silhouettes_by_k, buffer=4) ->
(new_state, smoothed_k). Implements the exact Clojure rule, INCLUDING:
* HIGHER-k-wins tie-break (Clojure `apply max-key ... (keys ...)` returns
the LAST maximal arg; array-map keys iterate ascending — so ties go to
the higher k). conversation.py's improved best_k uses strict '>' (LOWER
k wins) and is left untouched.
* the #2536 clamp (conversation.clj:469-478): a carried smoothed_k absent
from the current clusterings falls back to this_k — smoothed_k is always
a valid key, so downstream never KeyErrors.
* first-tick acceptance of this_k (smoothed_k None), the cold-start
invariant that keeps the two modes identical on tick 1.
Only the top-level smoother is ported; Python has no subgroups
(subgroup_clusters is hardcoded {}), so the parallel subgroup smoother
(conversation.clj:520-560) is intentionally omitted.
- Conversation._compute_clusters: in legacy mode computes silhouettes_by_k from
group_clusterings, runs the smoother against prev_group_k_smoother (threaded
via recompute(), PR-A), picks group_clusters = group_clusterings[smoothed_k],
and stores the new smoother state + per-k clusterings on the conv (NOT
persisted — conv_man.clj:52-74). Improved mode: selected_k = best_k, and the
new fields stay {} (inert).
Semantic judgment call (integrator, please verify): the degenerate early-return
paths in _compute_clusters (<2 in-conv ptpts / <2 base clusters) do NOT touch
the smoother state, so a degenerate tick preserves the prior in-memory smoother
memory rather than resetting it; the clamp protects the next real tick.
TDD RED evidence (before implementing group_k_smoother.py):
tests/test_group_k_smoother.py collection error:
"ModuleNotFoundError: No module named
'polismath.pca_kmeans_rep.group_k_smoother'"
Tests: 12 new — 10 pure-function (buffer counting, reset-on-change, brief
alternation, clamp present/absent, first-tick, higher-k tie-break) + 2 pipeline
integration (legacy no-flicker-then-switch-after-4 via silhouette stub over 9
chained update_votes ticks: smoothed_k == [2,2,2,2,2,2,2,3,3]; improved mode
leaves the smoother inert). Full suite 434 passed, 17 skipped, 47 xfailed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
commit-id:d4dbbfa9
This was referenced Jul 18, 2026
Delphi Coverage Report
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ports Clojure's :group-k-smoother (conversation.clj:454-478), which damps K
(the number of opinion groups) so it only switches to a new best value after
:group-k-buffer (= 4, conversation.clj:154) consecutive ticks agree. Default
'improved' mode keeps the existing best_k logic bit-for-bit.
group_k_smoother_update(prev_state, silhouettes_by_k, buffer=4) ->
(new_state, smoothed_k). Implements the exact Clojure rule, INCLUDING:
apply max-key ... (keys ...)returnsthe LAST maximal arg; array-map keys iterate ascending — so ties go to
the higher k). conversation.py's improved best_k uses strict '>' (LOWER
k wins) and is left untouched.
from the current clusterings falls back to this_k — smoothed_k is always
a valid key, so downstream never KeyErrors.
invariant that keeps the two modes identical on tick 1.
Only the top-level smoother is ported; Python has no subgroups
(subgroup_clusters is hardcoded {}), so the parallel subgroup smoother
(conversation.clj:520-560) is intentionally omitted.
group_clusterings, runs the smoother against prev_group_k_smoother (threaded
via recompute(), PR-A), picks group_clusters = group_clusterings[smoothed_k],
and stores the new smoother state + per-k clusterings on the conv (NOT
persisted — conv_man.clj:52-74). Improved mode: selected_k = best_k, and the
new fields stay {} (inert).
Semantic judgment call (integrator, please verify): the degenerate early-return
paths in _compute_clusters (<2 in-conv ptpts / <2 base clusters) do NOT touch
the smoother state, so a degenerate tick preserves the prior in-memory smoother
memory rather than resetting it; the clamp protects the next real tick.
TDD RED evidence (before implementing group_k_smoother.py):
tests/test_group_k_smoother.py collection error:
"ModuleNotFoundError: No module named
'polismath.pca_kmeans_rep.group_k_smoother'"
Tests: 12 new — 10 pure-function (buffer counting, reset-on-change, brief
alternation, clamp present/absent, first-tick, higher-k tie-break) + 2 pipeline
integration (legacy no-flicker-then-switch-after-4 via silhouette stub over 9
chained update_votes ticks: smoothed_k == [2,2,2,2,2,2,2,3,3]; improved mode
leaves the smoother inert). Full suite 434 passed, 17 skipped, 47 xfailed.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
commit-id:d4dbbfa9
Stack: