POST coverage cluster 3/4: inference-engine accessors (proof-covered, previously untested)
New module (inference_words_test.c, Module 26) covers exactly the 8 words proof/COVERAGE.md marks proof-covered in inference_words.c (out of 20 registered): the 5 output accessors (INFER-WINDOW@/DECAY@/ VARIANCE@/FIT@/EARLY-EXIT@), INFER-RUN (populates what they read), and Q.VARIANCE/INFER-DECAY-SLOPE/INFER-WINDOW-WIDTH (array-based primitives, using HERE as multi-cell scratch memory). Deliberately not the L8 Jacquard or Bayesian-posterior words in the same file -- not proof-covered, out of this cluster's scope. Caught and fixed a contract-selection mistake before booting: copied CONTRACT_PHYSICS_TRANSPARENT from the Q48.16 cluster without checking whether it fit. It doesn't -- these words are specifically about reading physics state (dictionary heat, rolling window), so asserting A4' transparency on them would test an invariant they deliberately don't have. Switched to CONTRACT_NONE with an explanatory comment. Boot-verified: zero warnings, all 9 suite entries pass, FINAL TEST SUMMARY 1031->1040 total / 993->1002 passed (+9 exactly), 0 failed, contract checks (A4'/A1) still report "all passed" -- confirms the CONTRACT_NONE fix actually avoided the violation, not just silenced it. Cluster 4 of 4 (final one) left: physics freeze/diagnostic, 5 words. Full writeup in FABRIC-2.md Section J. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
7100523656
commit
825ab078f1
@@ -109,6 +109,12 @@ void run_acl_words_tests(VM * vm);
|
||||
*/
|
||||
void run_q48_words_tests(VM * vm);
|
||||
|
||||
/*
|
||||
* @brief Run tests for the proof-covered subset of inference-engine words (Module 26)
|
||||
* @param vm Pointer to the VM instance
|
||||
*/
|
||||
void run_inference_words_tests(VM * vm);
|
||||
|
||||
/*
|
||||
* @brief Run tests for Mama FORTH vocabulary (capsule system M7.1)
|
||||
* @param vm Pointer to the VM instance
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
StarForth — Steady-State Virtual Machine Runtime
|
||||
|
||||
Copyright (c) 2023–2025 Robert A. James
|
||||
All rights reserved.
|
||||
|
||||
This file is part of the StarForth project.
|
||||
|
||||
Licensed under the StarForth License, Version 1.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
You may obtain a copy of the License at:
|
||||
https://github.com/star.4th@proton.me/StarForth/LICENSE.txt
|
||||
|
||||
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
express or implied, including but not limited to the warranties of
|
||||
merchantability, fitness for a particular purpose, and noninfringement.
|
||||
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* inference_words_test.c — POST tests for the SSM inference engine's
|
||||
* proof-covered accessor/primitive words (Module 26)
|
||||
*
|
||||
* inference_words.c registers 20 words; only 8 are proof-covered per
|
||||
* proof/COVERAGE.md ("5 accessors full; rest guard/shape") — this file
|
||||
* covers exactly those 8, not the L8 Jacquard / Bayesian-posterior words,
|
||||
* which COVERAGE.md does not claim coverage for. No test file existed for
|
||||
* any word in this module before.
|
||||
*
|
||||
* The three array-based primitives (Q.VARIANCE/INFER-DECAY-SLOPE/
|
||||
* INFER-WINDOW-WIDTH) need real data in VM memory — HERE is used as
|
||||
* scratch, matching the idiom memory_words_test.c already uses. The four
|
||||
* *-@ accessors and INFER-RUN are exercised in one suite (INFER-WINDOW@)
|
||||
* that runs INFER-RUN first, since the accessors just read
|
||||
* vm->last_inference_outputs and INFER-RUN is what populates it.
|
||||
*/
|
||||
|
||||
#include "../include/test_runner.h"
|
||||
#include "../include/test_common.h"
|
||||
|
||||
/* Inference Engine Words Test Suites - Module 26 */
|
||||
static WordTestSuite inference_word_suites[] = {
|
||||
{
|
||||
"Q.VARIANCE", {
|
||||
{"three_cells", "100 HERE ! 200 HERE 8 + ! 300 HERE 16 + ! HERE 3 Q.VARIANCE Q.TO-INT . CR",
|
||||
"Should print population variance of {100,200,300} (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-DECAY-SLOPE", {
|
||||
{"three_cells", "300 HERE ! 200 HERE 8 + ! 100 HERE 16 + ! HERE 3 INFER-DECAY-SLOPE Q.TO-INT . CR",
|
||||
"Should print decay slope for a decreasing trajectory (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-WINDOW-WIDTH", {
|
||||
{"three_cells", "100 HERE ! 200 HERE 8 + ! 300 HERE 16 + ! HERE 3 INFER-WINDOW-WIDTH . CR",
|
||||
"Should print an inferred window width (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-RUN", {
|
||||
{"basic", "INFER-RUN", "Should run without error", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-WINDOW@", {
|
||||
{"after_run", "INFER-RUN INFER-WINDOW@ . CR", "Should print last adaptive_window_width (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-DECAY@", {
|
||||
{"after_run", "INFER-RUN INFER-DECAY@ Q.TO-INT . CR", "Should print last adaptive_decay_slope (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-VARIANCE@", {
|
||||
{"after_run", "INFER-RUN INFER-VARIANCE@ Q.TO-INT . CR", "Should print last window_variance_q48 (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-FIT@", {
|
||||
{"after_run", "INFER-RUN INFER-FIT@ Q.TO-INT . CR", "Should print last slope_fit_quality_q48 (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{
|
||||
"INFER-EARLY-EXIT@", {
|
||||
{"after_run", "INFER-RUN INFER-EARLY-EXIT@ . CR", "Should print 0 or 1 (no error)", TEST_NORMAL, 0, 1, {0}},
|
||||
{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}
|
||||
},
|
||||
1, {0}
|
||||
},
|
||||
{NULL, {{NULL, NULL, NULL, TEST_NORMAL, 0, 0, {0}}}, 0, {0}}
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Executes the proof-covered subset of inference-engine word test suites
|
||||
* @param vm Pointer to the Forth virtual machine instance
|
||||
* @details Covers the 8 words proof/COVERAGE.md marks as proof-covered in
|
||||
* inference_words.c: the three array-based primitives (Q.VARIANCE,
|
||||
* INFER-DECAY-SLOPE, INFER-WINDOW-WIDTH), INFER-RUN, and the four
|
||||
* *-@ output accessors (INFER-WINDOW@/DECAY@/VARIANCE@/FIT@) plus
|
||||
* INFER-EARLY-EXIT@. Does not cover the L8 Jacquard or Bayesian
|
||||
* posterior words in the same file — not claimed as proof-covered.
|
||||
*/
|
||||
void run_inference_words_tests(VM *vm) {
|
||||
log_message(LOG_INFO, "Running Inference Engine Words Tests (Module 26)...");
|
||||
|
||||
/* CONTRACT_NONE, not CONTRACT_PHYSICS_TRANSPARENT: these words read
|
||||
* physics state (rolling window, dictionary heat) by design -- A4'
|
||||
* transparency is a property they deliberately do not have. */
|
||||
WordContract mod = {CONTRACT_NONE, 0};
|
||||
for (int i = 0; inference_word_suites[i].word_name != NULL; i++) {
|
||||
log_message(LOG_TEST, "▶ Testing module: %s", __FILE__);
|
||||
run_test_suite_m(vm, &inference_word_suites[i], mod);
|
||||
}
|
||||
|
||||
print_module_summary("Inference Engine Words", 0, 0, 0, 0);
|
||||
}
|
||||
@@ -131,6 +131,7 @@ static TestModule test_modules[] = {
|
||||
{"ACL Words", NULL, 0, run_acl_words_tests}, /* Module 23: Word-Level ACL System */
|
||||
{"Mama FORTH Words", NULL, 0, run_mama_forth_words_tests}, /* Module 24: Capsule System M7.1 */
|
||||
{"Q48.16 Words", NULL, 0, run_q48_words_tests}, /* Module 25: Q48.16 Fixed-Point Arithmetic */
|
||||
{"Inference Engine Words", NULL, 0, run_inference_words_tests}, /* Module 26: SSM Inference (proof-covered subset) */
|
||||
{NULL, NULL, 0, NULL} /* End marker */
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user