0 is a valid index. It can legitimately be the head of the optimal
path. When it was the head of the optimal path, DescribePath() would
print nothing. This fixes that bug.
- CELL_UNINITIALIZED = -2147483647 + iota
- CELL_BEING_EVALUATED
- CELL_RUBISH
+ FROM_ROOT = -2147483647 + iota
+ FROM_UNINITIALIZED
+ VALUE_UNINITIALIZED
+ VALUE_BEING_EVALUATED
+ VALUE_RUBISH
)
func EncodeIndex(dims, addr []int) int32 {
)
func EncodeIndex(dims, addr []int) int32 {
func CreateStateTable(data planet_data, dims []int) []State {
table := make([]State, StateTableSize(dims))
for i := range table {
func CreateStateTable(data planet_data, dims []int) []State {
table := make([]State, StateTableSize(dims))
for i := range table {
- table[i].value = CELL_UNINITIALIZED
+ table[i].value = VALUE_UNINITIALIZED
+ table[i].from = FROM_UNINITIALIZED
}
addr := make([]int, NumDimensions)
}
addr := make([]int, NumDimensions)
addr[Edens] = *start_edens
addr[Location] = data.p2i[*start]
addr[Traded] = 1
addr[Edens] = *start_edens
addr[Location] = data.p2i[*start]
addr[Traded] = 1
- table[EncodeIndex(dims, addr)].value = int32(*funds)
+ start_index := EncodeIndex(dims, addr)
+ table[start_index].value = int32(*funds)
+ table[start_index].from = FROM_ROOT
func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
my_index := EncodeIndex(dims, addr)
func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
my_index := EncodeIndex(dims, addr)
- if table[my_index].value == CELL_BEING_EVALUATED {
+ if table[my_index].value == VALUE_BEING_EVALUATED {
panic("Circular dependency")
}
panic("Circular dependency")
}
- if table[my_index].value != CELL_UNINITIALIZED {
+ if table[my_index].value != VALUE_UNINITIALIZED {
return table[my_index].value
}
return table[my_index].value
}
- table[my_index].value = CELL_BEING_EVALUATED
+ table[my_index].value = VALUE_BEING_EVALUATED
- best_value := int32(CELL_RUBISH)
+ best_value := int32(VALUE_RUBISH)
best_source := make([]int, NumDimensions)
other := make([]int, NumDimensions)
copy(other, addr)
best_source := make([]int, NumDimensions)
other := make([]int, NumDimensions)
copy(other, addr)
// Sanity check: This cell was in state BEING_EVALUATED
// the whole time that it was being evaluated.
// Sanity check: This cell was in state BEING_EVALUATED
// the whole time that it was being evaluated.
- if table[my_index].value != CELL_BEING_EVALUATED {
+ if table[my_index].value != VALUE_BEING_EVALUATED {
}
func DescribePath(data planet_data, dims []int, table []State, start int32) (description []string) {
}
func DescribePath(data planet_data, dims []int, table []State, start int32) (description []string) {
- for index := start; index > 0 && table[index].from > 0; index = table[index].from {
+ for index := start; table[index].from > FROM_ROOT; index = table[index].from {
+ if table[index].from == FROM_UNINITIALIZED {
+ panic(index)
+ }
var line string
addr := DecodeIndex(dims, index)
prev := DecodeIndex(dims, table[index].from)
var line string
addr := DecodeIndex(dims, index)
prev := DecodeIndex(dims, table[index].from)