diff --git a/ameasure2/makefile.conf b/ameasure2/makefile.conf index fac0c87316125822255e9ffb542b3d6391cfcc67..572f34f10b472c3485c1ab0431c9166f30ab69b9 100644 --- a/ameasure2/makefile.conf +++ b/ameasure2/makefile.conf @@ -1,4 +1,4 @@ EXECUTABLE:=ameasure2 -LINK_PATHS=../alib2data/ ../alib2std/ -LINK_LIBRARIES=alib2data alib2std xml2 -INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/ +LINK_PATHS=../alib2measure/ ../alib2data/ ../alib2std/ +LINK_LIBRARIES=alib2measure alib2data alib2std xml2 +INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2measure/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/ diff --git a/ameasure2/src/ameasure.cpp b/ameasure2/src/ameasure.cpp index 3bae884909cd12b021ddc21929b979c03b208f0a..20c2fa0e8d1942e92c9e5f6b7e4beadd39be27a0 100644 --- a/ameasure2/src/ameasure.cpp +++ b/ameasure2/src/ameasure.cpp @@ -24,7 +24,7 @@ int main ( int argc, char * * argv ) { else sax::SaxParseInterface::parseFile ( input.getValue ( ), tokens ); - auto configuration = provisioner::MeasurementProvisionerXmlFactory::configurationFromTokens ( tokens ); + auto configuration = provisioner::MeasurementProvisionerXmlFactory::parseMeasurementProvisionerConfiguration ( tokens ); provisioner::MeasurementProvisioner::runConfiguration ( configuration ); // auto results = diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.cpp b/ameasure2/src/provisioner/MeasurementProvisioner.cpp index 2c3f6c8bb4e8b703d5093158d3d24925ca19bd0d..8ad5fbbc4391bf0051edf0f04dff9e15447473a1 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.cpp @@ -59,21 +59,30 @@ void MeasurementProvisioner::runProvision ( const MeasurementProvision & mp, Mea expandedInputDataFiles.splice ( expandedInputDataFiles.end ( ), shellExpand ( inputDataFile ) ); for ( const std::string & expandedInputDataFile : expandedInputDataFiles ) - runPipeline ( expandedInputDataFile, mp.pipeCommands ); + for ( const std::vector < std::string > & pipeline : mp.pipelines ) { + + PipelineResults pipelineResults = runPipeline ( expandedInputDataFile, pipeline ); + + std::cout << "Pipeline on " << expandedInputDataFile << ":" << std::endl; + + for ( auto & measurementResult : pipelineResults.measurementResults ) + std::cout << measurements::MeasurementFormat::TREE << measurementResult << std::endl; + } + } -void MeasurementProvisioner::runPipeline ( const std::string & inputDataFile, const std::vector < std::string > & pipelineCommands ) { +PipelineResults MeasurementProvisioner::runPipeline ( const std::string & inputDataFile, const std::vector < std::string > & pipeline ) { - std::vector < std::string > pipeline; + PipelineResults pipelineResults; - std::vector < std::deque < sax::Token > > measurementsOutputTokens; + std::vector < std::string > processedPipeline; - std::vector < std::string >::const_iterator iter = pipelineCommands.cbegin ( ); + std::vector < std::string >::const_iterator iter = pipeline.cbegin ( ); - pipeline.emplace_back ( * ( iter++ ) + " -m -i " + inputDataFile ); + processedPipeline.emplace_back ( * ( iter++ ) + " -m -i " + inputDataFile ); - for ( ; iter != pipelineCommands.cend ( ); ++iter ) - pipeline.emplace_back ( * iter + " -m" ); + for ( ; iter != pipeline.cend ( ); ++iter ) + processedPipeline.emplace_back ( * iter + " -m" ); int measurementsTmpfileFd = open ( "/tmp", O_RDWR | O_TMPFILE, S_IRUSR | S_IWUSR ); @@ -104,8 +113,8 @@ void MeasurementProvisioner::runPipeline ( const std::string & inputDataFile, co close ( 1 ); close ( 2 ); - for ( iter = pipeline.cbegin ( ); iter != pipeline.cend ( ); ++iter ) { - if ( iter == pipeline.cbegin ( ) ) { + for ( iter = processedPipeline.cbegin ( ); iter != processedPipeline.cend ( ); ++iter ) { + if ( iter == processedPipeline.cbegin ( ) ) { dup ( inputTmpfileFd ); dup ( outputTmpfileFd ); } else { @@ -135,7 +144,7 @@ void MeasurementProvisioner::runPipeline ( const std::string & inputDataFile, co std::deque < sax::Token > tokens; sax::SaxParseInterface::parseStream ( ifd, tokens ); - measurementsOutputTokens.emplace_back ( std::move ( tokens ) ); + pipelineResults.measurementResults.emplace_back ( measurements::MeasurementXmlFactory::parseMeasurementResults ( tokens ) ); // destroy the contents and rewind for another commands measurements ftruncate ( measurementsFd, 0 ); @@ -159,14 +168,7 @@ void MeasurementProvisioner::runPipeline ( const std::string & inputDataFile, co dup ( curStdoutFd ); dup ( curStderrFd ); - std::cout << measurementsOutputTokens.size ( ) << std::endl; - - for ( auto & tokens : measurementsOutputTokens ) { - for ( auto & token : tokens ) - std::cout << token << std::endl; - - std::cout << std::endl; - } + return pipelineResults; } } diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.hpp b/ameasure2/src/provisioner/MeasurementProvisioner.hpp index b4b3c3b12801070512951f364ec230c3a35d33b1..5574ce109d7c782be6ed5f1c7513ff00842a7478 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.hpp @@ -16,7 +16,7 @@ class MeasurementProvisioner { static std::list < std::string > shellExpand ( const std::string & ); static void runProvision ( const MeasurementProvision &, MeasurementProvisionerResults & ); - static void runPipeline ( const std::string &, const std::vector < std::string > & ); + static PipelineResults runPipeline ( const std::string &, const std::vector < std::string > & ); public: static MeasurementProvisionerResults runConfiguration ( const MeasurementProvisionerConfiguration & ); diff --git a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp index c0cbae83cb54e18f07e4d2569511f48d0d7f7e0d..5e3847271212ae4c60a328b729a0eac8324d9a74 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp @@ -15,9 +15,9 @@ struct MeasurementConfiguration { }; struct MeasurementProvision { - std::vector < std::string > inputDataFiles; - std::vector < std::string > pipeCommands; - MeasurementConfiguration measurementConfiguration; + std::vector < std::string > inputDataFiles; + std::vector < std::vector < std::string > > pipelines; + MeasurementConfiguration measurementConfiguration; }; struct MeasurementProvisionerConfiguration { diff --git a/ameasure2/src/provisioner/MeasurementProvisionerResults.hpp b/ameasure2/src/provisioner/MeasurementProvisionerResults.hpp index ff9c79eacb4141785f4cf41fedf740e8593dec85..067a56096face2b56b422e3db2a2e2ed10176b59 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerResults.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerResults.hpp @@ -5,8 +5,15 @@ #ifndef MEASUREMENT_PROVISIONER_RESULTS_HPP_ #define MEASUREMENT_PROVISIONER_RESULTS_HPP_ +#include <measure> + namespace provisioner { +struct PipelineResults { + std::vector < std::string > pipeline; + std::vector < measurements::MeasurementResults > measurementResults; +}; + struct MeasurementProvisionerResults { }; diff --git a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp index 366d33053a3630581ad94d9b419f8ea535954953..35feb37b031d03eae6bad42f143063b7138c8390 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp @@ -11,7 +11,7 @@ using namespace sax; namespace provisioner { -MeasurementProvisionerConfiguration MeasurementProvisionerXmlFactory::configurationFromTokens ( deque < Token > & tokens ) { +MeasurementProvisionerConfiguration MeasurementProvisionerXmlFactory::parseMeasurementProvisionerConfiguration ( deque < Token > & tokens ) { MeasurementProvisionerConfiguration configuration; deque < Token >::iterator iter = tokens.begin ( ); @@ -76,8 +76,8 @@ void MeasurementProvisionerXmlFactory::parseMeasurementProvision ( MeasurementPr if ( data == INPUT_DATA_FILES_TAG ) parseInputDataFiles ( mp, iter ); - else if ( data == PIPE_COMMANDS_TAG ) - parsePipeCommands ( mp, iter ); + else if ( data == PIPELINES_TAG ) + parsePipelines ( mp, iter ); else if ( data == MEASUREMENT_CONFIGURATION_TAG ) parseMeasurementConfiguration ( mp, iter ); else @@ -109,24 +109,43 @@ void MeasurementProvisionerXmlFactory::parseInputDataFiles ( MeasurementProvisio FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, INPUT_DATA_FILES_TAG ); } -void MeasurementProvisionerXmlFactory::parsePipeCommands ( MeasurementProvision & mp, std::deque < sax::Token >::iterator & iter ) { - FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPE_COMMANDS_TAG ); +void MeasurementProvisionerXmlFactory::parsePipelines ( MeasurementProvision & mp, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPELINES_TAG ); for ( ; ; ) { if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); - if ( data == PIPE_COMMAND_TAG ) { - FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPE_COMMAND_TAG ); - mp.pipeCommands.emplace_back ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPE_COMMAND_TAG ); + if ( data == PIPELINE_TAG ) { + mp.pipelines.push_back ( { } ); + parsePipeline ( mp.pipelines.back ( ), iter ); } else { break; } } - FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPE_COMMANDS_TAG ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPELINES_TAG ); +} + +void MeasurementProvisionerXmlFactory::parsePipeline ( std::vector < std::string > & pipeline, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPELINE_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == COMMAND_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COMMAND_TAG ); + pipeline.emplace_back ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COMMAND_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPELINE_TAG ); } void MeasurementProvisionerXmlFactory::parseMeasurementConfiguration ( MeasurementProvision &, std::deque < sax::Token >::iterator & iter ) { @@ -148,8 +167,9 @@ string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISION_TAG = "Measuremen string MeasurementProvisionerXmlFactory::INPUT_DATA_FILES_TAG = "InputDataFiles"; string MeasurementProvisionerXmlFactory::INPUT_DATA_FILE_TAG = "InputDataFile"; -string MeasurementProvisionerXmlFactory::PIPE_COMMANDS_TAG = "PipeCommands"; -string MeasurementProvisionerXmlFactory::PIPE_COMMAND_TAG = "PipeCommand"; +string MeasurementProvisionerXmlFactory::PIPELINES_TAG = "Pipelines"; +string MeasurementProvisionerXmlFactory::PIPELINE_TAG = "Pipeline"; +string MeasurementProvisionerXmlFactory::COMMAND_TAG = "Command"; string MeasurementProvisionerXmlFactory::MEASUREMENT_CONFIGURATION_TAG = "MeasurementConfiguration"; } diff --git a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp index 7f22a391521cb23aed9777455eb39a9d6defc2fb..ae7e0060619b5c79fe81cbbf90c11b78097383df 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp @@ -22,8 +22,9 @@ class MeasurementProvisionerXmlFactory { static std::string INPUT_DATA_FILES_TAG; static std::string INPUT_DATA_FILE_TAG; - static std::string PIPE_COMMANDS_TAG; - static std::string PIPE_COMMAND_TAG; + static std::string PIPELINES_TAG; + static std::string PIPELINE_TAG; + static std::string COMMAND_TAG; static std::string MEASUREMENT_CONFIGURATION_TAG; @@ -32,11 +33,12 @@ class MeasurementProvisionerXmlFactory { static void parseMeasurementProvision ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); static void parseInputDataFiles ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); - static void parsePipeCommands ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); + static void parsePipelines ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); + static void parsePipeline ( std::vector < std::string > &, std::deque < sax::Token >::iterator & ); static void parseMeasurementConfiguration ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); public: - static MeasurementProvisionerConfiguration configurationFromTokens ( std::deque < sax::Token > & ); + static MeasurementProvisionerConfiguration parseMeasurementProvisionerConfiguration ( std::deque < sax::Token > & ); }; } diff --git a/examples2/measurements/ameasure.xml b/examples2/measurements/ameasure.xml index 14c0e0a996d54b36ce3228b08667ca21449405e4..1e694196b884f952358a2860660dd5acef077160 100644 --- a/examples2/measurements/ameasure.xml +++ b/examples2/measurements/ameasure.xml @@ -4,12 +4,18 @@ <MeasurementProvisions> <MeasurementProvision> <InputDataFiles> - <InputDataFile>~/repositories/automata-library/examples2/automaton/NFSM1.xml</InputDataFile> + <InputDataFile>~/repositories/automata-library/examples2/automaton/NFSM[12].xml</InputDataFile> </InputDataFiles> - <PipeCommands> - <PipeCommand>./adeterminize2</PipeCommand> - <PipeCommand>./aminimize2</PipeCommand> - </PipeCommands> + <Pipelines> + <Pipeline> + <Command>./adeterminize2</Command> + <Command>./aminimize2</Command> + </Pipeline> + <Pipeline> + <Command>./adeterminize2</Command> + <Command>./aminimize2</Command> + </Pipeline> + </Pipelines> <MeasurementConfiguration> <Engines> <Engine>TIME</Engine>