diff --git a/include/aidge/graph/Testing.hpp b/include/aidge/graph/Testing.hpp index 06bbd0f554bab0b9a5ef123dc287c2397258fae3..ecacdf66298cb83c919ad447c82463206836a3e9 100644 --- a/include/aidge/graph/Testing.hpp +++ b/include/aidge/graph/Testing.hpp @@ -12,11 +12,11 @@ #ifndef AIDGE_CORE_GRAPH_TESTING_H_ #define AIDGE_CORE_GRAPH_TESTING_H_ +#include <cstddef> #include <vector> #include <set> -#include <random> -#include <algorithm> -#include <utility> +#include <random> // std::mt19937::result_type +#include <utility> // std::pair #include "aidge/graph/Node.hpp" #include "aidge/utils/Types.h" @@ -31,11 +31,11 @@ struct RandomGraph { /// @brief Connection density (between 0 and 1) float density = 0.5; /// @brief Max number of inputs per node (regardless if they are connected or not) - size_t maxIn = 5; + std::size_t maxIn = 5; /// @brief Average number of inputs per node (regardless if they are connected or not) float avgIn = 1.5; /// @brief Max number of outputs per node (regardless if they are connected or not) - size_t maxOut = 2; + std::size_t maxOut = 2; /// @brief Average number of outputs per node (regardless if they are connected or not) float avgOut = 1.1; /// @brief List of node types that should be generated in the graph (as GenericOperator) @@ -47,11 +47,11 @@ struct RandomGraph { /** * Generate a DAG according to the parameters of the class. - * @param seed Random seed. For an identical seed, an identical topology is + * @param seed Random seed. For an identical seed, an identical topology is * generated, but with a random node ordering in the return set of nodes. * @param nbNodes Number of nodes to generate. */ - std::pair<NodePtr, std::set<NodePtr>> gen(std::mt19937::result_type seed, size_t nbNodes) const; + std::pair<NodePtr, std::set<NodePtr>> gen(std::mt19937::result_type seed, std::size_t nbNodes) const; }; std::string nodePtrToType(NodePtr node); @@ -61,6 +61,7 @@ std::set<std::string> nodePtrTo(const std::set<NodePtr>& nodes, std::vector<std::pair<std::string, IOIndex_t>> nodePtrTo( const std::vector<std::pair<NodePtr, IOIndex_t>>& nodes, std::string(*nodeTo)(NodePtr) = nodePtrToType); -} + +} // namespace Aidge #endif /* AIDGE_CORE_GRAPH_TESTING_H_ */ diff --git a/src/graph/Testing.cpp b/src/graph/Testing.cpp index ad193f000b787c458b29934e8b95c122ef15f409..f30ad6e25b81e1ce7768fcc201ddf00c2226eebf 100644 --- a/src/graph/Testing.cpp +++ b/src/graph/Testing.cpp @@ -9,46 +9,56 @@ * ********************************************************************************/ +#include <algorithm> // std::shuffle, std::transform +#include <cstddef> +#include <memory> +#include <numeric> // std::iota +#include <random> // std::binomial_distribution, std::mt19937, std::discrete_distribution +#include <string> +#include <utility> // std::pair +#include <vector> + #include "aidge/graph/Testing.hpp" #include "aidge/operator/GenericOperator.hpp" +#include "aidge/utils/Types.h" -std::pair<Aidge::NodePtr, std::set<Aidge::NodePtr>> Aidge::RandomGraph::gen(std::mt19937::result_type seed, size_t nbNodes) const { +std::pair<Aidge::NodePtr, std::set<Aidge::NodePtr>> Aidge::RandomGraph::gen(std::mt19937::result_type seed, std::size_t nbNodes) const { std::mt19937 gen(seed); std::binomial_distribution<> dIn(maxIn - 1, avgIn/maxIn); std::binomial_distribution<> dOut(maxOut - 1, avgOut/maxOut); std::binomial_distribution<> dLink(1, density); std::discrete_distribution<> dType(typesWeights.begin(), typesWeights.end()); - std::vector<std::pair<int, int>> nbIOs; + std::vector<std::pair<IOIndex_t, IOIndex_t>> nbIOs; std::vector<std::string> nodesType; - for (size_t i = 0; i < nbNodes; ++i) { + for (std::size_t i = 0; i < nbNodes; ++i) { const auto nbIn = 1 + dIn(gen); nbIOs.push_back(std::make_pair(nbIn, 1 + dOut(gen))); nodesType.push_back(types[dType(gen)]); } - std::vector<int> nodesSeq(nbNodes); - std::iota(nodesSeq.begin(), nodesSeq.end(), 0); + std::vector<std::size_t> nodesSeq(nbNodes); + std::iota(nodesSeq.begin(), nodesSeq.end(), static_cast<std::size_t>(0)); // Don't use gen or seed here, must be different each time! std::shuffle(nodesSeq.begin(), nodesSeq.end(), std::default_random_engine(std::random_device{}())); std::vector<NodePtr> nodes(nbNodes, nullptr); for (auto idx : nodesSeq) { const std::string name = nodesType[idx] + std::to_string(idx); - nodes[idx] = GenericOperator(nodesType[idx].c_str(), nbIOs[idx].first, 0, nbIOs[idx].second, name.c_str()); + nodes[idx] = GenericOperator(nodesType[idx], nbIOs[idx].first, 0, nbIOs[idx].second, name); } - for (size_t i = 0; i < nbNodes; ++i) { - for (size_t j = (acyclic) ? i + 1 : 0; j < nbNodes; ++j) { + for (std::size_t i = 0; i < nbNodes; ++i) { + for (std::size_t j = (acyclic) ? i + 1 : 0; j < nbNodes; ++j) { if (i == j) { // Do not connected node to itself in case of cyclic graph! continue; } - for (size_t outId = 0; outId < nodes[i]->nbOutputs(); ++outId) { - for (size_t inId = 0; inId < nodes[j]->nbInputs(); ++inId) { + for (std::size_t outId = 0; outId < nodes[i]->nbOutputs(); ++outId) { + for (std::size_t inId = 0; inId < nodes[j]->nbInputs(); ++inId) { if (dLink(gen)) { - // Warning: connections can be set multiple time for the + // Warning: connections can be set multiple time for the // same node input! In this case, the previous connection // is overwritten. This is the expected behavior. nodes[i]->addChild(nodes[j], outId, inId); @@ -82,7 +92,7 @@ std::pair<Aidge::NodePtr, std::set<Aidge::NodePtr>> Aidge::RandomGraph::gen(std: NodePtr rootNode = nullptr; std::set<NodePtr> nodesSet; - for (size_t i = 0; i < nbNodes; ++i) { + for (std::size_t i = 0; i < nbNodes; ++i) { if (nodes[i]->type() != omitType) { if (rootNode == nullptr) { rootNode = nodes[i];