diff --git a/test/yulPhaser/Chromosome.cpp b/test/yulPhaser/Chromosome.cpp index 824fe695e..509ad0036 100644 --- a/test/yulPhaser/Chromosome.cpp +++ b/test/yulPhaser/Chromosome.cpp @@ -63,11 +63,6 @@ vector const ChrOmOsoMeSteps{ BOOST_AUTO_TEST_SUITE(Phaser, *boost::unit_test::label("nooptions")) BOOST_AUTO_TEST_SUITE(ChromosomeTest) -BOOST_AUTO_TEST_CASE(constructor_should_convert_from_string_to_optimisation_steps) -{ - BOOST_TEST(Chromosome("ChrOmOsoMe").optimisationSteps() == ChrOmOsoMeSteps); -} - BOOST_AUTO_TEST_CASE(makeRandom_should_return_different_chromosome_each_time) { SimulationRNG::reset(1); @@ -95,6 +90,11 @@ BOOST_AUTO_TEST_CASE(makeRandom_should_use_every_possible_step_with_the_same_pro BOOST_TEST(abs(meanSquaredError(samples, expectedValue) - variance) < variance * relativeTolerance); } +BOOST_AUTO_TEST_CASE(constructor_should_store_genes) +{ + BOOST_TEST(Chromosome("ChrOmOsoMe").genes() == "ChrOmOsoMe"); +} + BOOST_AUTO_TEST_CASE(constructor_should_store_optimisation_steps) { vector steps = { @@ -102,9 +102,8 @@ BOOST_AUTO_TEST_CASE(constructor_should_store_optimisation_steps) BlockFlattener::name, UnusedPruner::name, }; - Chromosome chromosome(steps); - BOOST_TEST(steps == chromosome.optimisationSteps()); + BOOST_TEST(Chromosome(steps).genes() == "tfu"); } BOOST_AUTO_TEST_CASE(constructor_should_allow_duplicate_steps) @@ -116,9 +115,9 @@ BOOST_AUTO_TEST_CASE(constructor_should_allow_duplicate_steps) UnusedPruner::name, BlockFlattener::name, }; - Chromosome chromosome(steps); - BOOST_TEST(steps == chromosome.optimisationSteps()); + BOOST_TEST(Chromosome(steps).genes() == "ttfuf"); + BOOST_TEST(Chromosome("ttfuf").genes() == "ttfuf"); } BOOST_AUTO_TEST_CASE(output_operator_should_create_concise_and_unambiguous_string_representation) @@ -133,6 +132,11 @@ BOOST_AUTO_TEST_CASE(output_operator_should_create_concise_and_unambiguous_strin BOOST_TEST(toString(chromosome) == "flcCUnDvejsxIOoighTLMNrmVatpud"); } +BOOST_AUTO_TEST_CASE(optimisationSteps_should_translate_chromosomes_genes_to_optimisation_step_names) +{ + BOOST_TEST(Chromosome("ChrOmOsoMe").optimisationSteps() == ChrOmOsoMeSteps); +} + BOOST_AUTO_TEST_CASE(randomOptimisationStep_should_return_each_step_with_same_probability) { SimulationRNG::reset(1); diff --git a/test/yulPhaser/Mutations.cpp b/test/yulPhaser/Mutations.cpp index 1fe947f00..204efa603 100644 --- a/test/yulPhaser/Mutations.cpp +++ b/test/yulPhaser/Mutations.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -117,12 +118,7 @@ BOOST_AUTO_TEST_CASE(geneAddition_should_be_able_to_insert_before_first_position Chromosome mutatedChromosome = mutation(chromosome); BOOST_TEST(mutatedChromosome.length() > chromosome.length()); - - vector suffix( - mutatedChromosome.optimisationSteps().end() - static_cast(chromosome.length()), - mutatedChromosome.optimisationSteps().end() - ); - BOOST_TEST(suffix == chromosome.optimisationSteps()); + BOOST_TEST(boost::ends_with(mutatedChromosome.genes(), chromosome.genes())); } BOOST_AUTO_TEST_CASE(geneAddition_should_be_able_to_insert_after_last_position) @@ -133,12 +129,7 @@ BOOST_AUTO_TEST_CASE(geneAddition_should_be_able_to_insert_after_last_position) Chromosome mutatedChromosome = mutation(chromosome); BOOST_TEST(mutatedChromosome.length() > chromosome.length()); - - vector prefix( - mutatedChromosome.optimisationSteps().begin(), - mutatedChromosome.optimisationSteps().begin() + static_cast(chromosome.length()) - ); - BOOST_TEST(prefix == chromosome.optimisationSteps()); + BOOST_TEST(boost::starts_with(mutatedChromosome.genes(), chromosome.genes())); } BOOST_AUTO_TEST_CASE(geneAddition_should_return_identical_chromosome_if_probability_is_zero) diff --git a/tools/yulPhaser/Chromosome.cpp b/tools/yulPhaser/Chromosome.cpp index b7048ae61..c0e401800 100644 --- a/tools/yulPhaser/Chromosome.cpp +++ b/tools/yulPhaser/Chromosome.cpp @@ -48,7 +48,7 @@ Chromosome Chromosome::makeRandom(size_t _length) ostream& phaser::operator<<(ostream& _stream, Chromosome const& _chromosome) { - return _stream << Chromosome::stepsToGenes(_chromosome.m_optimisationSteps); + return _stream << _chromosome.m_genes; } vector Chromosome::allStepNames() diff --git a/tools/yulPhaser/Chromosome.h b/tools/yulPhaser/Chromosome.h index e97042041..0e7d1bb3f 100644 --- a/tools/yulPhaser/Chromosome.h +++ b/tools/yulPhaser/Chromosome.h @@ -42,17 +42,19 @@ class Chromosome public: Chromosome() = default; explicit Chromosome(std::vector _optimisationSteps): - m_optimisationSteps(std::move(_optimisationSteps)) {} - explicit Chromosome(std::string const& _genes): - m_optimisationSteps(genesToSteps(_genes)) {} + m_genes(stepsToGenes(_optimisationSteps)) {} + explicit Chromosome(std::string _genes): + m_genes(std::move(_genes)) {} static Chromosome makeRandom(size_t _length); - size_t length() const { return m_optimisationSteps.size(); } - std::vector const& optimisationSteps() const { return m_optimisationSteps; } + size_t length() const { return m_genes.size(); } + std::string const& genes() const { return m_genes; } + + std::vector optimisationSteps() const { return genesToSteps(m_genes); } friend std::ostream& operator<<(std::ostream& _stream, Chromosome const& _chromosome); - bool operator==(Chromosome const& _other) const { return m_optimisationSteps == _other.m_optimisationSteps; } + bool operator==(Chromosome const& _other) const { return m_genes == _other.m_genes; } bool operator!=(Chromosome const& _other) const { return !(*this == _other); } static std::string const& randomOptimisationStep(); @@ -62,7 +64,7 @@ public: private: static std::vector allStepNames(); - std::vector m_optimisationSteps; + std::string m_genes; }; } diff --git a/tools/yulPhaser/Mutations.cpp b/tools/yulPhaser/Mutations.cpp index f9d51744e..61614408d 100644 --- a/tools/yulPhaser/Mutations.cpp +++ b/tools/yulPhaser/Mutations.cpp @@ -120,19 +120,14 @@ ChromosomePair fixedPointSwap( assert(_crossoverPoint <= _chromosome1.length()); assert(_crossoverPoint <= _chromosome2.length()); - auto begin1 = _chromosome1.optimisationSteps().begin(); - auto begin2 = _chromosome2.optimisationSteps().begin(); - auto end1 = _chromosome1.optimisationSteps().end(); - auto end2 = _chromosome2.optimisationSteps().end(); - return { Chromosome( - vector(begin1, begin1 + static_cast(_crossoverPoint)) + - vector(begin2 + static_cast(_crossoverPoint), end2) + _chromosome1.genes().substr(0, _crossoverPoint) + + _chromosome2.genes().substr(_crossoverPoint, _chromosome2.length() - _crossoverPoint) ), Chromosome( - vector(begin2, begin2 + static_cast(_crossoverPoint)) + - vector(begin1 + static_cast(_crossoverPoint), end1) + _chromosome2.genes().substr(0, _crossoverPoint) + + _chromosome1.genes().substr(_crossoverPoint, _chromosome1.length() - _crossoverPoint) ), }; } @@ -197,24 +192,19 @@ ChromosomePair fixedTwoPointSwap( assert(_crossoverPoint2 <= _chromosome1.length()); assert(_crossoverPoint2 <= _chromosome2.length()); - auto lowPoint = static_cast(min(_crossoverPoint1, _crossoverPoint2)); - auto highPoint = static_cast(max(_crossoverPoint1, _crossoverPoint2)); - - auto begin1 = _chromosome1.optimisationSteps().begin(); - auto begin2 = _chromosome2.optimisationSteps().begin(); - auto end1 = _chromosome1.optimisationSteps().end(); - auto end2 = _chromosome2.optimisationSteps().end(); + size_t lowPoint = min(_crossoverPoint1, _crossoverPoint2); + size_t highPoint = max(_crossoverPoint1, _crossoverPoint2); return { Chromosome( - vector(begin1, begin1 + lowPoint) + - vector(begin2 + lowPoint, begin2 + highPoint) + - vector(begin1 + highPoint, end1) + _chromosome1.genes().substr(0, lowPoint) + + _chromosome2.genes().substr(lowPoint, highPoint - lowPoint) + + _chromosome1.genes().substr(highPoint, _chromosome1.length() - highPoint) ), Chromosome( - vector(begin2, begin2 + lowPoint) + - vector(begin1 + lowPoint, begin1 + highPoint) + - vector(begin2 + highPoint, end2) + _chromosome2.genes().substr(0, lowPoint) + + _chromosome1.genes().substr(lowPoint, highPoint - lowPoint) + + _chromosome2.genes().substr(highPoint, _chromosome2.length() - highPoint) ), }; } @@ -258,42 +248,37 @@ namespace ChromosomePair uniformSwap(Chromosome const& _chromosome1, Chromosome const& _chromosome2, double _swapChance) { - vector steps1; - vector steps2; + string steps1; + string steps2; size_t minLength = min(_chromosome1.length(), _chromosome2.length()); for (size_t i = 0; i < minLength; ++i) if (SimulationRNG::bernoulliTrial(_swapChance)) { - steps1.push_back(_chromosome2.optimisationSteps()[i]); - steps2.push_back(_chromosome1.optimisationSteps()[i]); + steps1.push_back(_chromosome2.genes()[i]); + steps2.push_back(_chromosome1.genes()[i]); } else { - steps1.push_back(_chromosome1.optimisationSteps()[i]); - steps2.push_back(_chromosome2.optimisationSteps()[i]); + steps1.push_back(_chromosome1.genes()[i]); + steps2.push_back(_chromosome2.genes()[i]); } - auto begin1 = _chromosome1.optimisationSteps().begin(); - auto begin2 = _chromosome2.optimisationSteps().begin(); - auto end1 = _chromosome1.optimisationSteps().end(); - auto end2 = _chromosome2.optimisationSteps().end(); - bool swapTail = SimulationRNG::bernoulliTrial(_swapChance); if (_chromosome1.length() > minLength) { if (swapTail) - steps2.insert(steps2.end(), begin1 + static_cast(minLength), end1); + steps2 += _chromosome1.genes().substr(minLength, _chromosome1.length() - minLength); else - steps1.insert(steps1.end(), begin1 + static_cast(minLength), end1); + steps1 += _chromosome1.genes().substr(minLength, _chromosome1.length() - minLength); } if (_chromosome2.length() > minLength) { if (swapTail) - steps1.insert(steps1.end(), begin2 + static_cast(minLength), end2); + steps1 += _chromosome2.genes().substr(minLength, _chromosome2.length() - minLength); else - steps2.insert(steps2.end(), begin2 + static_cast(minLength), end2); + steps2 += _chromosome2.genes().substr(minLength, _chromosome2.length() - minLength); } return {Chromosome(steps1), Chromosome(steps2)};