labels.go

 1// Copyright 2022 The Go Authors. All rights reserved.
 2// Use of this source code is governed by a BSD-style
 3// license that can be found in the LICENSE file.
 4
 5package lcs
 6
 7import (
 8	"fmt"
 9)
10
11// For each D, vec[D] has length D+1,
12// and the label for (D, k) is stored in vec[D][(D+k)/2].
13type label struct {
14	vec [][]int
15}
16
17// Temporary checking DO NOT COMMIT true TO PRODUCTION CODE
18const debug = false
19
20// debugging. check that the (d,k) pair is valid
21// (that is, -d<=k<=d and d+k even)
22func checkDK(D, k int) {
23	if k >= -D && k <= D && (D+k)%2 == 0 {
24		return
25	}
26	panic(fmt.Sprintf("out of range, d=%d,k=%d", D, k))
27}
28
29func (t *label) set(D, k, x int) {
30	if debug {
31		checkDK(D, k)
32	}
33	for len(t.vec) <= D {
34		t.vec = append(t.vec, nil)
35	}
36	if t.vec[D] == nil {
37		t.vec[D] = make([]int, D+1)
38	}
39	t.vec[D][(D+k)/2] = x // known that D+k is even
40}
41
42func (t *label) get(d, k int) int {
43	if debug {
44		checkDK(d, k)
45	}
46	return int(t.vec[d][(d+k)/2])
47}
48
49func newtriang(limit int) label {
50	if limit < 100 {
51		// Preallocate if limit is not large.
52		return label{vec: make([][]int, limit)}
53	}
54	return label{}
55}