From 096129fbc47fa07c6189b415e7515e171fd6964a Mon Sep 17 00:00:00 2001 From: cameel Date: Wed, 5 Feb 2020 14:56:55 +0100 Subject: [PATCH] [yul-phaser] Base class for fitness metrics --- test/CMakeLists.txt | 1 + tools/CMakeLists.txt | 2 ++ tools/yulPhaser/FitnessMetrics.cpp | 18 +++++++++++ tools/yulPhaser/FitnessMetrics.h | 48 ++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 tools/yulPhaser/FitnessMetrics.cpp create mode 100644 tools/yulPhaser/FitnessMetrics.h diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 37a78287d..d7ac67114 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -151,6 +151,7 @@ set(yul_phaser_sources # My current workaround is just to include its source files here but this introduces # unnecessary duplication. Create a library or find a way to reuse the list in both places. ../tools/yulPhaser/Chromosome.cpp + ../tools/yulPhaser/FitnessMetrics.cpp ../tools/yulPhaser/Population.cpp ../tools/yulPhaser/Program.cpp ../tools/yulPhaser/SimulationRNG.cpp diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index cd33c4006..d3101ad7b 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -17,6 +17,8 @@ add_executable(yul-phaser yulPhaser/main.cpp yulPhaser/Population.h yulPhaser/Population.cpp + yulPhaser/FitnessMetrics.h + yulPhaser/FitnessMetrics.cpp yulPhaser/Chromosome.h yulPhaser/Chromosome.cpp yulPhaser/Program.h diff --git a/tools/yulPhaser/FitnessMetrics.cpp b/tools/yulPhaser/FitnessMetrics.cpp new file mode 100644 index 000000000..a1014476b --- /dev/null +++ b/tools/yulPhaser/FitnessMetrics.cpp @@ -0,0 +1,18 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ + +#include diff --git a/tools/yulPhaser/FitnessMetrics.h b/tools/yulPhaser/FitnessMetrics.h new file mode 100644 index 000000000..712ae1ab5 --- /dev/null +++ b/tools/yulPhaser/FitnessMetrics.h @@ -0,0 +1,48 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ +/** + * Contains an abstract base class representing a fitness metric and its concrete implementations. + */ + +#pragma once + +#include + +#include + +namespace solidity::phaser +{ + +/** + * Abstract base class for fitness metrics. + * + * The main feature is the @a evaluate() method that can tell how good a given chromosome is. + * The lower the value, the better the fitness is. The result should be deterministic and depend + * only on the chromosome and metric's state (which is constant). + */ +class FitnessMetric +{ +public: + FitnessMetric() = default; + FitnessMetric(FitnessMetric const&) = delete; + FitnessMetric& operator=(FitnessMetric const&) = delete; + virtual ~FitnessMetric() = default; + + virtual size_t evaluate(Chromosome const& _chromosome) const = 0; +}; + +}