@reicek/neataptic-ts 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/.github/copilot-instructions.md +11 -0
  2. package/.github/skills/trace-analyzer-extension/SKILL.md +3 -3
  3. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +1 -1
  4. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +1 -1
  5. package/.github/skills/trace-audit-reporting/SKILL.md +3 -3
  6. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +1 -1
  7. package/.github/workflows/ci.yml +3 -3
  8. package/.github/workflows/deploy-pages.yml +6 -6
  9. package/.github/workflows/manual_release_pipeline.yml +3 -3
  10. package/.github/workflows/publish.yml +18 -19
  11. package/.github/workflows/release_dispatch.yml +3 -3
  12. package/package.json +26 -20
  13. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +4 -4
  14. package/plans/README.md +24 -0
  15. package/plans/Roadmap.md +62 -40
  16. package/plans/analyze-trace-solid-split.plans.md +66 -0
  17. package/plans/architecture-solid-split.plans.md +9 -15
  18. package/plans/asciiMaze-typescript-repair.plans.md +1 -1
  19. package/plans/generate-docs-solid-split.plans.md +87 -0
  20. package/plans/methods-docs.plans.md +25 -1
  21. package/plans/methods-solid-split.plans.md +14 -14
  22. package/plans/neat-docs.plans.md +9 -1
  23. package/plans/neat-test-surface-repair.plans.md +1 -1
  24. package/plans/render-docs-html-solid-split.plans.md +68 -0
  25. package/plans/src-no-explicit-any-cleanup.plans.md +1 -1
  26. package/plans/utils-docs.plans.md +6 -1
  27. package/scripts/analyze-trace/analyze-trace.analysis.ts +479 -0
  28. package/scripts/analyze-trace/analyze-trace.constants.ts +35 -0
  29. package/scripts/analyze-trace/analyze-trace.io.ts +69 -0
  30. package/scripts/analyze-trace/analyze-trace.report.ts +100 -0
  31. package/scripts/analyze-trace/analyze-trace.shared.ts +116 -0
  32. package/scripts/analyze-trace/analyze-trace.ts +45 -0
  33. package/scripts/analyze-trace/analyze-trace.types.ts +72 -0
  34. package/scripts/assets/theme.css +80 -23
  35. package/scripts/copy-examples.ts +239 -0
  36. package/scripts/export-onnx.ts +223 -0
  37. package/scripts/generate-bench-tables.ts +378 -37
  38. package/scripts/generate-docs/generate-docs.constants.ts +107 -0
  39. package/scripts/generate-docs/generate-docs.order.ts +355 -0
  40. package/scripts/generate-docs/generate-docs.state.ts +31 -0
  41. package/scripts/generate-docs/generate-docs.targets.ts +165 -0
  42. package/scripts/generate-docs/generate-docs.ts +63 -0
  43. package/scripts/generate-docs/generate-docs.types.ts +112 -0
  44. package/scripts/generate-docs/output/generate-docs.output.folder-index.utils.ts +167 -0
  45. package/scripts/generate-docs/output/generate-docs.output.ordering.utils.ts +353 -0
  46. package/scripts/generate-docs/output/generate-docs.output.readme.utils.ts +420 -0
  47. package/scripts/generate-docs/output/generate-docs.output.ts +123 -0
  48. package/scripts/generate-docs/output/generate-docs.output.warnings.utils.ts +219 -0
  49. package/scripts/generate-docs/symbols/generate-docs.symbols.collection.utils.ts +365 -0
  50. package/scripts/generate-docs/symbols/generate-docs.symbols.jsdoc.utils.ts +373 -0
  51. package/scripts/generate-docs/symbols/generate-docs.symbols.normalize.utils.ts +155 -0
  52. package/scripts/generate-docs/symbols/generate-docs.symbols.render.utils.ts +149 -0
  53. package/scripts/generate-docs/symbols/generate-docs.symbols.signature.utils.ts +289 -0
  54. package/scripts/generate-docs/symbols/generate-docs.symbols.ts +11 -0
  55. package/scripts/mermaid-cli.mjs +102 -22
  56. package/scripts/mermaid-cli.ts +736 -0
  57. package/scripts/render-docs-html/render-docs-html.assets.ts +54 -0
  58. package/scripts/render-docs-html/render-docs-html.mermaid.ts +245 -0
  59. package/scripts/{render-docs-html.sidebar.ts → render-docs-html/render-docs-html.navigation.ts} +141 -144
  60. package/scripts/render-docs-html/render-docs-html.pages.ts +333 -0
  61. package/scripts/render-docs-html/render-docs-html.shared.ts +333 -0
  62. package/scripts/render-docs-html/render-docs-html.types.ts +42 -0
  63. package/scripts/render-docs-html.ts +23 -587
  64. package/scripts/run-docs.ts +238 -0
  65. package/scripts/write-dist-docs-pkg.ts +40 -0
  66. package/src/README.md +75 -75
  67. package/src/architecture/connection/README.md +5 -5
  68. package/src/architecture/layer/README.md +508 -508
  69. package/src/architecture/network/README.md +1458 -1458
  70. package/src/architecture/network/activate/README.md +694 -694
  71. package/src/architecture/network/bootstrap/README.md +77 -77
  72. package/src/architecture/network/connect/README.md +74 -74
  73. package/src/architecture/network/deterministic/README.md +135 -135
  74. package/src/architecture/network/evolve/README.md +364 -364
  75. package/src/architecture/network/gating/README.md +130 -130
  76. package/src/architecture/network/genetic/README.md +399 -399
  77. package/src/architecture/network/mutate/README.md +897 -897
  78. package/src/architecture/network/onnx/README.md +720 -720
  79. package/src/architecture/network/onnx/export/README.md +728 -728
  80. package/src/architecture/network/onnx/export/layers/README.md +450 -450
  81. package/src/architecture/network/onnx/import/README.md +618 -618
  82. package/src/architecture/network/onnx/schema/README.md +32 -32
  83. package/src/architecture/network/prune/README.md +245 -245
  84. package/src/architecture/network/remove/README.md +135 -135
  85. package/src/architecture/network/runtime/README.md +106 -106
  86. package/src/architecture/network/serialize/README.md +542 -542
  87. package/src/architecture/network/slab/README.md +608 -608
  88. package/src/architecture/network/standalone/README.md +212 -212
  89. package/src/architecture/network/stats/README.md +84 -84
  90. package/src/architecture/network/topology/README.md +465 -465
  91. package/src/architecture/network/training/README.md +200 -200
  92. package/src/architecture/node/README.md +5 -5
  93. package/src/architecture/nodePool/README.md +14 -14
  94. package/src/methods/README.md +99 -99
  95. package/src/methods/activation/README.md +189 -189
  96. package/src/methods/cost/README.md +131 -131
  97. package/src/methods/rate/README.md +86 -86
  98. package/src/multithreading/README.md +77 -77
  99. package/src/multithreading/workers/browser/README.md +8 -8
  100. package/src/multithreading/workers/node/README.md +8 -8
  101. package/src/neat/README.md +148 -148
  102. package/src/neat/adaptive/README.md +120 -120
  103. package/src/neat/adaptive/acceptance/README.md +40 -40
  104. package/src/neat/adaptive/complexity/README.md +137 -137
  105. package/src/neat/adaptive/core/README.md +197 -197
  106. package/src/neat/adaptive/lineage/README.md +90 -90
  107. package/src/neat/adaptive/mutation/README.md +284 -284
  108. package/src/neat/compat/README.md +43 -43
  109. package/src/neat/compat/core/README.md +90 -90
  110. package/src/neat/diversity/README.md +35 -35
  111. package/src/neat/diversity/core/README.md +88 -88
  112. package/src/neat/evaluate/README.md +85 -85
  113. package/src/neat/evaluate/auto-distance/README.md +75 -75
  114. package/src/neat/evaluate/entropy-compat/README.md +37 -37
  115. package/src/neat/evaluate/entropy-sharing/README.md +43 -43
  116. package/src/neat/evaluate/fitness/README.md +23 -23
  117. package/src/neat/evaluate/novelty/README.md +120 -120
  118. package/src/neat/evaluate/objectives/README.md +17 -17
  119. package/src/neat/evaluate/shared/README.md +94 -94
  120. package/src/neat/evolve/README.md +96 -96
  121. package/src/neat/evolve/adaptive/README.md +60 -60
  122. package/src/neat/evolve/objectives/README.md +63 -63
  123. package/src/neat/evolve/offspring/README.md +56 -56
  124. package/src/neat/evolve/population/README.md +171 -171
  125. package/src/neat/evolve/runtime/README.md +79 -79
  126. package/src/neat/evolve/speciation/README.md +74 -74
  127. package/src/neat/evolve/warnings/README.md +10 -10
  128. package/src/neat/export/README.md +114 -114
  129. package/src/neat/helpers/README.md +50 -50
  130. package/src/neat/init/README.md +9 -9
  131. package/src/neat/lineage/core/README.md +101 -101
  132. package/src/neat/multiobjective/category/README.md +74 -74
  133. package/src/neat/multiobjective/crowding/README.md +272 -272
  134. package/src/neat/multiobjective/dominance/README.md +171 -171
  135. package/src/neat/multiobjective/fronts/README.md +68 -68
  136. package/src/neat/multiobjective/metrics/README.md +43 -43
  137. package/src/neat/multiobjective/objectives/README.md +31 -31
  138. package/src/neat/multiobjective/shared/README.md +27 -27
  139. package/src/neat/mutation/README.md +97 -97
  140. package/src/neat/mutation/add-conn/README.md +115 -115
  141. package/src/neat/mutation/add-node/README.md +126 -126
  142. package/src/neat/mutation/flow/README.md +149 -149
  143. package/src/neat/mutation/repair/README.md +185 -185
  144. package/src/neat/mutation/select/README.md +117 -117
  145. package/src/neat/mutation/shared/README.md +32 -32
  146. package/src/neat/objectives/README.md +25 -25
  147. package/src/neat/objectives/core/README.md +67 -67
  148. package/src/neat/pruning/README.md +40 -40
  149. package/src/neat/pruning/core/README.md +171 -171
  150. package/src/neat/pruning/facade/README.md +32 -32
  151. package/src/neat/rng/README.md +104 -104
  152. package/src/neat/rng/core/README.md +137 -137
  153. package/src/neat/rng/facade/README.md +50 -50
  154. package/src/neat/selection/README.md +111 -111
  155. package/src/neat/selection/core/README.md +227 -227
  156. package/src/neat/selection/facade/README.md +61 -61
  157. package/src/neat/shared/README.md +163 -163
  158. package/src/neat/speciation/README.md +31 -31
  159. package/src/neat/speciation/threshold/README.md +35 -35
  160. package/src/neat/species/README.md +25 -25
  161. package/src/neat/species/core/README.md +20 -20
  162. package/src/neat/species/core/shared/README.md +18 -18
  163. package/src/neat/species/history/context/README.md +22 -22
  164. package/src/neat/telemetry/accessors/README.md +58 -58
  165. package/src/neat/telemetry/exports/README.md +233 -233
  166. package/src/neat/telemetry/facade/README.md +252 -252
  167. package/src/neat/telemetry/facade/archive/README.md +57 -57
  168. package/src/neat/telemetry/facade/buffer/README.md +43 -43
  169. package/src/neat/telemetry/facade/lineage/README.md +12 -12
  170. package/src/neat/telemetry/facade/objectives/README.md +44 -44
  171. package/src/neat/telemetry/facade/runtime/README.md +26 -26
  172. package/src/neat/telemetry/facade/species/README.md +27 -27
  173. package/src/neat/telemetry/metrics/README.md +696 -696
  174. package/src/neat/telemetry/recorder/README.md +57 -57
  175. package/src/neat/telemetry/types/README.md +32 -32
  176. package/src/neat/topology-intent/README.md +75 -75
  177. package/src/utils/README.md +193 -193
  178. package/test/examples/asciiMaze/browser-entry/README.md +92 -92
  179. package/test/examples/asciiMaze/dashboardManager/README.md +109 -109
  180. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +28 -28
  181. package/test/examples/asciiMaze/evolutionEngine/README.md +1527 -1527
  182. package/test/examples/asciiMaze/mazeMovement/README.md +105 -105
  183. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +16 -16
  184. package/test/examples/asciiMaze/mazeMovement/policy/README.md +57 -57
  185. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +52 -52
  186. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +46 -46
  187. package/test/examples/flappy_bird/browser-entry/README.md +508 -508
  188. package/test/examples/flappy_bird/browser-entry/host/README.md +101 -101
  189. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +144 -144
  190. package/test/examples/flappy_bird/browser-entry/network-view/README.md +194 -194
  191. package/test/examples/flappy_bird/browser-entry/playback/README.md +278 -278
  192. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +129 -129
  193. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +502 -502
  194. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +139 -139
  195. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +10 -10
  196. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +43 -43
  197. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +30 -30
  198. package/test/examples/flappy_bird/browser-entry/runtime/README.md +59 -59
  199. package/test/examples/flappy_bird/browser-entry/visualization/README.md +276 -276
  200. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +16 -16
  201. package/test/examples/flappy_bird/constants/README.md +1070 -1070
  202. package/test/examples/flappy_bird/environment/README.md +22 -22
  203. package/test/examples/flappy_bird/evaluation/README.md +32 -32
  204. package/test/examples/flappy_bird/evaluation/rollout/README.md +141 -141
  205. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +425 -425
  206. package/test/examples/flappy_bird/simulation-shared/README.md +170 -170
  207. package/test/examples/flappy_bird/simulation-shared/observation/README.md +109 -109
  208. package/test/examples/flappy_bird/trainer/README.md +325 -325
  209. package/test/examples/flappy_bird/trainer/evaluation/README.md +74 -74
  210. package/scripts/analyze-trace.ts +0 -590
  211. package/scripts/copy-examples.mjs +0 -114
  212. package/scripts/export-onnx.mjs +0 -86
  213. package/scripts/generate-bench-tables.mjs +0 -182
  214. package/scripts/generate-docs.ts +0 -2900
  215. package/scripts/write-dist-docs-pkg.mjs +0 -16
