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=""${workspace_loc:/alib/src}""/> + </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=""${workspace_loc:/alib/lib}""/> + </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