1#ifndef OPTIMAL_TRANSPORT_PLAN_H
2#define OPTIMAL_TRANSPORT_PLAN_H
14#include <deal.II/base/point.h>
15#include <deal.II/base/quadrature_lib.h>
16#include <deal.II/base/utilities.h>
17#include <deal.II/base/function.h>
18#include <deal.II/base/parameter_acceptor.h>
19#include <deal.II/lac/vector.h>
20#include <deal.II/grid/tria.h>
21#include <deal.II/fe/fe_values.h>
22#include <deal.II/numerics/rtree.h>
23#include <deal.II/numerics/vector_tools.h>
24#include <deal.II/numerics/data_out.h>
30using namespace dealii;
45template <
int spacedim>
72 const std::vector<double>& density);
80 const std::vector<double>& density);
88 const double regularization_param = 0.0);
107 void save_map(
const std::string& output_dir)
const;
135 std::unique_ptr<MapApproximationStrategy<spacedim>>
strategy;
138 static std::unique_ptr<MapApproximationStrategy<spacedim>>
147template <
int spacedim>
164 const std::function<
double(
const Point<spacedim>&,
const Point<spacedim>&)> distance_function,
166 const std::vector<double>& source_density,
167 const std::vector<Point<spacedim>>& target_points,
168 const std::vector<double>& target_density,
169 const Vector<double>& potential,
170 const double regularization_param,
171 const double truncation_radius) = 0;
193 template <
int spacedim>
208 const std::function<
double(
const Point<spacedim>&,
const Point<spacedim>&)> distance_function,
210 const std::vector<double>& source_density,
211 const std::vector<Point<spacedim>>& target_points,
212 const std::vector<double>& target_density,
213 const Vector<double>& potential,
214 const double regularization_param,
215 const double truncation_radius)
override;
221 void save_results(
const std::string& output_dir)
const override;
232template <
int spacedim>
247 const std::function<
double(
const Point<spacedim>&,
const Point<spacedim>&)> distance_function,
249 const std::vector<double>& source_density,
250 const std::vector<Point<spacedim>>& target_points,
251 const std::vector<double>& target_density,
252 const Vector<double>& potential,
253 const double regularization_param,
254 const double truncation_radius)
override;
260 void save_results(
const std::string& output_dir)
const override;
A collection of distance functions, their gradients, and exponential maps.
Barycentric interpolation strategy for map approximation.
void compute_map(const std::function< double(const Point< spacedim > &, const Point< spacedim > &)> distance_function, const std::vector< Point< spacedim > > &source_points, const std::vector< double > &source_density, const std::vector< Point< spacedim > > &target_points, const std::vector< double > &target_density, const Vector< double > &potential, const double regularization_param, const double truncation_radius) override
Computes the transport map.
void save_results(const std::string &output_dir) const override
Saves the results to a file.
Abstract base class for map approximation strategies.
virtual void save_results(const std::string &output_dir) const =0
Saves the results to a file.
std::vector< Point< spacedim > > source_points
The source points.
std::vector< Point< spacedim > > mapped_points
The mapped points.
virtual void compute_map(const std::function< double(const Point< spacedim > &, const Point< spacedim > &)> distance_function, const std::vector< Point< spacedim > > &source_points, const std::vector< double > &source_density, const std::vector< Point< spacedim > > &target_points, const std::vector< double > &target_density, const Vector< double > &potential, const double regularization_param, const double truncation_radius)=0
Computes the transport map.
std::vector< double > transport_density
The transported density.
virtual ~MapApproximationStrategy()=default
Modal strategy for map approximation.
void compute_map(const std::function< double(const Point< spacedim > &, const Point< spacedim > &)> distance_function, const std::vector< Point< spacedim > > &source_points, const std::vector< double > &source_density, const std::vector< Point< spacedim > > &target_points, const std::vector< double > &target_density, const Vector< double > &potential, const double regularization_param, const double truncation_radius) override
Computes the transport map.
void save_results(const std::string &output_dir) const override
Saves the results to a file.
A class for computing and managing optimal transport map approximations.
void compute_map()
Compute the optimal transport map approximation using the current strategy.
Vector< double > transport_potential
std::vector< Point< spacedim > > source_points
std::vector< Point< spacedim > > target_points
static std::unique_ptr< MapApproximationStrategy< spacedim > > create_strategy(const std::string &name)
static std::vector< std::string > get_available_strategies()
Get available strategy names.
void set_strategy(const std::string &strategy_name)
Change the approximation strategy.
void set_distance_function(const std::function< double(const Point< spacedim > &, const Point< spacedim > &)> &dist)
Set the distance function used to compute distances between points. This function accepts a callable ...
std::function< double(const Point< spacedim > &, const Point< spacedim > &)> distance_function
std::vector< double > source_density
void set_target_measure(const std::vector< Point< spacedim > > &points, const std::vector< double > &density)
Set the target measure data.
void set_source_measure(const std::vector< Point< spacedim > > &points, const std::vector< double > &density)
Set the source measure data.
std::vector< double > target_density
void set_truncation_radius(double radius)
Set the truncation radius for map computation. Points outside this radius will not be considered in t...
std::unique_ptr< MapApproximationStrategy< spacedim > > strategy
void set_potential(const Vector< double > &potential, const double regularization_param=0.0)
Set the optimal transport potential.
void save_map(const std::string &output_dir) const
Save the computed transport map to files.