Introduce a piecewise constant dist over [-1, 1]

This commit is contained in:
Bhargava Shastry 2022-02-07 16:28:31 +01:00
parent cb1e6b3179
commit 30550429eb
3 changed files with 23 additions and 5 deletions

View File

@ -63,7 +63,7 @@ size_t LPSolverCustomMutatorInterface::generate()
string testCase = generator->generate(); string testCase = generator->generate();
solAssert( solAssert(
!testCase.empty() && data, !testCase.empty() && data,
"Solc custom mutator: Invalid mutant or memory pointer" "LP constraints custom mutator: Invalid mutant or memory pointer"
); );
size_t mutantSize = min(testCase.size(), maxMutantSize - 1); size_t mutantSize = min(testCase.size(), maxMutantSize - 1);
mempcpy(data, testCase.data(), mutantSize); mempcpy(data, testCase.data(), mutantSize);

View File

@ -30,8 +30,11 @@ string ConstraintGenerator::generate()
{ {
// First entry is always constraint type. If it is equal to "1", it is an equality constraint // First entry is always constraint type. If it is equal to "1", it is an equality constraint
// otherwise an less-than-equal constraint. // otherwise an less-than-equal constraint.
constraint += to_string(randomBool()); constraint += to_string(zeroOrOne());
for (int j = 0; j < numFactors(); j++) for (int j = 0; j < numFactors(); j++)
if (bernoulliDist(s_piecewiseConstantProb))
constraint += "," + to_string(randomMinusOneToOne());
else
constraint += "," + to_string(randomInteger()); constraint += "," + to_string(randomInteger());
constraint += "\n"; constraint += "\n";
} }

View File

@ -28,6 +28,7 @@ namespace solidity::test::fuzzer::lpsolver
using RandomEngine = std::mt19937; using RandomEngine = std::mt19937;
using Distribution = std::uniform_int_distribution<int>; using Distribution = std::uniform_int_distribution<int>;
using Bernoulli = std::bernoulli_distribution;
struct ConstraintGenerator struct ConstraintGenerator
{ {
@ -54,18 +55,32 @@ struct ConstraintGenerator
return Distribution(std::numeric_limits<int>::min(), std::numeric_limits<int>::max())(*prng); return Distribution(std::numeric_limits<int>::min(), std::numeric_limits<int>::max())(*prng);
} }
/// @returns a boolean integer [0, 1] /// @returns an integer in the range [-1, 1] chosen uniformly at random.
int randomBool() int randomMinusOneToOne()
{
return Distribution(-1, 1)(*prng);
}
/// @returns zero or one with a probability of occurance of 0.5 each.
int zeroOrOne()
{ {
return Distribution(0, 1)(*prng); return Distribution(0, 1)(*prng);
} }
/// @returns true with a probability @param _p, false otherwise.
bool bernoulliDist(double _truthProbability)
{
return Bernoulli(_truthProbability)(*prng);
}
std::shared_ptr<RandomEngine> prng; std::shared_ptr<RandomEngine> prng;
static constexpr int s_minFactors = 2; static constexpr int s_minFactors = 2;
static constexpr int s_maxFactors = 10; static constexpr int s_maxFactors = 10;
static constexpr int s_minConstraints = 1; static constexpr int s_minConstraints = 1;
static constexpr int s_maxConstraints = 10; static constexpr int s_maxConstraints = 10;
static constexpr double s_piecewiseConstantProb = 0.25;
}; };
} }