@@ -37,6 +37,29 @@ flowchart TD
37
37
 
38
38
  ## neat/evaluate/fitness/evaluate.fitness.ts
39
39
 
40
+ ### clearGenomeStateIfRequested
41
+
42
+ ```ts
43
+ clearGenomeStateIfRequested(
44
+ controller: NeatControllerForEval,
45
+ evaluationOptions: { [key: string]: unknown; fitnessPopulation?: boolean | undefined; clear?: boolean | undefined; novelty?: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; } | undefined; entropySharingTuning?: { enabled?: boolean | undefined; targetEntropyVar?: number | undefined; adjustRate?: number | undefined; minSigma?: number | undefined; maxSigma?: number | undefined; } | undefined; entropyCompatTuning?: { enabled?: boolean | undefined; targetEntropy?: number | undefined; deadband?: number | undefined; adjustRate?: number | undefined; minThreshold?: number | undefined; maxThreshold?: number | undefined; } | undefined; autoDistanceCoeffTuning?: { enabled?: boolean | undefined; adjustRate?: number | undefined; minCoeff?: number | undefined; maxCoeff?: number | undefined; } | undefined; multiObjective?: { enabled?: boolean | undefined; autoEntropy?: boolean | undefined; dynamic?: { enabled?: boolean | undefined; } | undefined; } | undefined; speciation?: boolean | undefined; targetSpecies?: number | undefined; compatAdjust?: boolean | undefined; speciesAllocation?: { extendedHistory?: boolean | undefined; } | undefined; sharingSigma?: number | undefined; compatibilityThreshold?: number | undefined; excessCoeff?: number | undefined; disjointCoeff?: number | undefined; },
46
+ clearAction: (genome: GenomeForEvaluation) => void,
47
+ ): void
48
+ ```
49
+
50
+ Clear cached genome state before evaluation when configured.
51
+
52
+ Some evaluators expect each genome to start from a clean runtime state before
53
+ scoring. This helper centralizes that policy so the two scoring modes do not
54
+ each invent their own clearing rule. If clearing is disabled, the helper does
55
+ nothing; if enabled, it applies the caller-provided clear action across the
56
+ current population.
57
+
58
+ Parameters:
59
+ - `controller` - - NEAT controller instance for evaluation.
60
+ - `evaluationOptions` - - Options object for the current evaluation pass.
61
+ - `clearAction` - - Action that clears a genome's internal state.
62
+
40
63
  ### runFitnessEvaluation
