Switch to add/remove instruction mutation
This commit is contained in:
@@ -2,13 +2,13 @@ package gen
|
||||
|
||||
import "github.com/firestuff/subcoding/vm"
|
||||
|
||||
func randInstruction(prog *vm.Program) *vm.Instruction {
|
||||
func RandInstruction(prog *vm.Program) *vm.Instruction {
|
||||
instr := &vm.Instruction{
|
||||
OpCode: randOpCode(),
|
||||
OpCode: RandOpCode(),
|
||||
}
|
||||
|
||||
for i, t := range vm.OperandsByOpCode[instr.OpCode] {
|
||||
instr.Operands[i] = randOperand(prog, t)
|
||||
instr.Operands[i] = RandOperand(prog, t)
|
||||
}
|
||||
|
||||
return instr
|
||||
|
||||
@@ -48,7 +48,7 @@ var opCodes = []vm.OpCodeType{
|
||||
vm.OpSqrt,
|
||||
}
|
||||
|
||||
func randOpCode() vm.OpCodeType {
|
||||
func RandOpCode() vm.OpCodeType {
|
||||
// Uniform distribution
|
||||
return opCodes[rand.Intn(len(opCodes))]
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import "math/rand"
|
||||
|
||||
import "github.com/firestuff/subcoding/vm"
|
||||
|
||||
func randOperand(prog *vm.Program, t vm.OperandNumericType) *vm.Operand {
|
||||
func RandOperand(prog *vm.Program, t vm.OperandNumericType) *vm.Operand {
|
||||
for {
|
||||
op := &vm.Operand{
|
||||
Type: randOperandType(),
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package gen
|
||||
|
||||
import "github.com/firestuff/subcoding/vm"
|
||||
|
||||
func RandProgram(globalMemorySize, functionMemorySize, instructionLimit uint64) *vm.Program {
|
||||
prog := &vm.Program{
|
||||
GlobalMemorySize: globalMemorySize,
|
||||
FunctionMemorySize: functionMemorySize,
|
||||
InstructionLimit: instructionLimit,
|
||||
}
|
||||
|
||||
prog.Functions = append(prog.Functions, &vm.Function{
|
||||
Instructions: []*vm.Instruction{
|
||||
randInstruction(prog),
|
||||
},
|
||||
})
|
||||
|
||||
return prog
|
||||
}
|
||||
@@ -4,7 +4,6 @@ import "io"
|
||||
|
||||
import "gopkg.in/yaml.v2"
|
||||
|
||||
import "github.com/firestuff/subcoding/gen"
|
||||
import "github.com/firestuff/subcoding/vm"
|
||||
|
||||
type Definition struct {
|
||||
@@ -37,10 +36,19 @@ func (def *Definition) Grow(statusChan chan<- Status) (*vm.Program, error) {
|
||||
statusChan <- status
|
||||
}
|
||||
|
||||
prog := &vm.Program{
|
||||
GlobalMemorySize: def.GlobalMemorySize,
|
||||
FunctionMemorySize: def.FunctionMemorySize,
|
||||
InstructionLimit: def.InstructionLimit,
|
||||
Functions: []*vm.Function{
|
||||
&vm.Function{},
|
||||
},
|
||||
}
|
||||
|
||||
for {
|
||||
status.Attempts++
|
||||
|
||||
prog := gen.RandProgram(def.GlobalMemorySize, def.FunctionMemorySize, def.InstructionLimit)
|
||||
Mutate(prog)
|
||||
|
||||
score, err := def.score(prog)
|
||||
if err != nil {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
global_memory_size: 1
|
||||
function_memory_size: 1
|
||||
instruction_limit: 2
|
||||
instruction_limit: 10
|
||||
samples:
|
||||
- in: [0]
|
||||
out: [0]
|
||||
|
||||
36
grow/mutate.go
Normal file
36
grow/mutate.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package grow
|
||||
|
||||
import "math"
|
||||
import "math/rand"
|
||||
|
||||
import "github.com/firestuff/subcoding/gen"
|
||||
import "github.com/firestuff/subcoding/vm"
|
||||
|
||||
func Mutate(prog *vm.Program) {
|
||||
target := int(math.Max(2, rand.NormFloat64()*10+15))
|
||||
|
||||
if len(prog.Functions[0].Instructions) < target {
|
||||
addInstruction(prog, prog.Functions[0])
|
||||
} else {
|
||||
removeInstruction(prog, prog.Functions[0])
|
||||
}
|
||||
}
|
||||
|
||||
func addInstruction(prog *vm.Program, fnc *vm.Function) {
|
||||
if len(fnc.Instructions) == 0 {
|
||||
fnc.Instructions = append(fnc.Instructions, gen.RandInstruction(prog))
|
||||
} else {
|
||||
i := rand.Intn(len(fnc.Instructions))
|
||||
fnc.Instructions = append(fnc.Instructions[:i+1], fnc.Instructions[i:]...)
|
||||
fnc.Instructions[i] = gen.RandInstruction(prog)
|
||||
}
|
||||
}
|
||||
|
||||
func removeInstruction(prog *vm.Program, fnc *vm.Function) {
|
||||
if len(fnc.Instructions) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
i := rand.Intn(len(fnc.Instructions))
|
||||
fnc.Instructions = append(fnc.Instructions[:i], fnc.Instructions[i+1:]...)
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package test
|
||||
|
||||
import "testing"
|
||||
|
||||
import "github.com/firestuff/subcoding/gen"
|
||||
|
||||
func TestRandProgram(t *testing.T) {
|
||||
gen.RandProgram(4, 4, 0)
|
||||
}
|
||||
Reference in New Issue
Block a user