##// END OF EJS Templates
Randomizes the number of operations to wait between calling validation (defines min/max frequencies)
Randomizes the number of operations to wait between calling validation (defines min/max frequencies)

File last commit:

r1244:7202dffeda15
r1244:7202dffeda15
Show More
FuzzingDefs.cpp
108 lines | 3.6 KiB | text/x-c | CppLexer
#include "FuzzingDefs.h"
const QString NB_MAX_OPERATIONS_PROPERTY = QStringLiteral("component");
const QString NB_MAX_SYNC_GROUPS_PROPERTY = QStringLiteral("nbSyncGroups");
const QString NB_MAX_VARIABLES_PROPERTY = QStringLiteral("nbMaxVariables");
const QString AVAILABLE_OPERATIONS_PROPERTY = QStringLiteral("availableOperations");
const QString CACHE_TOLERANCE_PROPERTY = QStringLiteral("cacheTolerance");
const QString INITIAL_RANGE_PROPERTY = QStringLiteral("initialRange");
const QString MAX_RANGE_PROPERTY = QStringLiteral("maxRange");
const QString METADATA_POOL_PROPERTY = QStringLiteral("metadataPool");
const QString PROVIDER_PROPERTY = QStringLiteral("provider");
const QString OPERATION_DELAY_BOUNDS_PROPERTY = QStringLiteral("operationDelays");
const QString VALIDATORS_PROPERTY = QStringLiteral("validators");
const QString VALIDATION_FREQUENCY_BOUNDS_PROPERTY = QStringLiteral("validationFrequencyBounds");
// //////////// //
// FuzzingState //
// //////////// //
const SyncGroup &FuzzingState::syncGroup(SyncGroupId id) const
{
return m_SyncGroupsPool.at(id);
}
SyncGroup &FuzzingState::syncGroup(SyncGroupId id)
{
return m_SyncGroupsPool.at(id);
}
const VariableState &FuzzingState::variableState(VariableId id) const
{
return m_VariablesPool.at(id);
}
VariableState &FuzzingState::variableState(VariableId id)
{
return m_VariablesPool.at(id);
}
SyncGroupId FuzzingState::syncGroupId(VariableId variableId) const
{
auto end = m_SyncGroupsPool.cend();
auto it
= std::find_if(m_SyncGroupsPool.cbegin(), end, [&variableId](const auto &syncGroupEntry) {
const auto &syncGroup = syncGroupEntry.second;
return syncGroup.m_Variables.find(variableId) != syncGroup.m_Variables.end();
});
return it != end ? it->first : SyncGroupId{};
}
std::vector<SyncGroupId> FuzzingState::syncGroupsIds() const
{
std::vector<SyncGroupId> result{};
for (const auto &entry : m_SyncGroupsPool) {
result.push_back(entry.first);
}
return result;
}
void FuzzingState::synchronizeVariable(VariableId variableId, SyncGroupId syncGroupId)
{
if (syncGroupId.isNull()) {
return;
}
// Registers variable into sync group: if it's the first variable, sets the variable range as
// the sync group range
auto &syncGroup = m_SyncGroupsPool.at(syncGroupId);
syncGroup.m_Variables.insert(variableId);
if (syncGroup.m_Variables.size() == 1) {
auto &variableState = m_VariablesPool.at(variableId);
syncGroup.m_Range = variableState.m_Range;
}
}
void FuzzingState::desynchronizeVariable(VariableId variableId, SyncGroupId syncGroupId)
{
if (syncGroupId.isNull()) {
return;
}
// Unregisters variable from sync group: if there is no more variable in the group, resets the
// range
auto &syncGroup = m_SyncGroupsPool.at(syncGroupId);
syncGroup.m_Variables.erase(variableId);
if (syncGroup.m_Variables.empty()) {
syncGroup.m_Range = INVALID_RANGE;
}
}
void FuzzingState::updateRanges(VariableId variableId, const SqpRange &newRange)
{
auto syncGroupId = this->syncGroupId(variableId);
// Retrieves the variables to update:
// - if the variable is synchronized to others, updates all synchronized variables
// - otherwise, updates only the variable
auto variablesToUpdate = syncGroupId.isNull() ? std::set<VariableId>{variableId}
: m_SyncGroupsPool.at(syncGroupId).m_Variables;
// Sets new range
for (const auto &variableId : variablesToUpdate) {
m_VariablesPool.at(variableId).m_Range = newRange;
}
}