mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
[yul-phaser] Extract ProgramBasedMetric base class from ProgramSize
This commit is contained in:
parent
bdc4d1ccd1
commit
0913fd1aac
@ -22,16 +22,26 @@
|
|||||||
|
|
||||||
#include <liblangutil/CharStream.h>
|
#include <liblangutil/CharStream.h>
|
||||||
|
|
||||||
|
#include <libsolutil/CommonIO.h>
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace solidity::langutil;
|
using namespace solidity::langutil;
|
||||||
|
using namespace solidity::util;
|
||||||
using namespace solidity::yul;
|
using namespace solidity::yul;
|
||||||
|
|
||||||
namespace solidity::phaser::test
|
namespace solidity::phaser::test
|
||||||
{
|
{
|
||||||
|
|
||||||
class FitnessMetricFixture
|
class DummyProgramBasedMetric: public ProgramBasedMetric
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using ProgramBasedMetric::ProgramBasedMetric;
|
||||||
|
size_t evaluate(Chromosome const&) const override { return 0; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class ProgramBasedMetricFixture
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
static constexpr char SampleSourceCode[] =
|
static constexpr char SampleSourceCode[] =
|
||||||
@ -68,9 +78,20 @@ protected:
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE(Phaser)
|
BOOST_AUTO_TEST_SUITE(Phaser)
|
||||||
BOOST_AUTO_TEST_SUITE(FitnessMetricsTest)
|
BOOST_AUTO_TEST_SUITE(FitnessMetricsTest)
|
||||||
|
BOOST_AUTO_TEST_SUITE(ProgramBasedMetricTest)
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_CASE(optimisedProgram_should_return_optimised_program, ProgramBasedMetricFixture)
|
||||||
|
{
|
||||||
|
string code = toString(DummyProgramBasedMetric(m_program).optimisedProgram(m_chromosome));
|
||||||
|
|
||||||
|
BOOST_TEST(code != toString(m_program));
|
||||||
|
BOOST_TEST(code == toString(m_optimisedProgram));
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
BOOST_AUTO_TEST_SUITE(ProgramSizeTest)
|
BOOST_AUTO_TEST_SUITE(ProgramSizeTest)
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(evaluate_should_compute_size_of_the_optimised_program, FitnessMetricFixture)
|
BOOST_FIXTURE_TEST_CASE(evaluate_should_compute_size_of_the_optimised_program, ProgramBasedMetricFixture)
|
||||||
{
|
{
|
||||||
size_t fitness = ProgramSize(m_program).evaluate(m_chromosome);
|
size_t fitness = ProgramSize(m_program).evaluate(m_chromosome);
|
||||||
|
|
||||||
@ -78,7 +99,7 @@ BOOST_FIXTURE_TEST_CASE(evaluate_should_compute_size_of_the_optimised_program, F
|
|||||||
BOOST_TEST(fitness == m_optimisedProgram.codeSize());
|
BOOST_TEST(fitness == m_optimisedProgram.codeSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(evaluate_should_repeat_the_optimisation_specified_number_of_times, FitnessMetricFixture)
|
BOOST_FIXTURE_TEST_CASE(evaluate_should_repeat_the_optimisation_specified_number_of_times, ProgramBasedMetricFixture)
|
||||||
{
|
{
|
||||||
Program const& programOptimisedOnce = m_optimisedProgram;
|
Program const& programOptimisedOnce = m_optimisedProgram;
|
||||||
Program programOptimisedTwice = optimisedProgram(programOptimisedOnce);
|
Program programOptimisedTwice = optimisedProgram(programOptimisedOnce);
|
||||||
@ -91,7 +112,7 @@ BOOST_FIXTURE_TEST_CASE(evaluate_should_repeat_the_optimisation_specified_number
|
|||||||
BOOST_TEST(fitness == programOptimisedTwice.codeSize());
|
BOOST_TEST(fitness == programOptimisedTwice.codeSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(evaluate_should_not_optimise_if_number_of_repetitions_is_zero, FitnessMetricFixture)
|
BOOST_FIXTURE_TEST_CASE(evaluate_should_not_optimise_if_number_of_repetitions_is_zero, ProgramBasedMetricFixture)
|
||||||
{
|
{
|
||||||
ProgramSize metric(m_program, 0);
|
ProgramSize metric(m_program, 0);
|
||||||
size_t fitness = metric.evaluate(m_chromosome);
|
size_t fitness = metric.evaluate(m_chromosome);
|
||||||
|
@ -20,11 +20,16 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace solidity::phaser;
|
using namespace solidity::phaser;
|
||||||
|
|
||||||
size_t ProgramSize::evaluate(Chromosome const& _chromosome) const
|
Program ProgramBasedMetric::optimisedProgram(Chromosome const& _chromosome) const
|
||||||
{
|
{
|
||||||
Program programCopy = m_program;
|
Program programCopy = m_program;
|
||||||
for (size_t i = 0; i < m_repetitionCount; ++i)
|
for (size_t i = 0; i < m_repetitionCount; ++i)
|
||||||
programCopy.optimise(_chromosome.optimisationSteps());
|
programCopy.optimise(_chromosome.optimisationSteps());
|
||||||
|
|
||||||
return programCopy.codeSize();
|
return programCopy;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ProgramSize::evaluate(Chromosome const& _chromosome) const
|
||||||
|
{
|
||||||
|
return optimisedProgram(_chromosome).codeSize();
|
||||||
}
|
}
|
||||||
|
@ -47,24 +47,44 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fitness metric based on the size of a specific program after applying the optimisations from the
|
* Abstract base class for fitness metrics that return values based on program size.
|
||||||
* chromosome to it.
|
*
|
||||||
|
* The class provides utilities for optimising programs according to the information stored in
|
||||||
|
* chromosomes.
|
||||||
|
*
|
||||||
|
* It can also store weights for the @a CodeSize metric. It does not do anything with
|
||||||
|
* them because it does not actually compute the code size but they are readily available for use
|
||||||
|
* by derived classes.
|
||||||
*/
|
*/
|
||||||
class ProgramSize: public FitnessMetric
|
class ProgramBasedMetric: public FitnessMetric
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit ProgramSize(Program _program, size_t _repetitionCount = 1):
|
explicit ProgramBasedMetric(
|
||||||
|
Program _program,
|
||||||
|
size_t _repetitionCount = 1
|
||||||
|
):
|
||||||
m_program(std::move(_program)),
|
m_program(std::move(_program)),
|
||||||
m_repetitionCount(_repetitionCount) {}
|
m_repetitionCount(_repetitionCount) {}
|
||||||
|
|
||||||
Program const& program() const { return m_program; }
|
Program const& program() const { return m_program; }
|
||||||
size_t repetitionCount() const { return m_repetitionCount; }
|
size_t repetitionCount() const { return m_repetitionCount; }
|
||||||
|
|
||||||
size_t evaluate(Chromosome const& _chromosome) const override;
|
Program optimisedProgram(Chromosome const& _chromosome) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Program m_program;
|
Program m_program;
|
||||||
size_t m_repetitionCount;
|
size_t m_repetitionCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fitness metric based on the size of a specific program after applying the optimisations from the
|
||||||
|
* chromosome to it.
|
||||||
|
*/
|
||||||
|
class ProgramSize: public ProgramBasedMetric
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using ProgramBasedMetric::ProgramBasedMetric;
|
||||||
|
size_t evaluate(Chromosome const& _chromosome) const override;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user