/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")
    }
}