41
64
 
42
65
  ```ts
@@ -65,26 +88,3 @@ Parameters:
65
88
  - `evaluationOptions` - - Options object for the current evaluation pass.
66
89
 
67
90
  Returns: Promise that resolves after fitness evaluation completes.
68
-
69
- ### clearGenomeStateIfRequested
70
-
71
- ```ts
72
- clearGenomeStateIfRequested(
73
- controller: NeatControllerForEval,
74
- evaluationOptions: { [key: string]: unknown; fitnessPopulation?: boolean | undefined; clear?: boolean | undefined; novelty?: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; } | undefined; entropySharingTuning?: { enabled?: boolean | undefined; targetEntropyVar?: number | undefined; adjustRate?: number | undefined; minSigma?: number | undefined; maxSigma?: number | undefined; } | undefined; entropyCompatTuning?: { enabled?: boolean | undefined; targetEntropy?: number | undefined; deadband?: number | undefined; adjustRate?: number | undefined; minThreshold?: number | undefined; maxThreshold?: number | undefined; } | undefined; autoDistanceCoeffTuning?: { enabled?: boolean | undefined; adjustRate?: number | undefined; minCoeff?: number | undefined; maxCoeff?: number | undefined; } | undefined; multiObjective?: { enabled?: boolean | undefined; autoEntropy?: boolean | undefined; dynamic?: { enabled?: boolean | undefined; } | undefined; } | undefined; speciation?: boolean | undefined; targetSpecies?: number | undefined; compatAdjust?: boolean | undefined; speciesAllocation?: { extendedHistory?: boolean | undefined; } | undefined; sharingSigma?: number | undefined; compatibilityThreshold?: number | undefined; excessCoeff?: number | undefined; disjointCoeff?: number | undefined; },
75
- clearAction: (genome: GenomeForEvaluation) => void,
76
- ): void
77
- ```
78
-
79
- Clear cached genome state before evaluation when configured.
80
-
81
- Some evaluators expect each genome to start from a clean runtime state before
82
- scoring. This helper centralizes that policy so the two scoring modes do not
83
- each invent their own clearing rule. If clearing is disabled, the helper does
84
- nothing; if enabled, it applies the caller-provided clear action across the
85
- current population.
86
-
87
- Parameters:
88
- - `controller` - - NEAT controller instance for evaluation.
89
- - `evaluationOptions` - - Options object for the current evaluation pass.
90
- - `clearAction` - - Action that clears a genome's internal state.
@@ -49,77 +49,97 @@ flowchart TD
49
49
 
50
50
  ## neat/evaluate/novelty/evaluate.novelty.ts
51
51
 
52
- ### runNoveltyBlendAndArchive
52
+ ### addGenomeToNoveltyArchive
53
53
 
54
54
  ```ts
