/packet/model_contexts.go
package packet
import "bytex64.net/code/bitsmash/ac"
const (
CONTEXT_PACKET_TYPE = ac.ModelContext(iota)
CONTEXT_COLOR
CONTEXT_PATTERN_NUMBER
CONTEXT_PATTERN_REPEAT
CONTEXT_RLE_REPEAT
CONTEXT_REPEAT_DISTANCE
CONTEXT_REPEAT_LENGTH
)
func ContextBias(context ac.ModelContext) []uint32 {
switch context {
case CONTEXT_PATTERN_NUMBER:
// Slight bias towards larger patterns
return []uint32{3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1}
case CONTEXT_PATTERN_REPEAT:
// Bias towards low numbers. Most common repeats are 0, 1, and 2.
return []uint32{8, 6, 3, 1, 1, 1, 1, 1}
case CONTEXT_REPEAT_DISTANCE:
// Slight bias to distances 1-8, but mostly everything is weighted to prevent too much shift
return []uint32{
3, 3, 3, 3, 3, 3, 3, 3,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
}
case CONTEXT_REPEAT_LENGTH:
// Bias shorter lengths. Length 1 is actually fairly uncommon because
// we assume it isn't worth repeating a single packet in most cases.
return []uint32{1, 10, 8, 4, 2, 2, 2, 2}
default:
panic("Unsupported model context")
}
}