Skip to content

Commit

Permalink
Add export/import Assignment features for debugging (#586)
Browse files Browse the repository at this point in the history
  • Loading branch information
AleksandarZeljic authored Sep 6, 2022
1 parent 23c825c commit bdcd044
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 2 deletions.
14 changes: 13 additions & 1 deletion src/configuration/OptionParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ void OptionParser::initialize()
_positional.add_options()
( "input",
boost::program_options::value<std::string>( &(*_stringOptions)[Options::INPUT_FILE_PATH] )->default_value( (*_stringOptions)[Options::INPUT_FILE_PATH] ),
"Neural netowrk file." )
"Neural network file." )
( "property",
boost::program_options::value<std::string>( &(*_stringOptions)[Options::PROPERTY_FILE_PATH] )->default_value( (*_stringOptions)[Options::PROPERTY_FILE_PATH] ),
"Property file." )
Expand Down Expand Up @@ -94,6 +94,18 @@ void OptionParser::initialize()
( "summary-file",
boost::program_options::value<std::string>( &((*_stringOptions)[Options::SUMMARY_FILE]) )->default_value( (*_stringOptions)[Options::SUMMARY_FILE] ),
"Produce a summary file of the run." )
( "export-assignment",
boost::program_options::bool_switch( &((*_boolOptions)[Options::EXPORT_ASSIGNMENT]) )->default_value( (*_boolOptions)[Options::EXPORT_ASSIGNMENT] ),
"Export a satisfying assignment if found." )
( "export-assignment-file",
boost::program_options::value<std::string>( &(*_stringOptions)[Options::EXPORT_ASSIGNMENT_FILE_PATH] )->default_value( (*_stringOptions)[Options::EXPORT_ASSIGNMENT_FILE_PATH] ),
"Specifies a file to export the assignment." )
( "debug-assignment",
boost::program_options::bool_switch( &((*_boolOptions)[Options::DEBUG_ASSIGNMENT]) )->default_value( (*_boolOptions)[Options::DEBUG_ASSIGNMENT] ),
"Import an assignment for debugging." )
( "debug-assignment-file",
boost::program_options::value<std::string>( &(*_stringOptions)[Options::EXPORT_ASSIGNMENT_FILE_PATH] )->default_value( (*_stringOptions)[Options::EXPORT_ASSIGNMENT_FILE_PATH] ),
"Specifies a file to import the assignment for debugging." )
#ifdef ENABLE_GUROBI
#endif // ENABLE_GUROBI
;
Expand Down
4 changes: 4 additions & 0 deletions src/configuration/Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ void Options::initializeDefaultValues()
_boolOptions[SOLVE_WITH_MILP] = false;
_boolOptions[PERFORM_LP_TIGHTENING_AFTER_SPLIT] = false;
_boolOptions[NO_PARALLEL_DEEPSOI] = false;
_boolOptions[EXPORT_ASSIGNMENT] = false;
_boolOptions[DEBUG_ASSIGNMENT] = false;

/*
Int options
Expand Down Expand Up @@ -86,6 +88,8 @@ void Options::initializeDefaultValues()
_stringOptions[SYMBOLIC_BOUND_TIGHTENING_TYPE] = "deeppoly";
_stringOptions[MILP_SOLVER_BOUND_TIGHTENING_TYPE] = "none";
_stringOptions[QUERY_DUMP_FILE] = "";
_stringOptions[IMPORT_ASSIGNMENT_FILE_PATH] = "assignment.txt";
_stringOptions[EXPORT_ASSIGNMENT_FILE_PATH] = "assignment.txt";
_stringOptions[SOI_SEARCH_STRATEGY] = "mcmc";
_stringOptions[SOI_INITIALIZATION_STRATEGY] = "input-assignment";
_stringOptions[LP_SOLVER] = gurobiEnabled() ? "gurobi" : "native";
Expand Down
11 changes: 10 additions & 1 deletion src/configuration/Options.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ class Options
// with a different random seed on each thread. The problem is solved once
// any of the thread finishes.
NO_PARALLEL_DEEPSOI,

// Export SAT assignment into a file, use EXPORT_ASSIGNMENT_FILE to specify the file (default: assignment.txt)
EXPORT_ASSIGNMENT,

// Import assignment for debugging purposes, use IMPORT_ASSIGNMENT_FILE to specify the file (default: assignment.txt)
DEBUG_ASSIGNMENT,
};

enum IntOptions {
Expand All @@ -90,7 +96,7 @@ class Options

// The random seed used throughout the execution.
SEED,

// The number of threads to use for OpenBLAS matrix multiplication.
NUM_BLAS_THREADS,
};
Expand Down Expand Up @@ -119,6 +125,8 @@ class Options
SYMBOLIC_BOUND_TIGHTENING_TYPE,
MILP_SOLVER_BOUND_TIGHTENING_TYPE,
QUERY_DUMP_FILE,
EXPORT_ASSIGNMENT_FILE_PATH,
IMPORT_ASSIGNMENT_FILE_PATH,

// The strategy used for soi minimization
SOI_SEARCH_STRATEGY,
Expand All @@ -127,6 +135,7 @@ class Options

// The procedure/solver for solving the LP
LP_SOLVER,

};

/*
Expand Down
61 changes: 61 additions & 0 deletions src/engine/Marabou.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
**/