55
- runNoveltyBlendAndArchive(
55
+ addGenomeToNoveltyArchive(
56
56
  controller: NeatControllerForEval,
57
- evaluationOptions: { [key: string]: unknown; fitnessPopulation?: boolean | undefined; clear?: boolean | undefined; novelty?: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; } | undefined; entropySharingTuning?: { enabled?: boolean | undefined; targetEntropyVar?: number | undefined; adjustRate?: number | undefined; minSigma?: number | undefined; maxSigma?: number | undefined; } | undefined; entropyCompatTuning?: { enabled?: boolean | undefined; targetEntropy?: number | undefined; deadband?: number | undefined; adjustRate?: number | undefined; minThreshold?: number | undefined; maxThreshold?: number | undefined; } | undefined; autoDistanceCoeffTuning?: { enabled?: boolean | undefined; adjustRate?: number | undefined; minCoeff?: number | undefined; maxCoeff?: number | undefined; } | undefined; multiObjective?: { enabled?: boolean | undefined; autoEntropy?: boolean | undefined; dynamic?: { enabled?: boolean | undefined; } | undefined; } | undefined; speciation?: boolean | undefined; targetSpecies?: number | undefined; compatAdjust?: boolean | undefined; speciesAllocation?: { extendedHistory?: boolean | undefined; } | undefined; sharingSigma?: number | undefined; compatibilityThreshold?: number | undefined; excessCoeff?: number | undefined; disjointCoeff?: number | undefined; },
57
+ descriptor: number[],
58
+ novelty: number,
59
+ noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
58
60
  ): void
