@reicek/neataptic-ts 0.1.25 → 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 (210) 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/package.json +19 -13
  8. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +4 -4
  9. package/plans/README.md +24 -0
  10. package/plans/Roadmap.md +62 -40
  11. package/plans/analyze-trace-solid-split.plans.md +66 -0
  12. package/plans/architecture-solid-split.plans.md +9 -15
  13. package/plans/asciiMaze-typescript-repair.plans.md +1 -1
  14. package/plans/generate-docs-solid-split.plans.md +87 -0
  15. package/plans/methods-docs.plans.md +25 -1
  16. package/plans/methods-solid-split.plans.md +14 -14
  17. package/plans/neat-docs.plans.md +9 -1
  18. package/plans/neat-test-surface-repair.plans.md +1 -1
  19. package/plans/render-docs-html-solid-split.plans.md +68 -0
  20. package/plans/src-no-explicit-any-cleanup.plans.md +1 -1
  21. package/plans/utils-docs.plans.md +6 -1
  22. package/scripts/analyze-trace/analyze-trace.analysis.ts +479 -0
  23. package/scripts/analyze-trace/analyze-trace.constants.ts +35 -0
  24. package/scripts/analyze-trace/analyze-trace.io.ts +69 -0
  25. package/scripts/analyze-trace/analyze-trace.report.ts +100 -0
  26. package/scripts/analyze-trace/analyze-trace.shared.ts +116 -0
  27. package/scripts/analyze-trace/analyze-trace.ts +45 -0
  28. package/scripts/analyze-trace/analyze-trace.types.ts +72 -0
  29. package/scripts/assets/theme.css +80 -23
  30. package/scripts/copy-examples.ts +239 -0
  31. package/scripts/export-onnx.ts +223 -0
  32. package/scripts/generate-bench-tables.ts +378 -37
  33. package/scripts/generate-docs/generate-docs.constants.ts +107 -0
  34. package/scripts/generate-docs/generate-docs.order.ts +355 -0
  35. package/scripts/generate-docs/generate-docs.state.ts +31 -0
  36. package/scripts/generate-docs/generate-docs.targets.ts +165 -0
  37. package/scripts/generate-docs/generate-docs.ts +63 -0
  38. package/scripts/generate-docs/generate-docs.types.ts +112 -0
  39. package/scripts/generate-docs/output/generate-docs.output.folder-index.utils.ts +167 -0
  40. package/scripts/generate-docs/output/generate-docs.output.ordering.utils.ts +353 -0
  41. package/scripts/generate-docs/output/generate-docs.output.readme.utils.ts +420 -0
  42. package/scripts/generate-docs/output/generate-docs.output.ts +123 -0
  43. package/scripts/generate-docs/output/generate-docs.output.warnings.utils.ts +219 -0
  44. package/scripts/generate-docs/symbols/generate-docs.symbols.collection.utils.ts +365 -0
  45. package/scripts/generate-docs/symbols/generate-docs.symbols.jsdoc.utils.ts +373 -0
  46. package/scripts/generate-docs/symbols/generate-docs.symbols.normalize.utils.ts +155 -0
  47. package/scripts/generate-docs/symbols/generate-docs.symbols.render.utils.ts +149 -0
  48. package/scripts/generate-docs/symbols/generate-docs.symbols.signature.utils.ts +289 -0
  49. package/scripts/generate-docs/symbols/generate-docs.symbols.ts +11 -0
  50. package/scripts/mermaid-cli.mjs +102 -22
  51. package/scripts/mermaid-cli.ts +736 -0
  52. package/scripts/render-docs-html/render-docs-html.assets.ts +54 -0
  53. package/scripts/render-docs-html/render-docs-html.mermaid.ts +245 -0
  54. package/scripts/{render-docs-html.sidebar.ts → render-docs-html/render-docs-html.navigation.ts} +141 -144
  55. package/scripts/render-docs-html/render-docs-html.pages.ts +333 -0
  56. package/scripts/render-docs-html/render-docs-html.shared.ts +333 -0
  57. package/scripts/render-docs-html/render-docs-html.types.ts +42 -0
  58. package/scripts/render-docs-html.ts +23 -587
  59. package/scripts/run-docs.ts +238 -0
  60. package/scripts/write-dist-docs-pkg.ts +40 -0
  61. package/src/README.md +75 -75
  62. package/src/architecture/connection/README.md +5 -5
  63. package/src/architecture/layer/README.md +508 -508
  64. package/src/architecture/network/README.md +1458 -1458
  65. package/src/architecture/network/activate/README.md +694 -694
  66. package/src/architecture/network/bootstrap/README.md +77 -77
  67. package/src/architecture/network/connect/README.md +74 -74
  68. package/src/architecture/network/deterministic/README.md +135 -135
  69. package/src/architecture/network/evolve/README.md +364 -364
  70. package/src/architecture/network/gating/README.md +130 -130
  71. package/src/architecture/network/genetic/README.md +399 -399
  72. package/src/architecture/network/mutate/README.md +897 -897
  73. package/src/architecture/network/onnx/README.md +720 -720
  74. package/src/architecture/network/onnx/export/README.md +728 -728
  75. package/src/architecture/network/onnx/export/layers/README.md +450 -450
  76. package/src/architecture/network/onnx/import/README.md +618 -618
  77. package/src/architecture/network/onnx/schema/README.md +32 -32
  78. package/src/architecture/network/prune/README.md +245 -245
  79. package/src/architecture/network/remove/README.md +135 -135
  80. package/src/architecture/network/runtime/README.md +106 -106
  81. package/src/architecture/network/serialize/README.md +542 -542
  82. package/src/architecture/network/slab/README.md +608 -608
  83. package/src/architecture/network/standalone/README.md +212 -212
  84. package/src/architecture/network/stats/README.md +84 -84
  85. package/src/architecture/network/topology/README.md +465 -465
  86. package/src/architecture/network/training/README.md +200 -200
  87. package/src/architecture/node/README.md +5 -5
  88. package/src/architecture/nodePool/README.md +14 -14
  89. package/src/methods/README.md +99 -99
  90. package/src/methods/activation/README.md +189 -189
  91. package/src/methods/cost/README.md +131 -131
  92. package/src/methods/rate/README.md +86 -86
  93. package/src/multithreading/README.md +77 -77
  94. package/src/multithreading/workers/browser/README.md +8 -8
  95. package/src/multithreading/workers/node/README.md +8 -8
  96. package/src/neat/README.md +148 -148
  97. package/src/neat/adaptive/README.md +120 -120
  98. package/src/neat/adaptive/acceptance/README.md +40 -40
  99. package/src/neat/adaptive/complexity/README.md +137 -137
  100. package/src/neat/adaptive/core/README.md +197 -197
  101. package/src/neat/adaptive/lineage/README.md +90 -90
  102. package/src/neat/adaptive/mutation/README.md +284 -284
  103. package/src/neat/compat/README.md +43 -43
  104. package/src/neat/compat/core/README.md +90 -90
  105. package/src/neat/diversity/README.md +35 -35
  106. package/src/neat/diversity/core/README.md +88 -88
  107. package/src/neat/evaluate/README.md +85 -85
  108. package/src/neat/evaluate/auto-distance/README.md +75 -75
  109. package/src/neat/evaluate/entropy-compat/README.md +37 -37
  110. package/src/neat/evaluate/entropy-sharing/README.md +43 -43
  111. package/src/neat/evaluate/fitness/README.md +23 -23
  112. package/src/neat/evaluate/novelty/README.md +120 -120
  113. package/src/neat/evaluate/objectives/README.md +17 -17
  114. package/src/neat/evaluate/shared/README.md +94 -94
  115. package/src/neat/evolve/README.md +96 -96
  116. package/src/neat/evolve/adaptive/README.md +60 -60
  117. package/src/neat/evolve/objectives/README.md +63 -63
  118. package/src/neat/evolve/offspring/README.md +56 -56
  119. package/src/neat/evolve/population/README.md +171 -171
  120. package/src/neat/evolve/runtime/README.md +79 -79
  121. package/src/neat/evolve/speciation/README.md +74 -74
  122. package/src/neat/evolve/warnings/README.md +10 -10
  123. package/src/neat/export/README.md +114 -114
  124. package/src/neat/helpers/README.md +50 -50
  125. package/src/neat/init/README.md +9 -9
  126. package/src/neat/lineage/core/README.md +101 -101
  127. package/src/neat/multiobjective/category/README.md +74 -74
  128. package/src/neat/multiobjective/crowding/README.md +272 -272
  129. package/src/neat/multiobjective/dominance/README.md +171 -171
  130. package/src/neat/multiobjective/fronts/README.md +68 -68
  131. package/src/neat/multiobjective/metrics/README.md +43 -43
  132. package/src/neat/multiobjective/objectives/README.md +31 -31
  133. package/src/neat/multiobjective/shared/README.md +27 -27
  134. package/src/neat/mutation/README.md +97 -97
  135. package/src/neat/mutation/add-conn/README.md +115 -115
  136. package/src/neat/mutation/add-node/README.md +126 -126
  137. package/src/neat/mutation/flow/README.md +149 -149
  138. package/src/neat/mutation/repair/README.md +185 -185
  139. package/src/neat/mutation/select/README.md +117 -117
  140. package/src/neat/mutation/shared/README.md +32 -32
  141. package/src/neat/objectives/README.md +25 -25
  142. package/src/neat/objectives/core/README.md +67 -67
  143. package/src/neat/pruning/README.md +40 -40
  144. package/src/neat/pruning/core/README.md +171 -171
  145. package/src/neat/pruning/facade/README.md +32 -32
  146. package/src/neat/rng/README.md +104 -104
  147. package/src/neat/rng/core/README.md +137 -137
  148. package/src/neat/rng/facade/README.md +50 -50
  149. package/src/neat/selection/README.md +111 -111
  150. package/src/neat/selection/core/README.md +227 -227
  151. package/src/neat/selection/facade/README.md +61 -61
  152. package/src/neat/shared/README.md +163 -163
  153. package/src/neat/speciation/README.md +31 -31
  154. package/src/neat/speciation/threshold/README.md +35 -35
  155. package/src/neat/species/README.md +25 -25
  156. package/src/neat/species/core/README.md +20 -20
  157. package/src/neat/species/core/shared/README.md +18 -18
  158. package/src/neat/species/history/context/README.md +22 -22
  159. package/src/neat/telemetry/accessors/README.md +58 -58
  160. package/src/neat/telemetry/exports/README.md +233 -233
  161. package/src/neat/telemetry/facade/README.md +252 -252
  162. package/src/neat/telemetry/facade/archive/README.md +57 -57
  163. package/src/neat/telemetry/facade/buffer/README.md +43 -43
  164. package/src/neat/telemetry/facade/lineage/README.md +12 -12
  165. package/src/neat/telemetry/facade/objectives/README.md +44 -44
  166. package/src/neat/telemetry/facade/runtime/README.md +26 -26
  167. package/src/neat/telemetry/facade/species/README.md +27 -27
  168. package/src/neat/telemetry/metrics/README.md +696 -696
  169. package/src/neat/telemetry/recorder/README.md +57 -57
  170. package/src/neat/telemetry/types/README.md +32 -32
  171. package/src/neat/topology-intent/README.md +75 -75
  172. package/src/utils/README.md +193 -193
  173. package/test/examples/asciiMaze/browser-entry/README.md +92 -92
  174. package/test/examples/asciiMaze/dashboardManager/README.md +109 -109
  175. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +28 -28
  176. package/test/examples/asciiMaze/evolutionEngine/README.md +1527 -1527
  177. package/test/examples/asciiMaze/mazeMovement/README.md +105 -105
  178. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +16 -16
  179. package/test/examples/asciiMaze/mazeMovement/policy/README.md +57 -57
  180. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +52 -52
  181. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +46 -46
  182. package/test/examples/flappy_bird/browser-entry/README.md +508 -508
  183. package/test/examples/flappy_bird/browser-entry/host/README.md +101 -101
  184. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +144 -144
  185. package/test/examples/flappy_bird/browser-entry/network-view/README.md +194 -194
  186. package/test/examples/flappy_bird/browser-entry/playback/README.md +278 -278
  187. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +129 -129
  188. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +502 -502
  189. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +139 -139
  190. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +10 -10
  191. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +43 -43
  192. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +30 -30
  193. package/test/examples/flappy_bird/browser-entry/runtime/README.md +59 -59
  194. package/test/examples/flappy_bird/browser-entry/visualization/README.md +276 -276
  195. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +16 -16
  196. package/test/examples/flappy_bird/constants/README.md +1070 -1070
  197. package/test/examples/flappy_bird/environment/README.md +22 -22
  198. package/test/examples/flappy_bird/evaluation/README.md +32 -32
  199. package/test/examples/flappy_bird/evaluation/rollout/README.md +141 -141
  200. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +425 -425
  201. package/test/examples/flappy_bird/simulation-shared/README.md +170 -170
  202. package/test/examples/flappy_bird/simulation-shared/observation/README.md +109 -109
  203. package/test/examples/flappy_bird/trainer/README.md +325 -325
  204. package/test/examples/flappy_bird/trainer/evaluation/README.md +74 -74
  205. package/scripts/analyze-trace.ts +0 -590
  206. package/scripts/copy-examples.mjs +0 -114
  207. package/scripts/export-onnx.mjs +0 -86
  208. package/scripts/generate-bench-tables.mjs +0 -182
  209. package/scripts/generate-docs.ts +0 -2900
  210. 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.