From 2d2a0d4a8ef9ac55749aa04ba31d38929ae9cbfa Mon Sep 17 00:00:00 2001 From: stnava Date: Sat, 2 Jun 2018 19:16:08 -0400 Subject: [PATCH] ENH: allow random seed control via an environment variable called ANTS_RANDOM_SEED when implemented, this should be over-ridden by values that are passed via command line. --- Examples/antsAI.cxx | 38 +++++++++++++++++----------- Examples/antsMotionCorr.cxx | 9 +++++++ Examples/itkantsRegistrationHelper.h | 7 +++++ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/Examples/antsAI.cxx b/Examples/antsAI.cxx index 2d0109372..6b215c604 100644 --- a/Examples/antsAI.cxx +++ b/Examples/antsAI.cxx @@ -772,7 +772,7 @@ int antsAI( itk::ants::CommandLineParser *parser ) translationSearchGrid = parser->ConvertVector( translationSearchGridOption->GetFunction( 0 )->GetParameter( 1 ) ); } } - + itk::ants::CommandLineParser::OptionType::Pointer transformOption = parser->GetOption( "transform" ); if( transformOption && transformOption->GetNumberOfFunctions() ) { @@ -1181,8 +1181,16 @@ int antsAI( itk::ants::CommandLineParser *parser ) typedef typename itk::Statistics::MersenneTwisterRandomVariateGenerator RandomizerType; typename RandomizerType::Pointer randomizer = RandomizerType::New(); - randomizer->SetSeed( 1234 ); + char* antsRandomSeed = getenv( "ANTS_RANDOM_SEED" ); + if ( antsRandomSeed != NULL ) + { + randomizer->SetSeed( atoi( antsRandomSeed ) ); + } + else + { + randomizer->SetSeed( 1234 ); + } unsigned long index = 0; switch( samplingStrategy ) @@ -1297,7 +1305,7 @@ int antsAI( itk::ants::CommandLineParser *parser ) multiStartOptimizer->SetMetric( imageMetric ); unsigned int trialCounter = 0; - + typename MultiStartOptimizerType::ParametersListType parametersList = multiStartOptimizer->GetParametersList(); for( RealType angle1 = ( vnl_math::pi * -arcFraction ); angle1 <= ( vnl_math::pi * arcFraction + 0.000001 ); angle1 += searchFactor ) { @@ -1312,14 +1320,14 @@ int antsAI( itk::ants::CommandLineParser *parser ) typename AffineTransformType::OutputVectorType searchTranslation; searchTranslation[0] = translation1; searchTranslation[1] = translation2; - + affineSearchTransform->SetIdentity(); affineSearchTransform->SetCenter( initialTransform->GetCenter() ); affineSearchTransform->SetMatrix( initialTransform->GetMatrix() ); affineSearchTransform->SetOffset( initialTransform->GetOffset() ); affineSearchTransform->Translate( searchTranslation , 1 ); affineSearchTransform->Rotate2D( angle1, 1 ); - + if( strcmp( transform.c_str(), "affine" ) == 0 ) { affineSearchTransform->Scale( bestScale ); @@ -1331,7 +1339,7 @@ int antsAI( itk::ants::CommandLineParser *parser ) rigidSearchTransform->SetCenter( initialTransform->GetCenter() ); rigidSearchTransform->SetMatrix( affineSearchTransform->GetMatrix() ); rigidSearchTransform->SetOffset( initialTransform->GetOffset() ); - + parametersList.push_back( rigidSearchTransform->GetParameters() ); } else if( strcmp( transform.c_str(), "similarity" ) == 0 ) @@ -1341,9 +1349,9 @@ int antsAI( itk::ants::CommandLineParser *parser ) similaritySearchTransform->SetMatrix( affineSearchTransform->GetMatrix() ); similaritySearchTransform->SetOffset( initialTransform->GetOffset() ); similaritySearchTransform->SetScale( bestScale ); - + similaritySearchTransform->SetScale( bestScale ); - + parametersList.push_back( similaritySearchTransform->GetParameters() ); } trialCounter++; @@ -1369,7 +1377,7 @@ int antsAI( itk::ants::CommandLineParser *parser ) searchTranslation[0] = translation1; searchTranslation[1] = translation2; searchTranslation[2] = translation3; - + affineSearchTransform->SetIdentity(); affineSearchTransform->SetCenter( initialTransform->GetCenter() ); affineSearchTransform->SetOffset( initialTransform->GetOffset() ); @@ -1378,7 +1386,7 @@ int antsAI( itk::ants::CommandLineParser *parser ) affineSearchTransform->Rotate3D( axis1, angle1, 1 ); affineSearchTransform->Rotate3D( axis2, angle2, 1 ); affineSearchTransform->Rotate3D( axis1, angle3, 1 ); - + if( strcmp( transform.c_str(), "affine" ) == 0 ) { affineSearchTransform->Scale( bestScale ); @@ -1400,7 +1408,7 @@ int antsAI( itk::ants::CommandLineParser *parser ) similaritySearchTransform->SetOffset( initialTransform->GetOffset() ); similaritySearchTransform->SetMatrix( affineSearchTransform->GetMatrix() ); similaritySearchTransform->SetScale( bestScale ); - + parametersList.push_back( similaritySearchTransform->GetParameters() ); } } @@ -1411,17 +1419,17 @@ int antsAI( itk::ants::CommandLineParser *parser ) } } } - + if( verbose ) { std::cout << "Starting optimizer with " << trialCounter << " starting points" << std::endl; } - + multiStartOptimizer->SetParametersList( parametersList ); multiStartOptimizer->SetLocalOptimizer( localOptimizer ); multiStartOptimizer->StartOptimization(); - + ///////////////////////////////////////////////////////////////// // // Write the output after convergence @@ -1574,7 +1582,7 @@ void InitializeCommandLineOptions( itk::ants::CommandLineParser *parser ) option->SetDescription( description ); parser->AddOption( option ); } - + { std::string description = std::string( "Number of iterations." ); diff --git a/Examples/antsMotionCorr.cxx b/Examples/antsMotionCorr.cxx index 9f074d296..509c24f09 100644 --- a/Examples/antsMotionCorr.cxx +++ b/Examples/antsMotionCorr.cxx @@ -592,6 +592,7 @@ int ants_motion( itk::ants::CommandLineParser *parser ) } } + char* antsRandomSeed = getenv( "ANTS_RANDOM_SEED" ); unsigned int nparams = 2; itk::TimeProbe totalTimer; @@ -1048,6 +1049,10 @@ int ants_motion( itk::ants::CommandLineParser *parser ) if( std::strcmp( whichTransform.c_str(), "affine" ) == 0 ) { typename AffineRegistrationType::Pointer affineRegistration = AffineRegistrationType::New(); + if ( antsRandomSeed != NULL ) + { + affineRegistration->MetricSamplingReinitializeSeed( atoi( antsRandomSeed ) ); + } typename AffineTransformType::Pointer affineTransform = AffineTransformType::New(); affineTransform->SetIdentity(); affineTransform->SetOffset( trans ); @@ -1126,6 +1131,10 @@ int ants_motion( itk::ants::CommandLineParser *parser ) typedef itk::ImageRegistrationMethodv4 RigidRegistrationType; typename RigidRegistrationType::Pointer rigidRegistration = RigidRegistrationType::New(); + if ( antsRandomSeed != NULL ) + { + rigidRegistration->MetricSamplingReinitializeSeed( atoi( antsRandomSeed ) ); + } metric->SetFixedImage( preprocessFixedImage ); metric->SetVirtualDomainFromImage( preprocessFixedImage ); metric->SetMovingImage( preprocessMovingImage ); diff --git a/Examples/itkantsRegistrationHelper.h b/Examples/itkantsRegistrationHelper.h index aff969986..0f33c85ae 100644 --- a/Examples/itkantsRegistrationHelper.h +++ b/Examples/itkantsRegistrationHelper.h @@ -824,6 +824,13 @@ class RegistrationHelper : public itk::Object typename RegistrationMethodType::Pointer registrationMethod = RegistrationMethodType::New(); typedef typename RegistrationMethodType::OutputTransformType RegistrationMethodTransformType; + char* antsRandomSeed = getenv( "ANTS_RANDOM_SEED" ); + if ( antsRandomSeed != NULL ) + { + registrationMethod->MetricSamplingReinitializeSeed( + atoi( antsRandomSeed ) ); + } + for( unsigned int n = 0; n < stageMetricList.size(); n++ ) { if( !this->IsPointSetMetric( stageMetricList[n].m_MetricType ) )