59
61
  ```
60
62
 
61
- Compute novelty, blend it into scores, and update the novelty archive.
62
-
63
- This is the controller-facing entrypoint for the novelty stage. It behaves
64
- like best-effort evidence enrichment after the core fitness path has run.
65
- If novelty is disabled or misconfigured, evaluation can safely continue with
66
- the base score evidence alone.
63
+ Add a descriptor to the novelty archive when it exceeds the threshold.
67
64
 
68
- The helper preserves several important controller assumptions:
69
- - the current population order is left intact,
70
- - current species membership is left intact,
71
- - no objective-registration policy is changed here,
72
- - only novelty evidence, optional score blending, and archive state are
73
- updated.
65
+ The archive is intentionally bounded and selective. Threshold-based admission
66
+ keeps it focused on descriptors that are genuinely unusual enough to be worth
67
+ remembering, while the cap prevents novelty exploration from turning into an
68
+ unbounded memory sink.
74
69
 
75
70
  Parameters:
76
71
  - `controller` - - NEAT controller instance for evaluation.
77
- - `evaluationOptions` - - Options object for the current evaluation pass.
72
+ - `descriptor` - - Behavior descriptor for the current genome.
73
+ - `novelty` - - Computed novelty score.
74
+ - `noveltyOptions` - - Novelty configuration.
78
75
 
79
- Example:
76
+ ### applyNoveltyToPopulation
80
77
 
81
78
  ```ts
82
- runNoveltyBlendAndArchive(controller, controller.options);
83
- console.log(controller.population[0]?._novelty);
79
+ applyNoveltyToPopulation(
80
+ controller: NeatControllerForEval,
81
+ descriptors: number[][],
82
+ distanceMatrix: number[][],
83
+ kNeighbors: number,
84
+ blendFactor: number,
85
+ noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
86
+ ): void
84
87
  ```
85
88
 
86
- ### getNoveltyNeighborCount
89
+ Apply novelty scores and archive writes across the population.
90
+
91
+ This helper is the fold stage of the novelty pipeline. It translates the
92
+ descriptor-distance evidence into per-genome novelty annotations, then
93
+ optionally blends that evidence into numeric scores and records sufficiently
94
+ novel descriptors for future exploration pressure.
95
+
96
+ Parameters:
97
+ - `controller` - - NEAT controller instance for evaluation.
98
+ - `descriptors` - - Descriptor vectors for each genome.
99
+ - `distanceMatrix` - - Dense distance matrix.
100
+ - `kNeighbors` - - Number of nearest neighbors to average.
101
+ - `blendFactor` - - Novelty-vs-fitness blend factor.
102
+ - `noveltyOptions` - - Novelty configuration.
103
+
104
+ ### blendNoveltyIntoScore
87
105
 
88
106
  ```ts
89
- getNoveltyNeighborCount(
90
- noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
91
- ): number
107
+ blendNoveltyIntoScore(
108
+ genome: GenomeForEvaluation,
109
+ novelty: number,
110
+ blendFactor: number,
111
+ ): void
92
112
  ```
93
113
 
94
- Resolve the number of nearest neighbors used for novelty scoring.
114
+ Blend novelty into the genome score when the score already exists.
95
115
 
96
- Smaller neighbor counts make novelty more sensitive to local behavioral
97
- differences, while larger counts smooth that signal across a wider portion of
98
- the current population.
116
+ This stage intentionally does not invent a base score when one is missing.
117
+ Novelty acts as a companion signal to the existing evaluation path, not as a
118
+ universal replacement for every scoring mode.
99
119
 
100
120
  Parameters:
101
- - `noveltyOptions` - - Novelty configuration.
102
-
103
- Returns: Neighbor count clamped to at least one.
121
+ - `genome` - - Genome to update.
122
+ - `novelty` - - Computed novelty value.
123
+ - `blendFactor` - - Blend factor for novelty versus fitness.
104
124
 
105
- ### getNoveltyBlendFactor
125
+ ### buildDistanceMatrix
106
126
 
107
127
  ```ts
108
- getNoveltyBlendFactor(
109
- noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
110
- ): number
128
+ buildDistanceMatrix(
129
+ descriptors: number[][],
130
+ ): number[][]
111
131
  ```
112
132
 
113
- Resolve the novelty-vs-fitness blend factor.
133
+ Build the full pairwise distance matrix for the descriptor set.
114
134
 
115
- A factor of `0` keeps the existing fitness score unchanged. A factor of `1`
116
- makes novelty fully replace it when a numeric score exists. Values in between
117
- turn novelty into a partial exploratory bonus instead of a hard override.
135
+ The matrix is dense and population-order aligned so later helpers can keep
136
+ the scoring flow simple: each genome reads one row, drops its self-distance,
137
+ and averages the nearest neighbors.
118
138
 
119
139
  Parameters:
120
- - `noveltyOptions` - - Novelty configuration.
140
+ - `descriptors` - - Descriptor vectors for the current population.
121
141
 
122
- Returns: Blend factor used when a genome already has a numeric score.
142
+ Returns: Dense distance matrix aligned with population order.
123
143
 
124
144
  ### buildNoveltyDescriptors
125
145
 
@@ -143,52 +163,29 @@ Parameters:
143
163
 
144
164
  Returns: Descriptor vectors aligned with population order.
145
165
 
146
- ### buildDistanceMatrix
166
+ ### computeDescriptorDistance
147
167
 
148
168
  ```ts
