Combine into definition file
This commit is contained in:
@@ -4,6 +4,9 @@ import "io"
|
|||||||
|
|
||||||
import "gopkg.in/yaml.v2"
|
import "gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
import "github.com/firestuff/subcoding/gen"
|
||||||
|
import "github.com/firestuff/subcoding/vm"
|
||||||
|
|
||||||
type Definition struct {
|
type Definition struct {
|
||||||
GlobalMemorySize uint64 `yaml:"global_memory_size"`
|
GlobalMemorySize uint64 `yaml:"global_memory_size"`
|
||||||
FunctionMemorySize uint64 `yaml:"function_memory_size"`
|
FunctionMemorySize uint64 `yaml:"function_memory_size"`
|
||||||
@@ -24,3 +27,61 @@ func NewDefinition(r io.Reader) (*Definition, error) {
|
|||||||
|
|
||||||
return def, nil
|
return def, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) {
|
||||||
|
status := Status{
|
||||||
|
TargetScore: uint64(len(def.Samples)),
|
||||||
|
}
|
||||||
|
|
||||||
|
if statusChan != nil {
|
||||||
|
statusChan <- status
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Score should be number of output criteria, not number of Samples
|
||||||
|
for {
|
||||||
|
status.Attempts++
|
||||||
|
|
||||||
|
prog := gen.RandProgram(def.GlobalMemorySize, def.FunctionMemorySize, def.InstructionLimit)
|
||||||
|
|
||||||
|
score, err := def.Score(prog)
|
||||||
|
if err != nil {
|
||||||
|
close(statusChan)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if score > status.BestScore {
|
||||||
|
status.BestScore = score
|
||||||
|
status.BestProgram = prog
|
||||||
|
|
||||||
|
if statusChan != nil {
|
||||||
|
statusChan <- status
|
||||||
|
}
|
||||||
|
|
||||||
|
if status.BestScore == status.TargetScore {
|
||||||
|
close(statusChan)
|
||||||
|
return prog, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (def *Definition) Score(prog *vm.Program) (uint64, error) {
|
||||||
|
score := uint64(0)
|
||||||
|
|
||||||
|
for _, sample := range def.Samples {
|
||||||
|
state, err := vm.NewState(prog)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sample.SetInputs(state)
|
||||||
|
|
||||||
|
state.Execute() // ignore error
|
||||||
|
|
||||||
|
if sample.OutputsMatch(state) {
|
||||||
|
score += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return score, nil
|
||||||
|
}
|
||||||
|
|||||||
62
grow/grow.go
62
grow/grow.go
@@ -1,62 +0,0 @@
|
|||||||
package grow
|
|
||||||
|
|
||||||
import "github.com/firestuff/subcoding/gen"
|
|
||||||
import "github.com/firestuff/subcoding/vm"
|
|
||||||
|
|
||||||
func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) {
|
|
||||||
status := Status{
|
|
||||||
TargetScore: uint64(len(def.Samples)),
|
|
||||||
}
|
|
||||||
|
|
||||||
if statusChan != nil {
|
|
||||||
statusChan <- status
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Score should be number of output criteria, not number of Samples
|
|
||||||
for {
|
|
||||||
status.Attempts++
|
|
||||||
|
|
||||||
prog := gen.RandProgram(def.GlobalMemorySize, def.FunctionMemorySize, def.InstructionLimit)
|
|
||||||
|
|
||||||
score, err := def.Score(prog)
|
|
||||||
if err != nil {
|
|
||||||
close(statusChan)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if score > status.BestScore {
|
|
||||||
status.BestScore = score
|
|
||||||
status.BestProgram = prog
|
|
||||||
|
|
||||||
if statusChan != nil {
|
|
||||||
statusChan <- status
|
|
||||||
}
|
|
||||||
|
|
||||||
if status.BestScore == status.TargetScore {
|
|
||||||
close(statusChan)
|
|
||||||
return prog, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (def *Definition) Score(prog *vm.Program) (uint64, error) {
|
|
||||||
score := uint64(0)
|
|
||||||
|
|
||||||
for _, sample := range def.Samples {
|
|
||||||
state, err := vm.NewState(prog)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sample.SetInputs(state)
|
|
||||||
|
|
||||||
state.Execute() // ignore error
|
|
||||||
|
|
||||||
if sample.OutputsMatch(state) {
|
|
||||||
score += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return score, nil
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user