From 69bb15f647f6fd1a0e83c10e6b976956216b2630 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 9 Aug 2016 13:32:00 +0200 Subject: [PATCH] single nonlinear variable param of random generator of nonlinear ranked patterns --- .../src/tree/generate/RandomTreeFactory.cpp | 20 ++++++++++++------- .../src/tree/generate/RandomTreeFactory.h | 2 +- arand2/src/arand.cpp | 7 +++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.cpp b/alib2algo/src/tree/generate/RandomTreeFactory.cpp index 9bb7cffe5d..a77aadb791 100644 --- a/alib2algo/src/tree/generate/RandomTreeFactory.cpp +++ b/alib2algo/src/tree/generate/RandomTreeFactory.cpp @@ -160,15 +160,18 @@ struct Node { } } - RankedNode createRankedNonlinearPatternNode ( ) { + RankedNode createRankedNonlinearPatternNode ( bool singleNonlinearVariable ) { if ( rank == 0 ) { - return RankedNode ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( symbol ) ), 0 ), { } ); + if ( singleNonlinearVariable ) + return RankedNode ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( "A" ) ) ), 0 ), { } ); + else + return RankedNode ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( symbol ) ), 0 ), { } ); } else { std::vector < std::smart_ptr < RankedNode > > children; Node * nextChild = child; for ( int i = 0; i < rank; i++ ) { - children.emplace_back ( std::make_smart < RankedNode > ( nextChild->createRankedNonlinearPatternNode ( ) ) ); + children.emplace_back ( std::make_smart < RankedNode > ( nextChild->createRankedNonlinearPatternNode ( singleNonlinearVariable ) ) ); nextChild = nextChild->right; } @@ -352,7 +355,7 @@ RankedPattern RandomTreeFactory::generateRankedPattern ( int depth, int nodesCou return tree; } -RankedNonlinearPattern RandomTreeFactory::generateRankedNonlinearPattern ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, int maxRank ) { +RankedNonlinearPattern RandomTreeFactory::generateRankedNonlinearPattern ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, bool singleNonlinearVariable, int maxRank ) { Node * root = generateTreeStructure ( depth, nodesCount, maxRank ); std::map < int, std::vector < char > > rankedAlphabet; @@ -367,13 +370,16 @@ RankedNonlinearPattern RandomTreeFactory::generateRankedNonlinearPattern ( int d for ( char i : it.second ) treeRankedAlphabet.insert ( alphabet::RankedSymbol ( i, it.first ) ); - for ( char i : rankedAlphabet [ 0 ] ) - nonlinearVariables.insert ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( i ) ), 0 ) ); + if ( singleNonlinearVariable ) + nonlinearVariables.insert ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( alphabet::symbolFrom ( "A" ) ) ), 0 ) ); + else + for ( char i : rankedAlphabet [ 0 ] ) + nonlinearVariables.insert ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol ( i ) ), 0 ) ); alphabet::RankedSymbol subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); treeRankedAlphabet.insert ( subtreeWildcard ); treeRankedAlphabet.insert ( nonlinearVariables.begin ( ), nonlinearVariables.end ( ) ); - RankedNonlinearPattern tree ( std::move ( subtreeWildcard ), nonlinearVariables, treeRankedAlphabet, root->createRankedNonlinearPatternNode ( ) ); + RankedNonlinearPattern tree ( std::move ( subtreeWildcard ), nonlinearVariables, treeRankedAlphabet, root->createRankedNonlinearPatternNode ( singleNonlinearVariable ) ); delete root; return tree; } diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.h b/alib2algo/src/tree/generate/RandomTreeFactory.h index e292858142..eb8272ab1d 100644 --- a/alib2algo/src/tree/generate/RandomTreeFactory.h +++ b/alib2algo/src/tree/generate/RandomTreeFactory.h @@ -28,7 +28,7 @@ class RandomTreeFactory { public: static tree::RankedTree generateRankedTree ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, int maxRank = INT_MAX ); static tree::RankedPattern generateRankedPattern ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, int maxRank = INT_MAX ); - static tree::RankedNonlinearPattern generateRankedNonlinearPattern ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, int maxRank = INT_MAX ); + static tree::RankedNonlinearPattern generateRankedNonlinearPattern ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, bool singleNonlinearVariable, int maxRank = INT_MAX ); static tree::UnrankedTree generateUnrankedTree ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, int maxRank = INT_MAX ); static tree::UnrankedPattern generateUnrankedPattern ( int depth, int nodesCount, int maxAlphabetSize, bool randomizedAlphabet, int maxRank = INT_MAX ); diff --git a/arand2/src/arand.cpp b/arand2/src/arand.cpp index f69cd404e1..e2d030c848 100644 --- a/arand2/src/arand.cpp +++ b/arand2/src/arand.cpp @@ -66,7 +66,7 @@ int main ( int argc, char * argv[] ) { TCLAP::ValueArg < int > terminalNodes ( "", "leaves", "Number of tree's/regexp's terminal nodes", false, 5, "integer" ); cmd.add ( terminalNodes ); - TCLAP::ValueArg < int > height ( "", "height", "Height of the tree/regexp", false, 5, "integer" ); + TCLAP::ValueArg < int > height ( "", "height", "Height of the tree/regexp", false, 3, "integer" ); cmd.add ( height ); TCLAP::ValueArg < int > length ( "", "length", "Length of the string", false, 5, "integer" ); @@ -75,6 +75,9 @@ int main ( int argc, char * argv[] ) { TCLAP::ValueArg < int > maxRank ( "", "rank", "Maximal rank of tree nodes", false, 5, "integer" ); cmd.add ( maxRank ); + TCLAP::SwitchArg singleNonlinearVariable ( "", "single_nonlinear_variable", "Generate single nonlinear variable", false ); + cmd.add ( singleNonlinearVariable ); + TCLAP::ValueArg < std::string > input ( "i", "input", "Input to use in generation", false, "-", "file" ); cmd.add ( input ); @@ -190,7 +193,7 @@ int main ( int argc, char * argv[] ) { } else if ( type.getValue ( ) == "RNP" ) { measurements::start ( "Algorithm", measurements::Type::MAIN ); - tree::RankedNonlinearPattern res = tree::generate::RandomTreeFactory::generateRankedNonlinearPattern ( height.getValue ( ), nodes.getValue ( ), alphabetSize.getValue ( ), randomizedAlphabet.getValue ( ), maxRank.getValue ( ) ); + tree::RankedNonlinearPattern res = tree::generate::RandomTreeFactory::generateRankedNonlinearPattern ( height.getValue ( ), nodes.getValue ( ), alphabetSize.getValue ( ), randomizedAlphabet.getValue ( ), singleNonlinearVariable.getValue ( ), maxRank.getValue ( ) ); measurements::end ( ); measurements::start ( "Output write", measurements::Type::AUXILIARY ); -- GitLab