Score on criteria count, not sample count
This commit is contained in:
@@ -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 {
|
||||||
|
if statusChan != nil {
|
||||||
close(statusChan)
|
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 {
|
||||||
|
if statusChan != nil {
|
||||||
close(statusChan)
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user