Stage S-1b: dictionary word ids grow with the dictionary; a word that can't get an id is refused whole (FABRIC-3.9.0 §8.1)
- word_id_map / recycled_word_ids are heap tables (one shared capacity, 64 doubling), grown all-or-nothing by allocate-copy-free. Numbering is unchanged, so boot parity is unchanged. - vm_create_word() takes the id before linking; on failure it frees the entry, sets vm->error, logs LOG_ERROR and counts (vm_dictionary_word_id_refusals()). No word runs with WORD_ID_INVALID. - Readers of the id space bound by vm->next_word_id, not DICTIONARY_SIZE. - transition_heat gets its own capacity and grows on record (was sized once -- a heap overflow under a dynamic bound); every reader bounds by it. - Stadium id->cell rows start empty and grow on dispatch; a failed grow is logged, counted and not admitted. S-2 (the cell pool) stays open. Probe (reverted), identical on amd64/aarch64/riscv64: +2000 words get real ids (capacity 4096); a word at id 2738 lands 200x in the rolling window and is Stadium-admitted; FORGET recycles across the old boundary; an injected grow failure refuses the word whole (NULL, error, counter, dictionary unchanged) and the retry succeeds. 3-ISA acceptance passes; boot parity (531, 0x572daac83b797332) and the dict_hash set unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
ee3db96ea8
commit
1dbd0c74ed
@@ -154,11 +154,15 @@ typedef struct WordTransitionMetrics {
|
||||
* transition_heat[i]: Number of times word with index i has been
|
||||
* executed immediately after this word.
|
||||
*
|
||||
* Dynamically allocated array of size DICTIONARY_SIZE.
|
||||
* Dynamically allocated, transition_heat_cap entries long.
|
||||
* Initialized to NULL; allocated on first use to save memory
|
||||
* for words that are never executed.
|
||||
* for words that are never executed, and grown when a word id at or
|
||||
* past transition_heat_cap is recorded (Stage S-1b: word ids are no
|
||||
* longer capped at DICTIONARY_SIZE, so no fixed length can hold them).
|
||||
* Every reader bounds by transition_heat_cap, never by a global size.
|
||||
*/
|
||||
uint64_t *transition_heat;
|
||||
uint32_t transition_heat_cap;
|
||||
|
||||
/** Total number of transitions observed from this word */
|
||||
uint64_t total_transitions;
|
||||
@@ -264,11 +268,14 @@ int transition_metrics_init(WordTransitionMetrics *metrics);
|
||||
*
|
||||
* @param metrics Metrics for the current word
|
||||
* @param next_word_id Index of word that executed next
|
||||
* @param dict_size Total number of words in dictionary (for array bounds)
|
||||
* @return 0 on success, -1 on invalid word_id
|
||||
* @param dict_size The VM's word-id bound (vm->next_word_id): every issued id is below it
|
||||
* @return 0 on success, -1 on invalid word_id or a failed grow (logged, counted)
|
||||
*/
|
||||
int transition_metrics_record(WordTransitionMetrics *metrics, uint32_t next_word_id, uint32_t dict_size);
|
||||
|
||||
/* S-1b: transitions dropped because a transition_heat array couldn't grow. */
|
||||
uint64_t transition_metrics_grow_failures(void);
|
||||
|
||||
/*
|
||||
* Get the probability (Q48.16 format) of a specific word following this word.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user