[yul-phaser] Add ProgramCacheFactory class

This commit is contained in:
Kamil Śliwak 2020-02-28 22:29:08 +01:00
parent e2ff9698d3
commit 3b49fbb8a5
3 changed files with 74 additions and 1 deletions

View File

@ -55,7 +55,7 @@ protected:
};
};
class FitnessMetricFactoryFixture
class FixtureWithPrograms
{
protected:
vector<CharStream> m_sourceStreams = {
@ -68,6 +68,11 @@ protected:
get<Program>(Program::load(m_sourceStreams[1])),
get<Program>(Program::load(m_sourceStreams[2])),
};
};
class FitnessMetricFactoryFixture: public FixtureWithPrograms
{
protected:
FitnessMetricFactory::Options m_options = {
/* metric = */ MetricChoice::CodeSize,
/* metricAggregator = */ MetricAggregatorChoice::Average,
@ -317,6 +322,35 @@ BOOST_FIXTURE_TEST_CASE(build_should_combine_populations_from_all_sources, Poula
BOOST_TEST(count(begin, end, Individual(Chromosome("fcL"), *m_fitnessMetric)) >= 2);
}
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE(ProgramCacheFactoryTest)
BOOST_FIXTURE_TEST_CASE(build_should_create_cache_for_each_input_program_if_cache_enabled, FixtureWithPrograms)
{
ProgramCacheFactory::Options options{/* programCacheEnabled = */ true};
vector<shared_ptr<ProgramCache>> caches = ProgramCacheFactory::build(options, m_programs);
assert(m_programs.size() >= 2 && "There must be at least 2 programs for this test to be meaningful");
BOOST_TEST(caches.size() == m_programs.size());
for (size_t i = 0; i < m_programs.size(); ++i)
{
BOOST_REQUIRE(caches[i] != nullptr);
BOOST_TEST(toString(caches[i]->program()) == toString(m_programs[i]));
}
}
BOOST_FIXTURE_TEST_CASE(build_should_return_nullptr_for_each_input_program_if_cache_disabled, FixtureWithPrograms)
{
ProgramCacheFactory::Options options{/* programCacheEnabled = */ false};
vector<shared_ptr<ProgramCache>> caches = ProgramCacheFactory::build(options, m_programs);
assert(m_programs.size() >= 2 && "There must be at least 2 programs for this test to be meaningful");
BOOST_TEST(caches.size() == m_programs.size());
for (size_t i = 0; i < m_programs.size(); ++i)
BOOST_TEST(caches[i] == nullptr);
}
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE(ProgramFactoryTest)

View File

@ -283,6 +283,25 @@ Population PopulationFactory::buildFromFile(
return buildFromStrings(readLinesFromFile(_filePath), move(_fitnessMetric));
}
ProgramCacheFactory::Options ProgramCacheFactory::Options::fromCommandLine(po::variables_map const& _arguments)
{
return {
_arguments["program-cache"].as<bool>(),
};
}
vector<shared_ptr<ProgramCache>> ProgramCacheFactory::build(
Options const& _options,
vector<Program> _programs
)
{
vector<shared_ptr<ProgramCache>> programCaches;
for (Program& program: _programs)
programCaches.push_back(_options.programCacheEnabled ? make_shared<ProgramCache>(move(program)) : nullptr);
return programCaches;
}
ProgramFactory::Options ProgramFactory::Options::fromCommandLine(po::variables_map const& _arguments)
{
return {

View File

@ -45,6 +45,7 @@ class FitnessMetric;
class GeneticAlgorithm;
class Population;
class Program;
class ProgramCache;
enum class Algorithm
{
@ -160,6 +161,25 @@ public:
);
};
/**
* Builds and validates instances of @a ProgramCache.
*/
class ProgramCacheFactory
{
public:
struct Options
{
bool programCacheEnabled;
static Options fromCommandLine(boost::program_options::variables_map const& _arguments);
};
static std::vector<std::shared_ptr<ProgramCache>> build(
Options const& _options,
std::vector<Program> _programs
);
};
/**
* Builds and validates instances of @a Program.
*/