Libs/Optimize/GradientDescentOptimizer.h
Namespaces
| Name | 
|---|
| shapeworks  User usage reporting (telemetry)  | 
Classes
| Name | |
|---|---|
| class | shapeworks::GradientDescentOptimizer | 
Source code
#pragma once
#include <algorithm>
#include <limits>
#include <vector>
#include "Libs/Optimize/Domain/ImageDomainWithGradients.h"
#include "Libs/Optimize/Function/VectorFunction.h"
#include "ParticleSystem.h"
#include "itkObject.h"
#include "itkObjectFactory.h"
#include "itkWeakPointer.h"
#include "vnl/vnl_vector_fixed.h"
namespace shapeworks {
class GradientDescentOptimizer : public itk::Object {
 public:
  using TGradientNumericType = float;
  constexpr static unsigned int VDimension = 3;
  typedef GradientDescentOptimizer Self;
  typedef itk::Object Superclass;
  typedef itk::SmartPointer<Self> Pointer;
  typedef itk::SmartPointer<const Self> ConstPointer;
  typedef itk::WeakPointer<const Self> ConstWeakPointer;
  itkNewMacro(Self);
  typedef shapeworks::ImageDomainWithGradients<TGradientNumericType> DomainType;
  itkTypeMacro(ParticleGradientDescentPositionOptimizer, Object);
  itkStaticConstMacro(Dimension, unsigned int, VDimension);
  typedef ParticleSystem ParticleSystemType;
  typedef VectorFunction GradientFunctionType;
  typedef typename GradientFunctionType::VectorType VectorType;
  typedef typename ParticleSystemType::PointType PointType;
  void StartOptimization() { this->StartAdaptiveGaussSeidelOptimization(); }
  void StartAdaptiveGaussSeidelOptimization();
  void AugmentedLagrangianConstraints(VectorType& gradient, const PointType& pt, const size_t& dom,
                                      const double& maximumUpdateAllowed, size_t index);
  inline void StopOptimization() { this->m_StopOptimization = true; }
  inline void AbortProcessing() {
    this->m_StopOptimization = true;
    this->m_AbortProcessing = true;
  }
  itkGetMacro(NumberOfIterations, unsigned int);
  itkSetMacro(NumberOfIterations, unsigned int);
  void SetVerbosity(unsigned int val) { m_verbosity = val; }
  unsigned int GetVerbosity() { return m_verbosity; }
  itkGetMacro(TimeStep, double);
  itkSetMacro(TimeStep, double);
  itkGetMacro(MaximumNumberOfIterations, unsigned int);
  itkSetMacro(MaximumNumberOfIterations, unsigned int);
  itkGetMacro(Tolerance, double);
  itkSetMacro(Tolerance, double);
  itkGetObjectMacro(ParticleSystem, ParticleSystemType);
  itkSetObjectMacro(ParticleSystem, ParticleSystemType);
  itkGetObjectMacro(GradientFunction, GradientFunctionType);
  itkSetObjectMacro(GradientFunction, GradientFunctionType);
  void SetInitializationMode(bool b) { m_initialization_mode = b; }
  void SetCheckIterations(size_t si) { m_check_iterations = si; }
  void SetInitializationStartScalingFactor(double si) { m_initialization_start_scaling_factor = si; }
 protected:
  GradientDescentOptimizer();
  GradientDescentOptimizer(const GradientDescentOptimizer&);
  const GradientDescentOptimizer& operator=(const GradientDescentOptimizer&);
  void PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); }
  virtual ~GradientDescentOptimizer(){};
 private:
  typename ParticleSystemType::Pointer m_ParticleSystem;
  typename GradientFunctionType::Pointer m_GradientFunction;
  bool m_StopOptimization;
  bool m_AbortProcessing = false;
  unsigned int m_NumberOfIterations;
  unsigned int m_MaximumNumberOfIterations;
  double m_Tolerance;
  double m_TimeStep;
  std::vector<std::vector<double> > m_TimeSteps;
  unsigned int m_verbosity;
  // Adaptive Initialization variables
  bool m_initialization_mode = false;
  size_t m_check_iterations = 50;
  double m_initialization_start_scaling_factor;
  void ResetTimeStepVectors();
};
}  // namespace shapeworks
Updated on 2024-03-17 at 12:58:44 -0600