149
- buildDistanceMatrix(
150
- descriptors: number[][],
151
- ): number[][]
169
+ computeDescriptorDistance(
170
+ leftDescriptor: number[],
171
+ rightDescriptor: number[],
172
+ isSame: boolean,
173
+ ): number
152
174
  ```
153
175
 
154
- Build the full pairwise distance matrix for the descriptor set.
176
+ Compute the Euclidean distance between two descriptors.
155
177
 
156
- The matrix is dense and population-order aligned so later helpers can keep
157
- the scoring flow simple: each genome reads one row, drops its self-distance,
158
- and averages the nearest neighbors.
178
+ Distance is computed across the shared descriptor prefix so callers can keep
179
+ using practical descriptor functions even when they occasionally emit vectors
180
+ of uneven length. Self-distance is fixed at zero to keep later neighbor
181
+ ranking deterministic.
159
182
 
160
183
  Parameters:
161
- - `descriptors` - - Descriptor vectors for the current population.
162
-
163
- Returns: Dense distance matrix aligned with population order.
164
-
165
- ### applyNoveltyToPopulation
166
-
167
- ```ts
168
- applyNoveltyToPopulation(
169
- controller: NeatControllerForEval,
170
- descriptors: number[][],
171
- distanceMatrix: number[][],
172
- kNeighbors: number,
173
- blendFactor: number,
174
- noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
175
- ): void
176
- ```
177
-
178
- Apply novelty scores and archive writes across the population.
179
-
180
- This helper is the fold stage of the novelty pipeline. It translates the
181
- descriptor-distance evidence into per-genome novelty annotations, then
182
- optionally blends that evidence into numeric scores and records sufficiently
183
- novel descriptors for future exploration pressure.
184
+ - `leftDescriptor` - - Left descriptor vector.
185
+ - `rightDescriptor` - - Right descriptor vector.
186
+ - `isSame` - - Whether both descriptors belong to the same genome index.
184
187
 
185
- Parameters:
186
- - `controller` - - NEAT controller instance for evaluation.
187
- - `descriptors` - - Descriptor vectors for each genome.
188
- - `distanceMatrix` - - Dense distance matrix.
189
- - `kNeighbors` - - Number of nearest neighbors to average.
190
- - `blendFactor` - - Novelty-vs-fitness blend factor.
191
- - `noveltyOptions` - - Novelty configuration.
188
+ Returns: Euclidean distance across the shared prefix.
192
189
 
193
190
  ### computeNoveltyScore
194
191
 
@@ -211,71 +208,74 @@ Parameters:
211
208
 
212
209
  Returns: Novelty score for the genome.
213
210
 
214
- ### blendNoveltyIntoScore
211
+ ### getNoveltyBlendFactor
215
212
 
216
213
  ```ts
217
- blendNoveltyIntoScore(
218
- genome: GenomeForEvaluation,
219
- novelty: number,
220
- blendFactor: number,
221
- ): void
214
+ getNoveltyBlendFactor(
215
+ noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
216
+ ): number
222
217
  ```
223
218
 
224
- Blend novelty into the genome score when the score already exists.
219
+ Resolve the novelty-vs-fitness blend factor.
225
220
 
226
- This stage intentionally does not invent a base score when one is missing.
227
- Novelty acts as a companion signal to the existing evaluation path, not as a
228
- universal replacement for every scoring mode.
221
+ A factor of `0` keeps the existing fitness score unchanged. A factor of `1`
222
+ makes novelty fully replace it when a numeric score exists. Values in between
223
+ turn novelty into a partial exploratory bonus instead of a hard override.
229
224
 
230
225
  Parameters:
231
- - `genome` - - Genome to update.
232
- - `novelty` - - Computed novelty value.
233
- - `blendFactor` - - Blend factor for novelty versus fitness.
226
+ - `noveltyOptions` - - Novelty configuration.
234
227
 
235
- ### addGenomeToNoveltyArchive
228
+ Returns: Blend factor used when a genome already has a numeric score.
229
+
230
+ ### getNoveltyNeighborCount
236
231
 
237
232
  ```ts
238
- addGenomeToNoveltyArchive(
239
- controller: NeatControllerForEval,
240
- descriptor: number[],
241
- novelty: number,
233
+ getNoveltyNeighborCount(
242
234
  noveltyOptions: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; },
243
- ): void
235
+ ): number
244
236
  ```
245
237
 
246
- Add a descriptor to the novelty archive when it exceeds the threshold.
238
+ Resolve the number of nearest neighbors used for novelty scoring.
247
239
 
248
- The archive is intentionally bounded and selective. Threshold-based admission
249
- keeps it focused on descriptors that are genuinely unusual enough to be worth
250
- remembering, while the cap prevents novelty exploration from turning into an
251
- unbounded memory sink.
240
+ Smaller neighbor counts make novelty more sensitive to local behavioral
241
+ differences, while larger counts smooth that signal across a wider portion of
242
+ the current population.
252
243
 
253
244
  Parameters:
254
- - `controller` - - NEAT controller instance for evaluation.
255
- - `descriptor` - - Behavior descriptor for the current genome.
256
- - `novelty` - - Computed novelty score.
257
245
  - `noveltyOptions` - - Novelty configuration.
258
246
 
259
- ### computeDescriptorDistance
247
+ Returns: Neighbor count clamped to at least one.
248
+
249
+ ### runNoveltyBlendAndArchive
260
250
 
261
251
  ```ts
