From 1326f8f83587a63eedce41425231b7a23331f3dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz>
Date: Wed, 26 Mar 2014 18:04:02 +0100
Subject: [PATCH] arand: gen NFA

---
 arand/.cproject                      | 123 +++++++++++++++++++++++++
 arand/.project                       |  27 ++++++
 arand/makefile                       |  20 ++++
 arand/src/RandomGeneratorFactory.cpp | 131 +++++++++++++++++++++++++++
 arand/src/RandomGeneratorFactory.h   |  34 +++++++
 arand/src/arand.cpp                  |  25 +++++
 makefile                             |   3 +-
 7 files changed, 362 insertions(+), 1 deletion(-)
 create mode 100644 arand/.cproject
 create mode 100644 arand/.project
 create mode 100644 arand/makefile
 create mode 100644 arand/src/RandomGeneratorFactory.cpp
 create mode 100644 arand/src/RandomGeneratorFactory.h
 create mode 100644 arand/src/arand.cpp

diff --git a/arand/.cproject b/arand/.cproject
new file mode 100644
index 0000000000..d6822d6d1c
--- /dev/null
+++ b/arand/.cproject
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.1347379834">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.1347379834" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.1347379834" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1347379834." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1037317409" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.407260051" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
+							<builder buildPath="${workspace_loc:/arand}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.416085715" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.279472182" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1293763556" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
+								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.2045452562" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.64560657" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.option.include.paths.1076344051" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/src}&quot;"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2067765930" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.2147099707" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
+								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1243142714" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.debug.option.debugging.level.531873162" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.937644576" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.1415733224" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.1194801805" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
+								<option id="gnu.cpp.link.option.paths.574169805" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/lib}&quot;"/>
+								</option>
+								<option id="gnu.cpp.link.option.libs.721858332" superClass="gnu.cpp.link.option.libs" valueType="libs">
+									<listOptionValue builtIn="false" value="alib"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.970809293" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.1254231993" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1930820005" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.704467708">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.704467708" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.704467708" name="Release" parent="cdt.managedbuild.config.gnu.exe.release">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.release.704467708." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.1394755595" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.release.2114857339" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
+							<builder buildPath="${workspace_loc:/arand}/Release" id="cdt.managedbuild.target.gnu.builder.exe.release.2109254102" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1613941558" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.241824921" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
+								<option id="gnu.cpp.compiler.exe.release.option.optimization.level.1841009953" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.release.option.debugging.level.1268025949" name="Debug Level" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1103994779" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.2075844729" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release">
+								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.exe.release.option.optimization.level.1520715057" name="Optimization Level" superClass="gnu.c.compiler.exe.release.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.release.option.debugging.level.1147277409" name="Debug Level" superClass="gnu.c.compiler.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1797236551" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.1766793166" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.672843959" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.632440208" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.release.294954190" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1436051183" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="arand.cdt.managedbuild.target.gnu.exe.1797865662" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
+	</storageModule>
+	<storageModule moduleId="scannerConfiguration">
+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.704467708;cdt.managedbuild.config.gnu.exe.release.704467708.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.2075844729;cdt.managedbuild.tool.gnu.c.compiler.input.1797236551">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1347379834;cdt.managedbuild.config.gnu.exe.debug.1347379834.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.2147099707;cdt.managedbuild.tool.gnu.c.compiler.input.937644576">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1347379834;cdt.managedbuild.config.gnu.exe.debug.1347379834.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1293763556;cdt.managedbuild.tool.gnu.cpp.compiler.input.2067765930">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.704467708;cdt.managedbuild.config.gnu.exe.release.704467708.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.241824921;cdt.managedbuild.tool.gnu.cpp.compiler.input.1103994779">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+</cproject>
diff --git a/arand/.project b/arand/.project
new file mode 100644
index 0000000000..2294098a2b
--- /dev/null
+++ b/arand/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>arand</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/arand/makefile b/arand/makefile
new file mode 100644
index 0000000000..adfea096a5
--- /dev/null
+++ b/arand/makefile
@@ -0,0 +1,20 @@
+CC=g++
+EXECUTABLE=arand
+CCFLAGS= -std=c++11 -O2 -g -c -Wall -I../alib/src 
+LDFLAGS= -L../alib/lib -lalib -Wl,-rpath,.
+
+SOURCES=$(shell find src/ -name *cpp)
+OBJECTS=$(patsubst src/%.cpp, obj/%.o, $(SOURCES))
+
+all: $(SOURCES) bin/$(EXECUTABLE)
+
+bin/$(EXECUTABLE): $(OBJECTS)
+	mkdir -p bin
+	$(CC) $(OBJECTS) -o $@ $(LDFLAGS)
+
+obj/%.o: src/%.cpp
+	mkdir -p $(dir $@)
+	$(CC) $(CCFLAGS) $< -o $@
+
+clean:
+	$(RM) -r *.o *.d bin obj
diff --git a/arand/src/RandomGeneratorFactory.cpp b/arand/src/RandomGeneratorFactory.cpp
new file mode 100644
index 0000000000..63bd5f0237
--- /dev/null
+++ b/arand/src/RandomGeneratorFactory.cpp
@@ -0,0 +1,131 @@
+/*
+ * RandomGeneratorFactory.cpp
+ *
+ *  Created on: 26. 3. 2014
+ *      Author: tomas
+ */
+
+#include "RandomGeneratorFactory.h"
+#include <iostream>
+
+using namespace automaton;
+using namespace std;
+
+FSM RandomGeneratorFactory::generateNFA( size_t statesCount, set<Symbol> alphabet, double density )
+{
+    deque<Symbol> alphabet2;
+    for( const auto & s : alphabet )
+        alphabet2.push_back( s );
+    return RandomGeneratorFactory::LeslieConnectedNFA( statesCount, alphabet2, density );
+}
+
+FSM RandomGeneratorFactory::generateNFA( size_t statesCount, size_t alphabetSize, double density )
+{
+    srand( time( NULL ) );
+
+    deque<Symbol> alphabet;
+    while( alphabet.size( ) < alphabetSize )
+    {
+        string s( 1, rand() % 26 + 'a' );
+        if( find( alphabet.begin( ), alphabet.end( ), Symbol( s ) ) == alphabet.end( ) )
+            alphabet.push_back( Symbol( s ) );
+    }
+
+    return RandomGeneratorFactory::LeslieConnectedNFA( statesCount, alphabet, density );
+}
+
+FSM RandomGeneratorFactory::LeslieConnectedNFA( size_t n, const deque<Symbol> & alphabet, double density )
+{
+    srand( time( NULL ) );
+
+    FSM automata;
+
+    deque<bool> VStates;
+    deque<State> Q;
+    int unvisited;
+
+
+    for( const auto & s : alphabet )
+        automata.addInputSymbol( s );
+
+    for( size_t i = 0; i < n; i ++ )
+    {
+        VStates.push_back( false );
+        Q.push_back( State( to_string( i ) ) );
+        automata.addState( Q[ i ] );
+    }
+    automata.addInitialState( Q [ 0 ] );
+
+
+    int x = ( rand( ) % ( n - 1 ) ) + 1;
+    automata.addTransition( Q[ 0 ], alphabet[ rand( ) % alphabet.size( ) ], Q[ x ] );
+
+    unvisited = n - 2;
+
+    VStates[ 0 ] = true;
+    VStates[ x ] = true;
+
+    while( unvisited != 0 )
+    {
+        size_t y = rand() % ( n - unvisited ) + 1; // select y-th   accessible state
+        size_t z = rand() % unvisited + 1;         // select z-th inaccessible state
+        int a = -1, b = -1;
+
+        for( size_t i = 0, cnt = 0; i < n; i++ )
+        {
+            if( VStates[ i ] == true )
+                cnt ++;
+
+            if( cnt == y )
+            {
+                a = i;
+                break;
+            }
+        }
+        for( size_t i = 0, cnt = 0; i < n; i++ )
+        {
+            if( VStates[ i ] == false )
+                cnt ++;
+
+            if( cnt == z )
+            {
+                b = i;
+                break;
+            }
+        }
+
+        int c = rand() % alphabet.size( );
+        automata.addTransition( Q[ a ], alphabet[ c ], Q[ b ] );
+
+
+        unvisited -= 1;
+        VStates[ b ] = true;
+
+        // ---------
+    }
+
+    int total = n - 1;
+    double mnn100 = 100.0 / alphabet.size( ) / n / n;
+    while( total * mnn100 < density )
+    {
+        int y = rand( ) % n;
+        int z = rand( ) % n;
+        int a = rand( ) % alphabet.size();
+
+        TransitionFSM t ( Q[ y ], alphabet [ a ], Q[ z ] );
+        if( ! isInSet( t, automata.getTransitions( ) ) )
+        {
+            automata.addTransition( t );
+            total += 1;
+        }
+    }
+
+    for( State q : Q )
+        if( automata.getTransitionsFromState( q ).size( ) == 0 )
+            automata.addFinalState( q );
+
+    // najit vsechny silne souvisle komponenty
+    // ppokud z komponenty nevede cesta do jine komponenty, pak je v ni potreba vybrat jeden uzel jako finalni
+
+    return automata;
+}
diff --git a/arand/src/RandomGeneratorFactory.h b/arand/src/RandomGeneratorFactory.h
new file mode 100644
index 0000000000..dc821db2f8
--- /dev/null
+++ b/arand/src/RandomGeneratorFactory.h
@@ -0,0 +1,34 @@
+/*
+ * RandomGeneratorFactory.h
+ *
+ *  Created on: 26. 3. 2014
+ *      Author: tomas
+ */
+
+#ifndef RANDOMGENERATORFACTORY_H_
+#define RANDOMGENERATORFACTORY_H_
+
+#include <deque>
+#include <set>
+#include <algorithm>
+
+#include <automaton/FSM/FSM.h>
+
+#define isInSet(x,set) ((set).find((x)) != (set).end())
+
+class RandomGeneratorFactory
+{
+public:
+    /**
+     * Generates random nondeterministic finite automaton using
+     * Leslie's random connected NFA algorithm.
+     */
+    static automaton::FSM generateNFA( size_t statesCount, size_t alphabetSize, double density );
+    static automaton::FSM generateNFA( size_t statesCount, std::set<alphabet::Symbol> alphabet, double density );
+
+private:
+    static automaton::FSM LeslieConnectedNFA( size_t n, const std::deque<alphabet::Symbol> & alphabet, double density );
+
+};
+
+#endif /* RANDOMGENERATORFACTORY_H_ */
diff --git a/arand/src/arand.cpp b/arand/src/arand.cpp
new file mode 100644
index 0000000000..3d412ebcae
--- /dev/null
+++ b/arand/src/arand.cpp
@@ -0,0 +1,25 @@
+/*
+ * arand.cpp
+ *
+ *  Created on: 26. 3. 2014
+ *      Author: tomas
+ */
+
+#include <iostream>
+#include <cstdlib>
+
+#include <automaton/FSM/FSM.h>
+#include "RandomGeneratorFactory.h"
+
+using namespace automaton;
+
+int main( int argc, char * argv [ ] )
+{
+
+    set<Symbol> T = { Symbol( "a" ), Symbol( "b" ), Symbol( "cc" ), Symbol( "dd" ), Symbol( "eee" ) };
+    FSM fsm = RandomGeneratorFactory::generateNFA( 15, T, 1.9 );
+    // FSM fsm = RandomGeneratorFactory::generateNFA( 15, 4, 1.9 );
+    fsm.toXML( cout );
+
+    return EXIT_SUCCESS;
+}
diff --git a/makefile b/makefile
index 872e5214df..5ac98ba644 100644
--- a/makefile
+++ b/makefile
@@ -14,7 +14,8 @@ SUBDIRS_BINS = acat \
                anormalize \
                aconversions \
                aderivation aintegral \
-               aoptimize.regexp
+               aoptimize.regexp \
+               arand
 SUBDIRS_WITH_MAKE = $(dir $(wildcard */makefile))
 
 .PHONY: $(CORE_LIB) $(SUBDIRS_LIBS) $(SUBDIRS_BINS)
-- 
GitLab