feat(03-01): extend TrafficClass to 14 classes with hash-bucketed unknowns

- Replace ClassUnknown with ClassUnknown1-4 (unknown-1 through unknown-4)
- AllClasses() now returns 14 elements
- Add hashBucket() function routing unrecognized traffic deterministically
- Update synth/config.go: NumLayers=14, 4 dissonant unknown tone configs at 862-1047 Hz
- Add TestAllClassesCount and TestHashBucketDistribution tests
- Add TestClassFreqConfigsComplete and TestNumLayersMatchesAllClasses to config_test.go
- Update TestNewBankHas14Layers, TestMixerNoClip for 14 classes
- All classify and synth tests pass
This commit is contained in:
2026-03-26 13:11:24 +01:00
parent c8536dac94
commit ff3ec7eb78
6 changed files with 127 additions and 19 deletions
+5 -5
View File
@@ -7,10 +7,10 @@ import (
"github.com/netsynth/netsynth/classify"
)
func TestNewBankHas11Layers(t *testing.T) {
func TestNewBankHas14Layers(t *testing.T) {
b := NewBank(1.0)
if len(b.layers) != 11 {
t.Errorf("NewBank() has %d layers, want 11", len(b.layers))
if len(b.layers) != 14 {
t.Errorf("NewBank() has %d layers, want 14", len(b.layers))
}
// Verify each class has exactly one layer
for _, class := range classify.AllClasses() {
@@ -76,13 +76,13 @@ func TestRenderWindowNonZeroWithTraffic(t *testing.T) {
func TestMixerNoClip(t *testing.T) {
b := NewBank(0.01) // fast EMA to quickly ramp up to near-max amplitude
counts := make(map[classify.TrafficClass]int64)
// All 11 classes at max count — worst-case mixing scenario
// All 14 classes at max count — worst-case mixing scenario
for _, class := range classify.AllClasses() {
counts[class] = 1000
}
snap := classify.WindowSnapshot{
Counts: counts,
TotalPackets: 11000,
TotalPackets: 14000,
WindowIndex: 0,
}
// Render multiple windows to let EMA converge