Skip to content

Commit e9223cf

Browse files
new changes
1 parent 97b8df8 commit e9223cf

21 files changed

+992
-1632
lines changed

Libs/Optimize/Optimize.cpp

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ void Optimize::SetVerbosity(int verbosity_level)
359359
void Optimize::SetDomainsPerShape(int domains_per_shape)
360360
{
361361
this->m_domains_per_shape = domains_per_shape;
362+
std::cout << "Initially, dps set to = "<< domains_per_shape << std::endl;
362363
this->m_sampler->SetDomainsPerShape(this->m_domains_per_shape);
363364
}
364365

@@ -586,9 +587,14 @@ void Optimize::InitializeSampler()
586587
m_sampler->GetEnsembleEntropyFunction()->SetRecomputeCovarianceInterval(1);
587588
m_sampler->GetEnsembleEntropyFunction()->SetHoldMinimumVariance(false);
588589

589-
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVariance(m_starting_regularization);
590+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVariance(m_starting_regularization); // For Initialization set start_reg_params
590591
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetRecomputeCovarianceInterval(1);
591592
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetHoldMinimumVariance(false);
593+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetDomainsPerShapeInfo(m_domains_per_shape);
594+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceWithin(m_starting_regularization_multilevel); // For Initialization set start_reg_params
595+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetHoldMinimumVarianceWithin(false);
596+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceBetween(m_starting_regularization_multilevel_between); // For Initialization set start_reg_params
597+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetHoldMinimumVarianceBetween(false);
592598

