/* 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 . */ /** * Miscellaneous utilities for use in yul-phaser's test cases. * * - Generic code that's only used in these particular tests. * - Convenience functions and wrappers to make tests more concise. * - Mocks and dummy objects/functions used in multiple test suites. * * Note that the code included here may be not as generic, robust and/or complete as it could be * since it's not meant for production use. If some utility seems useful enough to be moved to * the normal code base, you should review its implementation before doing so. */ #pragma once #include #include #include #include namespace solidity::phaser::test { // CHROMOSOME AND POPULATION HELPERS /// Assigns indices from 0 to N to all optimisation steps available in the OptimiserSuite. /// This is a convenience helper to make it easier to test their distribution with tools made for /// integers. std::map enumerateOptmisationSteps(); // STATISTICAL UTILITIES /// Calculates the mean value of a series of samples given in a vector. /// /// Supports any integer and real type as a convenience but the precision of the result is limited /// to the precision of type @a double as all the values are internally converted to it. /// /// This is a very simple, naive implementation that's more than enough for tests where we usually /// deal with relatively short sequences of small, positive integers. It's not numerically stable /// in more complicated cases. Don't use in production. template double mean(std::vector const& _samples) { assert(_samples.size() > 0); double sum = 0; for (T const& sample: _samples) sum += static_cast(sample); return sum / _samples.size(); } /// Calculates the sum of squared differences between @a _expectedValue and the values of a series /// of samples given in a vector. /// /// Supports any integer and real type as a convenience but the precision of the result is limited /// to the precision of type @a double as all the values are internally converted to it. /// /// This is a very simple, naive implementation that's more than enough for tests where we usually /// deal with relatively short sequences of small, positive integers. It's not numerically stable /// in more complicated cases. Don't use in production. template double meanSquaredError(std::vector const& _samples, double _expectedValue) { assert(_samples.size() > 0); double sumOfSquaredDifferences = 0; for (T const& sample: _samples) sumOfSquaredDifferences += (sample - _expectedValue) * (sample - _expectedValue); return sumOfSquaredDifferences / _samples.size(); } }