#include "AcasParser.h"
#include "AutoFile.h"
#include "GlobalConfiguration.h"
#include "File.h"
#include "MStringf.h"
Expand Down Expand Up @@ -54,6 +55,9 @@ void Marabou::run()

unsigned long long totalElapsed = TimeUtils::timePassed( start, end );
displayResults( totalElapsed );

if( Options::get()->getBool( Options::EXPORT_ASSIGNMENT ) )
exportAssignment();
}

void Marabou::prepareInputQuery()
Expand Down Expand Up @@ -107,6 +111,9 @@ void Marabou::prepareInputQuery()
printf( "\n" );
}

if ( Options::get()->getBool( Options::DEBUG_ASSIGNMENT ) )
importDebuggingSolution();

String queryDumpFilePath = Options::get()->getString( Options::QUERY_DUMP_FILE );
if ( queryDumpFilePath.length() > 0 )
{
Expand All @@ -116,6 +123,60 @@ void Marabou::prepareInputQuery()
}
}

void Marabou::importDebuggingSolution()
{
String fileName= Options::get()->getString( Options::IMPORT_ASSIGNMENT_FILE_PATH );
AutoFile input( fileName );

if ( !IFile::exists( fileName ) )
{
throw MarabouError( MarabouError::FILE_DOES_NOT_EXIST, Stringf( "File %s not found.\n", fileName.ascii() ).ascii() );
}

input->open( IFile::MODE_READ );

unsigned numVars = atoi( input->readLine().trim().ascii() );
ASSERT( numVars == _inputQuery.getNumberOfVariables() );

unsigned var;
double value;
String line;

// Import each assignment
for ( unsigned i = 0; i < numVars; ++i )
{
line = input->readLine();
List<String> tokens = line.tokenize( "," );
auto it = tokens.begin();
var = atoi( it->ascii() );
ASSERT( var == i );
it++;
value = atof( it->ascii() );
it++;
ASSERT( it == tokens.end() );
_inputQuery.storeDebuggingSolution( var, value);
}

input->close();
}

void Marabou::exportAssignment() const
{
String assignmentFileName = "assignment.txt";
AutoFile exportFile( assignmentFileName );
exportFile->open( IFile::MODE_WRITE_TRUNCATE );

unsigned numberOfVariables = _inputQuery.getNumberOfVariables();
// Number of Variables
exportFile->write( Stringf( "%u\n", numberOfVariables ) );

// Export each assignment
for ( unsigned var = 0; var < numberOfVariables; ++var )
exportFile->write( Stringf( "%u, %f\n", var, _inputQuery.getSolutionValue( var ) ) );

exportFile->close();
}

void Marabou::solveQuery()
{
if ( _engine.processInputQuery( _inputQuery ) )
Expand Down
10 changes: 10 additions & 0 deletions src/engine/Marabou.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,16 @@ class Marabou
*/
void displayResults( unsigned long long microSecondsElapsed ) const;

/*
Export assignment as per Options
*/
void exportAssignment() const;

/*
Import assignment for debugging as per Options
*/
void importDebuggingSolution();

/*
ACAS network parser
*/
Expand Down

0 comments on commit bdcd044

Please sign in to comment.