593599
std::cout << "mlpca initialized" << std::endl;
594600
m_sampler->GetMeshBasedGeneralEntropyGradientFunction()->SetMinimumVariance(
@@ -621,15 +627,15 @@ void Optimize::InitializeSampler()
621627
->SetRecomputeCovarianceInterval(m_recompute_regularization_interval);
622628
m_sampler->GetEnsembleMlpcaEntropyFunction()
623629
->SetRecomputeCovarianceInterval(m_recompute_regularization_interval);
624-
std::cout << "mlpca initialized 2" << std::endl;
630+
// std::cout << "mlpca initialized 2" << std::endl;
625631

626632

627633
// These flags must be set before Initialize, since Initialize need to know which domains are fixed ahead of time
628634
for (unsigned int i = 0; i < this->m_domain_flags.size(); i++) {
629635
this->GetSampler()->GetParticleSystem()->FlagDomain(this->m_domain_flags[i]);
630636
}
631637
m_sampler->Initialize();
632-
std::cout << "Sampler Init 1 done" << std::endl;
638+
// std::cout << "Sampler Init 1 done" << std::endl;
633639

634640
m_sampler->GetOptimizer()->SetTolerance(0.0);
635641

@@ -728,18 +734,24 @@ void Optimize::Initialize()
728734
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceDecay(m_starting_regularization,
729735
m_ending_regularization,
730736
m_iterations_per_split);
731-
737+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceDecayWithin(m_starting_regularization_multilevel,
738+
m_ending_regularization_multilevel,
739+
m_iterations_per_split);
740+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceDecayBetween(m_starting_regularization_multilevel_between,
741+
m_ending_regularization_multilevel_between,
742+
m_iterations_per_split);
743+
732744
m_sampler->GetMeshBasedGeneralEntropyGradientFunction()->SetMinimumVarianceDecay(
733745
m_starting_regularization,
734746
m_ending_regularization,
735747
m_iterations_per_split);
736748
}
737749
else {
738750
// force to mean
739-
if (m_use_mlpca_optimize){
740-
m_sampler->SetCorrespondenceMode(shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropyMeanEnergy);
741-
}
742-
else if ((m_attributes_per_domain.size() > 0 &&
751+
// if (m_use_mlpca_optimize){
752+
// m_sampler->SetCorrespondenceMode(shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropyMeanEnergy);
753+
// }
754+
if ((m_attributes_per_domain.size() > 0 &&
743755
*std::max_element(m_attributes_per_domain.begin(),
744756
m_attributes_per_domain.end()) > 0) || m_mesh_based_attributes) {
745757
m_sampler->SetCorrespondenceMode(shapeworks::CorrespondenceMode::MeshBasedGeneralMeanEnergy);
@@ -1053,6 +1065,16 @@ void Optimize::RunOptimize()
10531065
m_ending_regularization,
10541066
m_optimization_iterations -
10551067
m_optimization_iterations_completed);
1068+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceDecayWithin(
1069+
m_starting_regularization_multilevel,
1070+
m_ending_regularization_multilevel,
1071+
m_optimization_iterations -
1072+
m_optimization_iterations_completed);
1073+
m_sampler->GetEnsembleMlpcaEntropyFunction()->SetMinimumVarianceDecayBetween(
1074+
m_starting_regularization_multilevel_between,
1075+
m_ending_regularization_multilevel_between,
1076+
m_optimization_iterations -
1077+
m_optimization_iterations_completed);
10561078

10571079

10581080
m_sampler->SetCorrespondenceOn(); // B - ON
@@ -2106,6 +2128,23 @@ void Optimize::SetStartingRegularization(double starting_regularization)
21062128
void Optimize::SetEndingRegularization(double ending_regularization)
21072129
{ this->m_ending_regularization = ending_regularization; }
21082130

2131+
//---------------------------------------------------------------------------
2132+
void Optimize::SetStartingRegularizationMultilevelWithin(std::vector<double> reg_params_start)
2133+
{ this->m_starting_regularization_multilevel = reg_params_start; }
2134+
2135+
//---------------------------------------------------------------------------
2136+
void Optimize::SetEndingRegularizationMultilevelWithin(std::vector<double> reg_params_end)
2137+
{ this->m_ending_regularization_multilevel = reg_params_end; }
2138+
2139+
//---------------------------------------------------------------------------
2140+
void Optimize::SetStartingRegularizationMultilevelBetween(double starting_regularization)
2141+
{ this->m_starting_regularization_multilevel_between = starting_regularization; }
2142+
2143+
//---------------------------------------------------------------------------
2144+
void Optimize::SetEndingRegularizationMultilevelBetween(double ending_regularization)
2145+
{ this->m_ending_regularization_multilevel_between = ending_regularization; }
2146+
2147+
21092148
//---------------------------------------------------------------------------
21102149
void Optimize::SetRecomputeRegularizationInterval(int recompute_regularization_interval)
21112150
{ this->m_recompute_regularization_interval = recompute_regularization_interval; }

Libs/Optimize/Optimize.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,15 @@ class Optimize {
189189
void SetStartingRegularization(double starting_regularization);
190190
//! Set the ending regularization (TODO: details)
191191
void SetEndingRegularization(double ending_regularization);
192+
193+
void SetStartingRegularizationMultilevelWithin(std::vector<double> reg_params_start);
194+
//! Set the ending regularization (TODO: details)
195+
void SetEndingRegularizationMultilevelWithin(std::vector<double> reg_params_end);
196+
void SetStartingRegularizationMultilevelBetween(double reg_params_start);
197+
//! Set the ending regularization (TODO: details)
198+
void SetEndingRegularizationMultilevelBetween(double reg_params_end);
199+
200+
192201
//! Set the interval for recomputing regularization (TODO: details)
193202
void SetRecomputeRegularizationInterval(int recompute_regularization_interval);
194203
//! Set if initialization splits should be saved or not
@@ -395,6 +404,10 @@ class Optimize {
395404
double m_initial_relative_weighting = 0.05;
396405
double m_starting_regularization = 1000;
397406
double m_ending_regularization = 1.0;
407+
std::vector<double> m_ending_regularization_multilevel;
408+
std::vector<double> m_starting_regularization_multilevel;
409+
double m_starting_regularization_multilevel_between = 1000;
410+
double m_ending_regularization_multilevel_between = 1.0;
398411
int m_recompute_regularization_interval = 1;
399412
bool m_save_init_splits = false;
400413
unsigned int m_checkpointing_interval = 50;

Libs/Optimize/OptimizeParameters.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,54 @@ bool OptimizeParameters::get_use_mlpca_optimize()
149149
return use_mlpca_optimize;
150150
}
151151

152+
//---------------------------------------------------------------------------
153+
std::vector<double> OptimizeParameters::get_starting_regularization_multilevel()
154+
{
155+
return this->params_.get("starting_regularization_multilevel", {1000.0});
156+
}
157+
158+
//---------------------------------------------------------------------------
159+
void OptimizeParameters::set_starting_regularization_multilevel(std::vector<double> reg_params_start)
160+
{
161+
return this->params_.set("starting_regularization_multilevel", reg_params_start);
162+
}
163+
164+
//---------------------------------------------------------------------------
165+
std::vector<double> OptimizeParameters::get_ending_regularization_multilevel()
166+
{
167+
return this->params_.get("ending_regularization_multilevel", {10.0});
168+
}
169+
170+
//---------------------------------------------------------------------------
171+
void OptimizeParameters::set_ending_regularization_multilevel(std::vector<double> reg_params_end)
172+
{
173+
return this->params_.set("ending_regularization_multilevel", reg_params_end);
174+
}
175+
176+
//---------------------------------------------------------------------------
177+
double OptimizeParameters::get_starting_regularization_between()
178+
{
179+
return this->params_.get("starting_regularization_between", 1000.0);
180+
}
181+
182+
//---------------------------------------------------------------------------
183+
void OptimizeParameters::set_starting_regularization_between(double value)
184+
{
185+
this->params_.set("starting_regularization_between", value);
186+
}
187+
188+
//---------------------------------------------------------------------------
189+
double OptimizeParameters::get_ending_regularization_between()
190+
{
191+
return this->params_.get("ending_regularization_between", 10.0);
192+
}
193+
194+
//---------------------------------------------------------------------------
195+
void OptimizeParameters::set_ending_regularization_between(double value)
196+
{
197+
this->params_.set("ending_regularization_between", value);
198+
}
199+
152200
//---------------------------------------------------------------------------
153201
double OptimizeParameters::get_normals_strength()
154202
{
@@ -265,6 +313,16 @@ bool OptimizeParameters::set_up_optimize(Optimize* optimize)
265313
}
266314

267315
optimize->SetMlpcaOptimize(use_mlpca_optimize);
316+
if(use_mlpca_optimize)
317+
{
318+
//Set reg parameters for each organ indiviually
319+
320+
optimize->SetStartingRegularizationMultilevelWithin(this->get_starting_regularization_multilevel());
321+
optimize->SetEndingRegularizationMultilevelWithin(this->get_ending_regularization_multilevel());
322+
optimize->SetStartingRegularizationMultilevelBetween(this->get_starting_regularization_between());
323+
optimize->SetEndingRegularizationMultilevelBetween(this->get_ending_regularization_between());
324+
325+
}
268326
optimize->SetUseNormals(use_normals);
269327
optimize->SetUseXYZ(use_xyz);
270328
optimize->SetUseMeshBasedAttributes(normals_enabled);

Libs/Optimize/OptimizeParameters.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ class OptimizeParameters {
5151
bool get_use_mlpca_optimize();
5252
void set_use_mlpca_optimize(bool value);
5353

54+
std::vector<double> get_starting_regularization_multilevel();
55+
void set_starting_regularization_multilevel(std::vector<double> reg_params_start);
56+
57+
std::vector<double> get_ending_regularization_multilevel();
58+
void set_ending_regularization_multilevel(std::vector<double> reg_params_end);
59+
60+
double get_starting_regularization_between();
61+
void set_starting_regularization_between(double value);
62+
63+
double get_ending_regularization_between();
64+
void set_ending_regularization_between(double value);
65+
5466
double get_normals_strength();
5567
void set_normals_strength(double value);
5668

Libs/Optimize/ParticleSystem/CorrespondenceMode.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace shapeworks {
99
EnsembleMixedEffectsEntropy = 4,
1010
MeshBasedGeneralEntropy = 5,
1111
MeshBasedGeneralMeanEnergy = 6,
12-
MlpcaBasedEnsembleEntropy = 7,
13-
MlpcaBasedEnsembleEntropyMeanEnergy = 8
12+
MlpcaBasedEnsembleEntropy = 7
13+
// MlpcaBasedEnsembleEntropyMeanEnergy = 8
1414
};
1515
}

Libs/Optimize/ParticleSystem/Sampler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ Sampler::Sampler()
3636
m_EnsembleRegressionEntropyFunction = itk::ParticleEnsembleEntropyFunction<Dimension>::New();
3737
m_EnsembleMixedEffectsEntropyFunction = itk::ParticleEnsembleEntropyFunction<Dimension>::New();
3838
m_MeshBasedGeneralEntropyGradientFunction = itk::ParticleMeshBasedGeneralEntropyGradientFunction<Dimension>::New();
39-
// TODO: Initialize Mlpca optimization function
4039
m_MlpcaBasedEnsembleEntropyFunction = itk::ParticleEnsembleMlpcaEntropyFunction<Dimension>::New();
4140
std::cout << "sampler constructor " << std::endl;
4241
m_ShapeMatrix = itk::ParticleShapeMatrixAttribute<double, Dimension>::New();
@@ -269,6 +268,7 @@ void Sampler::Execute()
269268

270269
//this->GetOptimizer()->SetShapeMatrix(this->m_ShapeMatrix);
271270
if(m_CorrespondenceMode == shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropy){
271+
// if(m_CorrespondenceMode == shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropy || m_CorrespondenceMode == shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropyMeanEnergy){
272272
std::cout << "Inside MLPCA sampler execute" << std::endl;
273273
this->GetOptimizer()->StartMlpcaOptimization(m_LinkingFunction->GetBOn());
274274
}

Libs/Optimize/ParticleSystem/Sampler.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -272,12 +272,12 @@ class Sampler {
272272
m_LinkingFunction->SetFunctionB(m_MlpcaBasedEnsembleEntropyFunction);
273273
m_MlpcaBasedEnsembleEntropyFunction->UseEntropy();
274274
}
275-
else if (mode == shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropyMeanEnergy) {
276-
std::cout << "mode IS --> H " << std::endl;
277-
std::cout << "Linking set to mlpca ensemble Mean Energy entropy BEFORE" << std::endl;
278-
m_LinkingFunction->SetFunctionB(m_MlpcaBasedEnsembleEntropyFunction);
279-
m_MlpcaBasedEnsembleEntropyFunction->UseMeanEnergy();
280-
}
275+
// else if (mode == shapeworks::CorrespondenceMode::MlpcaBasedEnsembleEntropyMeanEnergy) {
276+
// std::cout << "mode IS --> H " << std::endl;
277+
// std::cout << "Linking set to mlpca ensemble Mean Energy entropy BEFORE" << std::endl;
278+
// m_LinkingFunction->SetFunctionB(m_MlpcaBasedEnsembleEntropyFunction);
279+
// m_MlpcaBasedEnsembleEntropyFunction->UseMeanEnergy();
280+
// }
281281

282282
m_CorrespondenceMode = mode;
283283

Libs/Optimize/ParticleSystem/itkParticleDualVectorFunction.h

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,32 @@ class ParticleDualVectorFunction : public ParticleVectorFunction<VDimension>
155155
return ansB;
156156
}
157157

158+
virtual double EnergyBBetween(unsigned int idx, unsigned int d, const ParticleSystemType *system) const
159+
{
160+
m_FunctionB->BeforeEvaluate(idx, d, system);
161+
double ansB = 0.0;
162+
if (m_BOn == true)
163+
{
164+
const itk::ParticleEnsembleMlpcaEntropyFunction<VDimension>* mlpca_function_b = dynamic_cast <const itk::ParticleEnsembleMlpcaEntropyFunction<VDimension>*> (m_FunctionB.GetPointer());
165+
ansB = mlpca_function_b->EnergyFromWithinResiduals(idx, d, system);
166+
}
167+
ansB *= m_RelativeEnergyScaling;
168+
return ansB;
169+
}
170+
171+
virtual double EnergyBWithin(unsigned int idx, unsigned int d, const ParticleSystemType *system) const
172+
{
173+
m_FunctionB->BeforeEvaluate(idx, d, system);
174+
double ansB = 0.0;
175+
if (m_BOn == true)
176+
{
177+
const itk::ParticleEnsembleMlpcaEntropyFunction<VDimension>* mlpca_function_b = dynamic_cast <const itk::ParticleEnsembleMlpcaEntropyFunction<VDimension>*> (m_FunctionB.GetPointer());
178+
ansB = mlpca_function_b->EnergyFromBetweenResiduals(idx, d, system);
179+
}
180+
ansB *= m_RelativeEnergyScaling; // TODO: Ensure proper usage here
181+
return ansB;
182+
}
183+
158184
virtual double Energy(unsigned int idx, unsigned int d, const ParticleSystemType *system) const
159185
{
160186
double ansA = 0.0;
@@ -275,7 +301,7 @@ class ParticleDualVectorFunction : public ParticleVectorFunction<VDimension>
275301
{
276302
// B is active, A is not active
277303
finalEnergy = ansB;
278-
return finalEnergy ;
304+
return m_RelativeEnergyScaling * finalEnergy ;
279305

280306
}
281307
return 0.0;
@@ -387,19 +413,25 @@ class ParticleDualVectorFunction : public ParticleVectorFunction<VDimension>
387413

388414
// evaluate individual functions: A = surface energy, B = correspondence
389415
if (m_AOn == true)
390-
{
416+
{
417+
std::cout << "evaluating A" << std::endl;
391418
ansA = m_FunctionA->Evaluate(idx, d, system, maxA, energyA);
392419
const_cast<ParticleDualVectorFunction *>(this)->m_AverageGradMagA = m_AverageGradMagA + ansA.magnitude();
393420
const_cast<ParticleDualVectorFunction *>(this)->m_AverageEnergyA = m_AverageEnergyA + energyA;
421+
std::cout << "evaluating A done" << std::endl;
422+
394423
}
395424

396425
if (m_BOn == true)
397426
{
427+
std::cout << "evaluating B" << std::endl;
398428
const itk::ParticleEnsembleMlpcaEntropyFunction<VDimension>* mlpca_function_b = dynamic_cast <const itk::ParticleEnsembleMlpcaEntropyFunction<VDimension>*> (m_FunctionB.GetPointer());
399429
ansB = mlpca_function_b->EvaluateFromBetweenResiduals(idx, d, system, maxB, energyB);
400430
const_cast<ParticleDualVectorFunction *>(this)->m_AverageWithinGradMagB = m_AverageWithinGradMagB + ansB.magnitude();
401431
const_cast<ParticleDualVectorFunction *>(this)->m_AverageWithinEnergyB = m_AverageWithinEnergyB + energyB;
402-
std::cout << "WITHIN Subspace Grad Mag " << ansB.magnitude() << " Energy " << energyB << std::endl;
432+
// std::cout << "WITHIN Subspace Grad Mag " << ansB.magnitude() << " Energy " << energyB << std::endl;
433+
std::cout << "evaluating B done" << std::endl;
434+
403435
}
404436

405437
if( m_RelativeEnergyScaling == 0.0)
@@ -506,7 +538,7 @@ class ParticleDualVectorFunction : public ParticleVectorFunction<VDimension>
506538
// std::cout << " inside B between eval done" << std::endl;
507539
const_cast<ParticleDualVectorFunction *>(this)->m_AverageBetweenGradMagB = m_AverageBetweenGradMagB + ansB.magnitude();
508540
const_cast<ParticleDualVectorFunction *>(this)->m_AverageBetweenEnergyB = m_AverageBetweenEnergyB + energyB;
509-
std::cout << "BETWEEN Subspace Grad Mag " << ansB.magnitude() << " Energy " << energyB << std::endl;
541+
// std::cout << "BETWEEN Subspace Grad Mag " << ansB.magnitude() << " Energy " << energyB << std::endl;
510542
}
511543

512544
if( m_RelativeEnergyScaling == 0.0)

0 commit comments

Comments
 (0)