Score on criteria count, not sample count

This commit is contained in:
Ian Gulliver
2021-11-20 20:30:16 -10:00
parent 6612523a52
commit 05c62a92e1
3 changed files with 40 additions and 30 deletions

View File

@@ -30,22 +30,24 @@ func NewDefinition(r io.Reader) (*Definition, error) {
func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) { func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) {
status := Status{ status := Status{
TargetScore: uint64(len(def.Samples)), TargetScore: def.sumOuts(),
} }
if statusChan != nil { if statusChan != nil {
statusChan <- status statusChan <- status
} }
// TODO: Score should be number of output criteria, not number of Samples
for { for {
status.Attempts++ status.Attempts++
prog := gen.RandProgram(def.GlobalMemorySize, def.FunctionMemorySize, def.InstructionLimit) prog := gen.RandProgram(def.GlobalMemorySize, def.FunctionMemorySize, def.InstructionLimit)
score, err := def.Score(prog) score, err := def.score(prog)
if err != nil { if err != nil {
close(statusChan) if statusChan != nil {
close(statusChan)
}
return nil, err return nil, err
} }
@@ -58,14 +60,17 @@ func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) {
} }
if status.BestScore == status.TargetScore { if status.BestScore == status.TargetScore {
close(statusChan) if statusChan != nil {
close(statusChan)
}
return prog, nil return prog, nil
} }
} }
} }
} }
func (def *Definition) Score(prog *vm.Program) (uint64, error) { func (def *Definition) score(prog *vm.Program) (uint64, error) {
score := uint64(0) score := uint64(0)
for _, sample := range def.Samples { for _, sample := range def.Samples {
@@ -78,10 +83,18 @@ func (def *Definition) Score(prog *vm.Program) (uint64, error) {
state.Execute() // ignore error state.Execute() // ignore error
if sample.OutputsMatch(state) { score += sample.matchingOuts(state)
score += 1
}
} }
return score, nil return score, nil
} }
func (def *Definition) sumOuts() uint64 {
sum := uint64(0)
for _, sample := range def.Samples {
sum += uint64(len(sample.Out))
}
return sum
}

View File

@@ -13,12 +13,14 @@ func (s *Sample) SetInputs(state *vm.State) {
} }
} }
func (s *Sample) OutputsMatch(state *vm.State) bool { func (s *Sample) matchingOuts(state *vm.State) uint64 {
ret := uint64(0)
for i, val := range s.Out { for i, val := range s.Out {
if state.GlobalMemory().MustReadUnsigned(uint64(i)) != val { if state.GlobalMemory().MustReadUnsigned(uint64(i)) == val {
return false ret++
} }
} }
return true return ret
} }

View File

@@ -12,22 +12,17 @@ global_memory_size: 1
function_memory_size: 1 function_memory_size: 1
instruction_limit: 2 instruction_limit: 2
samples: samples:
- global_memory_inputs: - in: [0]
0: 0 out: [0]
global_memory_outputs:
0: 0 - in: [1]
- global_memory_inputs: out: [5]
0: 1
global_memory_outputs: - in: [2]
0: 5 out: [10]
- global_memory_inputs:
0: 2 - in: [100]
global_memory_outputs: out: [500]
0: 10
- global_memory_inputs:
0: 100
global_memory_outputs:
0: 500
`)) `))
def, err := grow.NewDefinition(r) def, err := grow.NewDefinition(r)
@@ -35,7 +30,7 @@ samples:
t.Fatal(err) t.Fatal(err)
} }
prog, err := def.Grow() prog, err := def.Grow(nil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }