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