262
- computeDescriptorDistance(
263
- leftDescriptor: number[],
264
- rightDescriptor: number[],
265
- isSame: boolean,
266
- ): number
252
+ runNoveltyBlendAndArchive(
253
+ controller: NeatControllerForEval,
254
+ evaluationOptions: { [key: string]: unknown; fitnessPopulation?: boolean | undefined; clear?: boolean | undefined; novelty?: { enabled?: boolean | undefined; descriptor?: ((genome: GenomeForEvaluation) => number[]) | undefined; k?: number | undefined; blendFactor?: number | undefined; archiveAddThreshold?: number | undefined; } | undefined; entropySharingTuning?: { enabled?: boolean | undefined; targetEntropyVar?: number | undefined; adjustRate?: number | undefined; minSigma?: number | undefined; maxSigma?: number | undefined; } | undefined; entropyCompatTuning?: { enabled?: boolean | undefined; targetEntropy?: number | undefined; deadband?: number | undefined; adjustRate?: number | undefined; minThreshold?: number | undefined; maxThreshold?: number | undefined; } | undefined; autoDistanceCoeffTuning?: { enabled?: boolean | undefined; adjustRate?: number | undefined; minCoeff?: number | undefined; maxCoeff?: number | undefined; } | undefined; multiObjective?: { enabled?: boolean | undefined; autoEntropy?: boolean | undefined; dynamic?: { enabled?: boolean | undefined; } | undefined; } | undefined; speciation?: boolean | undefined; targetSpecies?: number | undefined; compatAdjust?: boolean | undefined; speciesAllocation?: { extendedHistory?: boolean | undefined; } | undefined; sharingSigma?: number | undefined; compatibilityThreshold?: number | undefined; excessCoeff?: number | undefined; disjointCoeff?: number | undefined; },
255
+ ): void
267
256
  ```
268
257
 
269
- Compute the Euclidean distance between two descriptors.
258
+ Compute novelty, blend it into scores, and update the novelty archive.
270
259
 
271
- Distance is computed across the shared descriptor prefix so callers can keep
272
- using practical descriptor functions even when they occasionally emit vectors
273
- of uneven length. Self-distance is fixed at zero to keep later neighbor
274
- ranking deterministic.
260
+ This is the controller-facing entrypoint for the novelty stage. It behaves
261
+ like best-effort evidence enrichment after the core fitness path has run.
262
+ If novelty is disabled or misconfigured, evaluation can safely continue with
263
+ the base score evidence alone.
264
+
265
+ The helper preserves several important controller assumptions:
266
+ - the current population order is left intact,
267
+ - current species membership is left intact,
268
+ - no objective-registration policy is changed here,
269
+ - only novelty evidence, optional score blending, and archive state are
270
+ updated.
275
271
 
276
272
  Parameters:
277
- - `leftDescriptor` - - Left descriptor vector.
278
- - `rightDescriptor` - - Right descriptor vector.
279
- - `isSame` - - Whether both descriptors belong to the same genome index.
273
+ - `controller` - - NEAT controller instance for evaluation.
274
+ - `evaluationOptions` - - Options object for the current evaluation pass.
280
275
 
281
- Returns: Euclidean distance across the shared prefix.
276
+ Example:
277
+
278
+ ```ts
279
+ runNoveltyBlendAndArchive(controller, controller.options);
280
+ console.log(controller.population[0]?._novelty);
281
+ ```
@@ -43,6 +43,23 @@ flowchart TD
43
43
 
44
44
  ## neat/evaluate/objectives/evaluate.objectives.ts
45
45
 
46
+ ### registerEntropyObjective
47
+
48
+ ```ts
49
+ registerEntropyObjective(
50
+ controller: NeatControllerForEval,
51
+ ): void
52
+ ```
53
+
54
+ Register the entropy objective and invalidate the cached objective list.
55
+
56
+ Registering the objective is only half of the job. The cached objective list
57
+ must also be invalidated so later ranking stages resolve the updated
58
+ objective set instead of continuing to use stale ordering information.
59
+
60
+ Parameters:
61
+ - `controller` - - NEAT controller instance for evaluation.
62
+
46
63
  ### runAutoEntropyObjectiveInjection
47
64
 
48
65
  ```ts
@@ -93,20 +110,3 @@ Parameters:
93
110
  - `evaluationOptions` - - Options object for the current evaluation pass.
94
111
 
95
112
  Returns: True when entropy should be injected.
96
-
97
- ### registerEntropyObjective
98
-
99
- ```ts
100
- registerEntropyObjective(
101
- controller: NeatControllerForEval,
102
- ): void
103
- ```
104
-
105
- Register the entropy objective and invalidate the cached objective list.
106
-
107
- Registering the objective is only half of the job. The cached objective list
108
- must also be invalidated so later ranking stages resolve the updated
109
- objective set instead of continuing to use stale ordering information.
110
-
111
- Parameters:
112
- - `controller` - - NEAT controller instance for evaluation.