Skip to content

Commit

Permalink
Merge pull request #597 from ANTsX/randomSeedInitialization
Browse files Browse the repository at this point in the history
ENH: allow random seed control
  • Loading branch information
ntustison authored Jun 3, 2018
2 parents 45c37d9 + 2d2a0d4 commit 9b51c81
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 15 deletions.
38 changes: 23 additions & 15 deletions Examples/antsAI.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ int antsAI( itk::ants::CommandLineParser *parser )
translationSearchGrid = parser->ConvertVector<RealType>( translationSearchGridOption->GetFunction( 0 )->GetParameter( 1 ) );
}
}

itk::ants::CommandLineParser::OptionType::Pointer transformOption = parser->GetOption( "transform" );
if( transformOption && transformOption->GetNumberOfFunctions() )
{
Expand Down Expand Up @@ -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 )
Expand Down Expand Up @@ -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 )
{
Expand All @@ -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 );
Expand All @@ -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 )
Expand All @@ -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++;
Expand All @@ -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() );
Expand All @@ -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 );
Expand All @@ -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() );
}
}
Expand All @@ -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
Expand Down Expand Up @@ -1574,7 +1582,7 @@ void InitializeCommandLineOptions( itk::ants::CommandLineParser *parser )
option->SetDescription( description );
parser->AddOption( option );
}

{
std::string description =
std::string( "Number of iterations." );
Expand Down
9 changes: 9 additions & 0 deletions Examples/antsMotionCorr.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,7 @@ int ants_motion( itk::ants::CommandLineParser *parser )
}
}

char* antsRandomSeed = getenv( "ANTS_RANDOM_SEED" );

unsigned int nparams = 2;
itk::TimeProbe totalTimer;
Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -1126,6 +1131,10 @@ int ants_motion( itk::ants::CommandLineParser *parser )
typedef itk::ImageRegistrationMethodv4<FixedImageType, FixedImageType,
RigidTransformType> RigidRegistrationType;
typename RigidRegistrationType::Pointer rigidRegistration = RigidRegistrationType::New();
if ( antsRandomSeed != NULL )
{
rigidRegistration->MetricSamplingReinitializeSeed( atoi( antsRandomSeed ) );
}
metric->SetFixedImage( preprocessFixedImage );
metric->SetVirtualDomainFromImage( preprocessFixedImage );
metric->SetMovingImage( preprocessMovingImage );
Expand Down
7 changes: 7 additions & 0 deletions Examples/itkantsRegistrationHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) )
Expand Down

0 comments on commit 9b51c81

Please sign in to comment.