34 #ifndef MC2LIB_MCVERSI_HPP_ 35 #define MC2LIB_MCVERSI_HPP_ 54 template <
class URNG,
class RandInstTest,
class MemOperation>
61 URNG& urng,
const RandInstTest& test1,
const RandInstTest& test2,
64 assert(test1.get().size() == test2.get().size());
69 std::bernoulli_distribution mem_unconditional_select(
P_USEL_);
75 std::bernoulli_distribution nonmem_select1(faf1 +
P_USEL_ -
77 std::bernoulli_distribution nonmem_select2(faf2 + P_USEL_ -
82 const bool prefer_test2 = std::bernoulli_distribution(0.5)(urng);
86 std::bernoulli_distribution new_from_fitaddrs(
P_BFA_);
87 const auto all_fitaddrs = test1.fitaddrs() | test2.fitaddrs();
89 auto child = test1.get();
90 std::size_t mutations = 0;
92 for (std::size_t i = 0; i < child.size(); ++i) {
96 auto mem_op1 =
dynamic_cast<MemOperation*
>(test1.get()[i].get());
97 auto mem_op2 =
dynamic_cast<MemOperation*
>(test2.get()[i].get());
100 if (mem_op1 !=
nullptr) {
101 select1 = test1.fitaddrs().Contains(mem_op1->addr()) ||
102 mem_unconditional_select(urng);
104 select1 = nonmem_select1(urng);
107 if (mem_op2 !=
nullptr) {
108 select2 = test2.fitaddrs().Contains(mem_op2->addr()) ||
109 mem_unconditional_select(urng);
111 select2 = nonmem_select2(urng);
115 if (select1 && select2) {
117 child[i] = test2.get()[i];
119 }
else if (!select1 && select2) {
120 child[i] = test2.get()[i];
121 }
else if (!select1 && !select2) {
124 if (new_from_fitaddrs(urng)) {
127 child[i] = test1.MakeRandom(all_fitaddrs);
133 child[i] = test1.MakeRandom();
141 auto result = RandInstTest(test1, test2, child);
144 static_cast<float>(mutations) / static_cast<float>(child.size());
145 if (cur_mutation < mutation_rate) {
150 result.Mutate(mutation_rate);
155 container->push_back(std::move(result));
163 std::size_t mem_ops = 0;
164 std::size_t fitaddr_ops = 0;
166 for (
const auto& op : rit.get()) {
168 if (mem_op !=
nullptr) {
170 if (rit.fitaddrs().Contains(mem_op->addr())) {
176 return static_cast<double>(fitaddr_ops) / static_cast<double>(mem_ops);
double P_USEL_
Definition: mcversi.hpp:159
double P_BFA_
Definition: mcversi.hpp:160
void operator()(URNG &urng, const RandInstTest &test1, const RandInstTest &test2, float mutation_rate, typename simplega::GenePool< RandInstTest >::Population *container)
Definition: mcversi.hpp:60
std::list< GenomeT > Population
Definition: simplega.hpp:232
MemOp< Backend, EvtStateCats > MemOperation
Definition: armv7.hpp:212
Definition: mcversi.hpp:55
CrossoverMutate(double P_USEL, double P_BFA)
Definition: mcversi.hpp:57
double FitaddrFraction(const RandInstTest &rit)
Definition: mcversi.hpp:162