Current section
Files
Jump to
Current section
Files
lib/instructions/genome.ex
defmodule Elixush.Instructions.Genome do
import Elixush.Globals.Agent
import Elixush.PushState
def genome_gene_dup(state) do
if (not(Enum.empty?(state[:integer])) and not(Enum.empty?(state[:genome]))) and (not(Enum.empty?(stack_ref(:genome, 0, state))) and length(hd(state[:genome])) < (get_globals(:global_max_points) / 2)) do
genome = stack_ref(:genome, 0, state)
index = rem(stack_ref(:integer, 0, state), length(genome))
push_item(Enum.concat(Enum.take(genome, index + 1), Enum.drop(genome, index)), :genome, pop_item(:genome, pop_item(:integer, state)))
else
state
end
end
# def genome_gene_randomize(state) do
# if (not(Enum.empty?(state[:integer])) and not(Enum.empty?(state[:genome]))) and not(Enum.empty?(stack_ref(:genome, 0, state))) do
# genome = stack_ref(:genome, 0, state)
# index = rem(stack_ref(:integer, 0, state), length(genome))
# push_item(Enum.concat(Enum.take(genome, index + 1), Enum.drop(genome, index)), :genome, pop_item(:genome, pop_item(:integer, state)))
# else
# state
# end
# end
def genome_gene_delete(state) do
if (not(Enum.empty?(state[:integer])) and not(Enum.empty?(state[:genome]))) and not(Enum.empty?(stack_ref(:genome, 0, state))) do
genome = stack_ref(:genome, 0, state)
index = rem(stack_ref(:integer, 0, state), length(genome))
push_item(Enum.concat(Enum.take(genome, index), Enum.drop(genome, index + 1)), :genome, pop_item(:genome, pop_item(:integer, state)))
else
state
end
end
def genome_rotate(state) do
if (not(Enum.empty?(state[:integer])) and not(Enum.empty?(state[:genome]))) and not(Enum.empty?(stack_ref(:genome, 0, state))) do
genome = stack_ref(:genome, 0, state)
distance = rem(stack_ref(:integer, 0, state), length(genome))
push_item(Enum.concat(Enum.drop(genome, distance), Enum.take(genome, distance)), :genome, pop_item(:genome, pop_item(:integer, state)))
else
state
end
end
# TODO: Mostly done
# def genome_gene_copy(state) do
# if (not(Enum.empty?(state[:integer])) and not(Enum.empty?(state[:genome]))) and not(Enum.empty?(stack_ref(:genome, 1, state))) do
# source = stack_ref(:genome, 1, state)
# destination = stack_ref(:genome, 0, state)
# index = rem(stack_ref(:integer, 0, state), length(source))
# push_item(Enum.concat(Enum.drop(genome, distance), Enum.take(genome, distance)), :genome, pop_item(:genome, pop_item(:integer, state)))
# else
# state
# end
# end
def genome_new(state) do
push_item({}, :genome, state)
end
def genome_parent1(state) do
push_item(state[:parent1_genome], :genome, state)
end
def genome_parent2(state) do
push_item(state[:parent2_genome], :genome, state)
end
def autoconstructive_integer_rand(state) do
# pushes a constant integer, but is replaced with integer_rand during
# nondetermistic autoconstruction
push_item(0, :integer, state)
end
def autoconstructive_boolean_rand(state) do
# pushes false, but is replaced with boolean_rand during
# nondetermistic autoconstruction
push_item(false, :boolean, state)
end
end