2
0
mirror of https://github.com/boostorg/math.git synced 2026-02-25 04:22:15 +00:00
Files
math/doc/html/math_toolkit/gd_opt/minimize.html
2026-01-28 22:12:08 -05:00

334 lines
34 KiB
HTML

<html>
<head>
<meta charset="UTF-8">
<title>minimize</title>
<link rel="stylesheet" href="../../math.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../../index.html" title="Math Toolkit 4.2.1">
<link rel="up" href="../gd_opt.html" title="Gradient Based Optimizers">
<link rel="prev" href="lbfgs.html" title="L-BFGS">
<link rel="next" href="policies.html" title="Reverse Mode autodiff policies">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="lbfgs.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../gd_opt.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="policies.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="math_toolkit.gd_opt.minimize"></a><a class="link" href="minimize.html" title="minimize">minimize</a>
</h3></div></div></div>
<h5>
<a name="math_toolkit.gd_opt.minimize.h0"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.synopsis"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.synopsis">Synopsis</a>
</h5>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">optimization</span><span class="special">/</span><span class="identifier">minimizer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">math</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">optimization</span> <span class="special">{</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">optimization_result</span>
<span class="special">{</span>
<span class="identifier">size_t</span> <span class="identifier">num_iter</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="identifier">RealType</span> <span class="identifier">objective_value</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;</span> <span class="identifier">objective_history</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="identifier">converged</span><span class="special">;</span>
<span class="special">};</span>
<span class="comment">/* Minimize an objective using a given optimizer.
*
* The optimizer `opt` must expose a `step()` method and the associated
* typedefs:
* - argument_container_t
* - real_type_t
*
* The behavior of the minimization loop is controlled by policy objects:
* - ConstraintPolicy: projects variables onto a feasible set
* - ConvergencePolicy: determines when convergence has been reached
* - TerminationPolicy: determines when optimization must stop regardless
* of convergence (e.g. max iterations)
*
* The function returns an `optimization_result` summarizing the run.
*/</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Optimizer</span><span class="special">,</span>
<span class="keyword">class</span> <span class="identifier">ConstraintPolicy</span> <span class="special">=</span>
<span class="identifier">unconstrained_policy</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Optimizer</span><span class="special">::</span><span class="identifier">argument_container_t</span><span class="special">&gt;,</span>
<span class="keyword">class</span> <span class="identifier">ConvergencePolicy</span> <span class="special">=</span>
<span class="identifier">gradient_norm_convergence_policy</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Optimizer</span><span class="special">::</span><span class="identifier">real_type_t</span><span class="special">&gt;,</span>
<span class="keyword">class</span> <span class="identifier">TerminationPolicy</span> <span class="special">=</span> <span class="identifier">max_iter_termination_policy</span><span class="special">&gt;</span>
<span class="keyword">auto</span> <span class="identifier">minimize</span><span class="special">(</span><span class="identifier">Optimizer</span><span class="special">&amp;</span> <span class="identifier">opt</span><span class="special">,</span>
<span class="identifier">ConstraintPolicy</span> <span class="identifier">project</span> <span class="special">=</span> <span class="identifier">ConstraintPolicy</span><span class="special">{},</span>
<span class="identifier">ConvergencePolicy</span> <span class="identifier">converged</span> <span class="special">=</span>
<span class="identifier">ConvergencePolicy</span><span class="special">{</span>
<span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Optimizer</span><span class="special">::</span><span class="identifier">real_type_t</span><span class="special">&gt;(</span><span class="number">1e-3</span><span class="special">)</span> <span class="special">},</span>
<span class="identifier">TerminationPolicy</span> <span class="identifier">terminate</span> <span class="special">=</span> <span class="identifier">TerminationPolicy</span><span class="special">(</span><span class="number">100000</span><span class="special">),</span>
<span class="keyword">bool</span> <span class="identifier">history</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">)</span>
</pre>
<p>
This header provides a generic driver function <code class="computeroutput"><span class="identifier">minimize</span></code>
that repeatedly advances an optimizer via <code class="computeroutput"><span class="identifier">step</span><span class="special">()</span></code>, optionally projects parameters onto a
constraint set, and stops when either a convergence criterion is met or a
termination criterion triggers.
</p>
<h5>
<a name="math_toolkit.gd_opt.minimize.h1"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.parameters"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.parameters">Parameters</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<code class="computeroutput"><span class="identifier">Optimizer</span><span class="special">&amp;</span>
<span class="identifier">opt</span></code> : Optimizer instance.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">ConstraintPolicy</span> <span class="identifier">project</span></code>
: Projection policy applied after each <code class="computeroutput"><span class="identifier">step</span><span class="special">()</span></code>. Default is <code class="computeroutput"><span class="identifier">unconstrained_policy</span></code>
(no projection).
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">ConvergencePolicy</span> <span class="identifier">converged</span></code>
: Stopping criterion. Default is <code class="computeroutput"><span class="identifier">gradient_norm_convergence_policy</span><span class="special">(</span><span class="identifier">tol</span><span class="special">=</span><span class="number">1e-3</span><span class="special">)</span></code>.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">TerminationPolicy</span> <span class="identifier">terminate</span></code>
: Hard stop criterion. Default is <code class="computeroutput"><span class="identifier">max_iter_termination_policy</span><span class="special">(</span><span class="number">100000</span><span class="special">)</span></code>.
</li>
<li class="listitem">
<code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">history</span></code>
: If true, records <code class="computeroutput"><span class="identifier">opt</span><span class="special">.</span><span class="identifier">objective_value</span><span class="special">()</span></code> after each iteration in <code class="computeroutput"><span class="identifier">optimization_result</span><span class="special">::</span><span class="identifier">objective_history</span><span class="special">.</span></code>
</li>
</ul></div>
<h5>
<a name="math_toolkit.gd_opt.minimize.h2"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.convergence_policies"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.convergence_policies">Convergence
Policies</a>
</h5>
<p>
Convergence policies decide when the optimization has converged. Each policy
has the signature:
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">GradientContainer</span><span class="special">&amp;</span> <span class="identifier">g</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">objective_value</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h3"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.gradient_norm_convergence_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.gradient_norm_convergence_policy">gradient_norm_convergence_policy</a>
</h5>
<p>
Stops when the Euclidean norm of the gradient falls below a tolerance:
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">gradient_norm_convergence_policy</span>
<span class="special">{</span>
<span class="keyword">explicit</span> <span class="identifier">gradient_norm_convergence_policy</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">tol</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GradientContainer</span><span class="special">&gt;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">GradientContainer</span><span class="special">&amp;</span> <span class="identifier">g</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">objective_v</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h4"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.objective_tol_convergence_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.objective_tol_convergence_policy">objective_tol_convergence_policy</a>
</h5>
<p>
Stops when the absolute change in objective value between successive iterations
drops below a tolerance:
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">objective_tol_convergence_policy</span>
<span class="special">{</span>
<span class="keyword">explicit</span> <span class="identifier">objective_tol_convergence_policy</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">tol</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GradientContainer</span><span class="special">&gt;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">GradientContainer</span><span class="special">&amp;,</span> <span class="identifier">RealType</span> <span class="identifier">objective_v</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<p>
The first call always returns false
</p>
<h5>
<a name="math_toolkit.gd_opt.minimize.h5"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.relative_objective_tol_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.relative_objective_tol_policy">relative_objective_tol_policy</a>
</h5>
<p>
Stops when the relative objective change drops below a tolerance:
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">relative_objective_tol_policy</span>
<span class="special">{</span>
<span class="keyword">explicit</span> <span class="identifier">relative_objective_tol_policy</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">rel_tol</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GradientContainer</span><span class="special">&gt;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">GradientContainer</span><span class="special">&amp;,</span> <span class="identifier">RealType</span> <span class="identifier">objective_v</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<p>
The relative change is computed as:
</p>
<pre class="programlisting"><span class="identifier">abs</span><span class="special">(</span><span class="identifier">obj</span> <span class="special">-</span> <span class="identifier">last_obj</span><span class="special">)</span> <span class="special">/</span> <span class="identifier">max</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="identifier">abs</span><span class="special">(</span><span class="identifier">last_obj</span><span class="special">))</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h6"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.combined_convergence_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.combined_convergence_policy">combined_convergence_policy</a>
</h5>
<p>
Combines two convergence policies and stops when either triggers:
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Policy1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policy2</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">combined_convergence_policy</span>
<span class="special">{</span>
<span class="identifier">combined_convergence_policy</span><span class="special">(</span><span class="identifier">Policy1</span> <span class="identifier">p1</span><span class="special">,</span> <span class="identifier">Policy2</span> <span class="identifier">p2</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">GradientContainer</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">RealType</span><span class="special">&gt;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">GradientContainer</span><span class="special">&amp;</span> <span class="identifier">g</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">obj</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h7"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.termination_policies"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.termination_policies">Termination
Policies</a>
</h5>
<p>
Termination policies provide a hard stop independent of convergence. Each
policy has the signature:
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">size_t</span> <span class="identifier">iter</span><span class="special">);</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h8"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.max_iter_termination_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.max_iter_termination_policy">max_iter_termination_policy</a>
</h5>
<p>
Stops after a fixed number of iterations
</p>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">max_iter_termination_policy</span> <span class="special">{</span> <span class="keyword">explicit</span> <span class="identifier">max_iter_termination_policy</span><span class="special">(</span><span class="identifier">size_t</span> <span class="identifier">max_iter</span><span class="special">);</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">size_t</span> <span class="identifier">iter</span><span class="special">);</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h9"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.wallclock_termination_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.wallclock_termination_policy">wallclock_termination_policy</a>
</h5>
<p>
Stops after a wall-clock time budget:
</p>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">wallclock_termination_policy</span> <span class="special">{</span> <span class="keyword">explicit</span> <span class="identifier">wallclock_termination_policy</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">milliseconds</span> <span class="identifier">max_time</span><span class="special">);</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">size_t</span> <span class="identifier">iter</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h10"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.constraint_and_projection_polici"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.constraint_and_projection_polici">Constraint
and Projection Policies</a>
</h5>
<p>
Projection policies modify the optimizer variables after each step. Each
policy has the signature:
</p>
<pre class="programlisting"><span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h11"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.unconstrained_policy"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.unconstrained_policy">unconstrained_policy</a>
</h5>
<p>
No projection; leaves parameters unchanged
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">unconstrained_policy</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;);</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h12"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.box_constraints"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.box_constraints">box_constraints</a>
</h5>
<p>
Clamps each variable into <code class="computeroutput"><span class="special">[</span><span class="identifier">min</span><span class="special">,</span> <span class="identifier">max</span><span class="special">]</span></code>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">box_constraints</span> <span class="special">{</span> <span class="identifier">box_constraints</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">min</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">max</span><span class="special">);</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">);</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h13"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.nonnegativity_constraint"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.nonnegativity_constraint">nonnegativity_constraint</a>
</h5>
<p>
Sets anything less than <code class="computeroutput"><span class="number">0</span></code> to
<code class="computeroutput"><span class="number">0</span></code>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">nonnegativity_constraint</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h14"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.l2_ball_constraint"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.l2_ball_constraint">l2_ball_constraint</a>
</h5>
<p>
Projects onto the <code class="computeroutput"><span class="identifier">L2</span></code> ball
of radius <code class="computeroutput"><span class="identifier">radius</span></code> by uniform
scaling when needed
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">l2_ball_constraint</span> <span class="special">{</span> <span class="keyword">explicit</span> <span class="identifier">l2_ball_constraint</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">radius</span><span class="special">);</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h15"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.l1_ball_constraint"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.l1_ball_constraint">l1_ball_constraint</a>
</h5>
<p>
Projects onto the <code class="computeroutput"><span class="identifier">L1</span></code> ball
of radius <code class="computeroutput"><span class="identifier">radius</span></code> by uniform
scaling
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">l1_ball_constraint</span> <span class="special">{</span> <span class="keyword">explicit</span> <span class="identifier">l1_ball_constraint</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">radius</span><span class="special">);</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<p>
This is not the exact Euclidean projection onto the L1 ball; it is a simple
scaling-based constraint
</p>
<h5>
<a name="math_toolkit.gd_opt.minimize.h16"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.simplex_constraint"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.simplex_constraint">simplex_constraint</a>
</h5>
<p>
Projects onto the scaled probability simplex by clipping negatives to <code class="computeroutput"><span class="number">0</span></code> and renormalizing to sum to <code class="computeroutput"><span class="number">1</span></code>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">simplex_constraint</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h17"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.function_constraint"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.function_constraint">function_constraint</a>
</h5>
<p>
Wraps a user-provided projection function
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">function_constraint</span> <span class="special">{</span> <span class="keyword">using</span> <span class="identifier">func_t</span> <span class="special">=</span> <span class="keyword">void</span> <span class="special">(*)(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;);</span> <span class="keyword">explicit</span> <span class="identifier">function_constraint</span><span class="special">(</span><span class="identifier">func_t</span> <span class="identifier">f</span><span class="special">);</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<h5>
<a name="math_toolkit.gd_opt.minimize.h18"></a>
<span class="phrase"><a name="math_toolkit.gd_opt.minimize.unit_sphere_constraint"></a></span><a class="link" href="minimize.html#math_toolkit.gd_opt.minimize.unit_sphere_constraint">unit_sphere_constraint</a>
</h5>
<p>
Normalizes the vector to unit L2 norm
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealType</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">unit_sphere_constraint</span> <span class="special">{</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">ArgumentContainer</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> <span class="special">};</span>
</pre>
<p>
This projects onto the unit sphere (if ||x||_2 &gt; 0)
</p>
</div>
<div class="copyright-footer">Copyright © 2006-2021 Nikhar Agrawal, Anton Bikineev, Matthew Borland,
Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert Holin, Bruno
Lalande, John Maddock, Evan Miller, Jeremy Murphy, Matthew Pulver, Johan Råde,
Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg, Daryle
Walker, Xiaogang Zhang, and Maksym Zhelyeznyakov<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="lbfgs.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../gd_opt.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="policies.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>