blob: 1ac88c18e337e6bd238619e3b9e741df4dc5f5b4 [file] [log] [blame]
//#####################################################################
// Copyright 2004-2005, Igor Neverov, Eftychios Sifakis.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class LANDMARK_PROXIMITY_OPTIMIZATION
//#####################################################################
#ifndef __LANDMARK_PROXIMITY_OPTIMIZATION__
#define __LANDMARK_PROXIMITY_OPTIMIZATION__
#include "../../Public_Library/Matrices_And_Vectors/MATRIX_MXN.h"
#include "FACE_OPTIMIZATION.h"
#include "FACE_LANDMARK_OPTIMIZATION_GOAL.h"
namespace PhysBAM
{
template <class T>
class LANDMARK_PROXIMITY_OPTIMIZATION: public FACE_OPTIMIZATION<T>
{
public:
using FACE_OPTIMIZATION<T>::control_parameters;
using FACE_OPTIMIZATION<T>::deformable_object;
using FACE_OPTIMIZATION<T>::jacobian;
using FACE_OPTIMIZATION<T>::Update_Jacobian;
using FACE_OPTIMIZATION<T>::Update_Collision_Body_Positions_And_Velocities;
FACE_LANDMARK_OPTIMIZATION_GOAL<T>& landmark_optimization_goal;
T linesearch_cg_tolerance, linesearch_newton_tolerance;
int linesearch_cg_iterations, linesearch_newton_iterations, linesearch_depth;
T penalty_ramping_factor, penalty_ramping_step;
ARRAY<T> proximity_weights;
bool use_golden_section_search;
LANDMARK_PROXIMITY_OPTIMIZATION (DEFORMABLE_OBJECT_3D<T> &deformable_object_input, FACE_CONTROL_PARAMETERS<T>& control_parameters_input,
EXTERNAL_FORCES_AND_VELOCITIES<T, VECTOR_3D<T> >&default_external_forces_and_velocities_input, FACE_LANDMARK_OPTIMIZATION_GOAL<T>& landmark_optimization_goal_input)
: FACE_OPTIMIZATION<T> (deformable_object_input, control_parameters_input, default_external_forces_and_velocities_input), landmark_optimization_goal (landmark_optimization_goal_input),
linesearch_cg_tolerance ( (T) 1e-3), linesearch_newton_tolerance ( (T) 1e-2), linesearch_cg_iterations (100), linesearch_newton_iterations (20), linesearch_depth (6),
proximity_weights (0), penalty_ramping_factor ( (T) 1e6), penalty_ramping_step ( (T) 1.01), use_golden_section_search (true)
{}
void Write_Optimization_Goal_Data (const std::string& output_prefix, const int frame_input, const int step_input = 0) const
{
std::string f = STRING_UTILITIES::string_sprintf (".%d", frame_input), s = (step_input > 0) ? STRING_UTILITIES::string_sprintf (".step_%d", step_input) : "";
assert (landmark_optimization_goal.target_landmarks.m == landmark_optimization_goal.embedded_landmarks.m);
ARRAY<VECTOR_3D<T> > embedded_landmark_positions (landmark_optimization_goal.embedded_landmarks.m);
for (int i = 1; i <= landmark_optimization_goal.embedded_landmarks.m; i++)
embedded_landmark_positions (i) = landmark_optimization_goal.embedded_landmarks (i).Evaluate (deformable_object.particles.X.array);
FILE_UTILITIES::Write_To_File<T> (output_prefix + "embedded_markers" + f + s, embedded_landmark_positions);
}
void Default() const
{
std::cout << "THIS LANDMARK_PROXIMITY_OPTIMIZATION FUNCTION IS NOT DEFINED!" << std::endl;
}
//#####################################################################
bool Optimization_Step();
void Perform_Linesearch_Sampling();
void Perform_Golden_Section_Search();
T Simulate_And_Optimize_Kinematics (ARRAY<VECTOR_3D<T> >& sample_positions, VECTOR_ND<T>& sample_controls, const ARRAY<int>& active_subset,
const ARRAY<int>& active_kinematic_subset, const VECTOR_ND<T>& original_active_kinematic_controls, const T sample_fraction);
T Optimization_Functional() const;
VECTOR_ND<T> Landmark_To_Target_Distances() const;
T Optimize_Kinematic_Parameters (const ARRAY<VECTOR_3D<T> >& sample_positions, VECTOR_ND<T>& sample_controls);
void Simulate_Linesearch_Sequence (ARRAY<ARRAY<VECTOR_3D<T> > >& linesearch_positions, ARRAY<VECTOR_ND<T> >& linesearch_controls, ARRAY<T>& linesearch_fractions,
const VECTOR_ND<T>& original_controls, const VECTOR_ND<T>& final_controls, const T lower_fraction, const T upper_fraction, const int levels);
void Compute_Linearized_Proximity_Error (MATRIX_NXN<T>& optimization_jacobian, VECTOR_ND<T>& optimization_residual, T& optimization_min_error);
VECTOR_ND<T> Compute_Gauss_Newton_Update (T* proximity_error_after_optimization = 0, bool verbose = true);
//#####################################################################
};
}
#endif