<?xml version='1.0'?>
<html xmlns='http://www.w3.org/1999/xhtml'
      xmlns:math='http://www.w3.org/1998/Math/MathML'
>
<head>
<title>Simple Checkpointing: Example and Test</title>
<meta http-equiv='Content-Type' content='text/html' charset='utf-8'/>
<meta name="description" id="description" content="Simple Checkpointing: Example and Test"/>
<meta name="keywords" id="keywords" content=" simple checkpointing: example test purpose "/>
<style type='text/css'>
body { color : black }
body { background-color : white }
A:link { color : blue }
A:visited { color : purple }
A:active { color : purple }
</style>
<script type='text/javascript' language='JavaScript' src='_checkpoint.cpp_xml.js'>
</script>
</head>
<body>
<table><tr>
<td>
<a href="http://www.coin-or.org/CppAD/" target="_top"><img border="0" src="_image.gif"/></a>
</td>
<td><a href="checkpoint.xml" target="_top">Prev</a>
</td><td><a href="atomic_mul_level.cpp.xml" target="_top">Next</a>
</td><td>
<select onchange='choose_across0(this)'>
<option>Index-&gt;</option>
<option>contents</option>
<option>reference</option>
<option>index</option>
<option>search</option>
<option>external</option>
</select>
</td>
<td>
<select onchange='choose_up0(this)'>
<option>Up-&gt;</option>
<option>CppAD</option>
<option>AD</option>
<option>ADValued</option>
<option>atomic</option>
<option>checkpoint</option>
<option>checkpoint.cpp</option>
</select>
</td>
<td>
<select onchange='choose_down3(this)'>
<option>ADValued-&gt;</option>
<option>Arithmetic</option>
<option>unary_standard_math</option>
<option>binary_math</option>
<option>CondExp</option>
<option>Discrete</option>
<option>numeric_limits</option>
<option>atomic</option>
</select>
</td>
<td>
<select onchange='choose_down2(this)'>
<option>atomic-&gt;</option>
<option>checkpoint</option>
<option>atomic_base</option>
</select>
</td>
<td>
<select onchange='choose_down1(this)'>
<option>checkpoint-&gt;</option>
<option>checkpoint.cpp</option>
<option>atomic_mul_level.cpp</option>
<option>checkpoint_ode.cpp</option>
<option>checkpoint_extended_ode.cpp</option>
</select>
</td>
<td>checkpoint.cpp</td>
<td>
<select onchange='choose_current0(this)'>
<option>Headings-&gt;</option>
<option>Purpose</option>
</select>
</td>
</tr></table><br/>



<center><b><big><big>Simple Checkpointing: Example and Test</big></big></b></center>
<br/>
<b><big><a name="Purpose" id="Purpose">Purpose</a></big></b>
<br/>
Break a large computation into pieces and only store values at the
interface of the pieces.
In actual applications, there may be many functions, but
for this example there are only two.
The functions

<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow>
<mi mathvariant='italic'>F</mi>
<mo stretchy="false">:</mo>
<msup><mrow><mstyle mathvariant='bold'><mi mathvariant='bold'>R</mi>
</mstyle></mrow>
<mn>2</mn>
</msup>
<mo stretchy="false">&#x02192;</mo>
<msup><mrow><mstyle mathvariant='bold'><mi mathvariant='bold'>R</mi>
</mstyle></mrow>
<mn>2</mn>
</msup>
</mrow></math>


and

<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow>
<mi mathvariant='italic'>G</mi>
<mo stretchy="false">:</mo>
<msup><mrow><mstyle mathvariant='bold'><mi mathvariant='bold'>R</mi>
</mstyle></mrow>
<mn>2</mn>
</msup>
<mo stretchy="false">&#x02192;</mo>
<msup><mrow><mstyle mathvariant='bold'><mi mathvariant='bold'>R</mi>
</mstyle></mrow>
<mn>2</mn>
</msup>
</mrow></math>


defined by

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow>
<mi mathvariant='italic'>F</mi>
<mo stretchy="false">(</mo>
<mi mathvariant='italic'>y</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">=</mo>
<mrow><mo stretchy="true">(</mo><mrow><mtable rowalign="center" ><mtr><mtd columnalign="center" >
<msub><mi mathvariant='italic'>y</mi>
<mn>0</mn>
</msub>
<mo stretchy="false">+</mo>
<msub><mi mathvariant='italic'>y</mi>
<mn>0</mn>
</msub>
<mo stretchy="false">+</mo>
<msub><mi mathvariant='italic'>y</mi>
<mn>0</mn>
</msub>
</mtd></mtr><mtr><mtd columnalign="center" >
<msub><mi mathvariant='italic'>y</mi>
<mn>1</mn>
</msub>
<mo stretchy="false">+</mo>
<msub><mi mathvariant='italic'>y</mi>
<mn>1</mn>
</msub>
<mo stretchy="false">+</mo>
<msub><mi mathvariant='italic'>y</mi>
<mn>1</mn>
</msub>
</mtd></mtr></mtable>
</mrow><mo stretchy="true">)</mo></mrow>
<mspace width='.3em'/>
<mo stretchy="false">,</mo>
<mspace width='.3em'/>
<mi mathvariant='italic'>G</mi>
<mo stretchy="false">(</mo>
<mi mathvariant='italic'>x</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">=</mo>
<mrow><mo stretchy="true">(</mo><mrow><mtable rowalign="center" ><mtr><mtd columnalign="center" >
<msub><mi mathvariant='italic'>x</mi>
<mn>0</mn>
</msub>
<mo stretchy="false">&#x000B7;</mo>
<msub><mi mathvariant='italic'>x</mi>
<mn>0</mn>
</msub>
<mo stretchy="false">&#x000B7;</mo>
<msub><mi mathvariant='italic'>x</mi>
<mn>0</mn>
</msub>
</mtd></mtr><mtr><mtd columnalign="center" >
<msub><mi mathvariant='italic'>x</mi>
<mn>1</mn>
</msub>
<mo stretchy="false">&#x000B7;</mo>
<msub><mi mathvariant='italic'>x</mi>
<mn>1</mn>
</msub>
<mo stretchy="false">&#x000B7;</mo>
<msub><mi mathvariant='italic'>x</mi>
<mn>1</mn>
</msub>
</mtd></mtr></mtable>
</mrow><mo stretchy="true">)</mo></mrow>
</mrow></math>

<code><font color="blue"><pre><tt>
<span style="font-weight: bold"><span style="color: #000080"># include</span></span> <span style="color: #FF0000">&lt;cppad/cppad.hpp&gt;</span>

<span style="font-weight: bold"><span style="color: #0000FF">namespace</span></span> <span style="color: #FF0000">{</span>
     <span style="font-weight: bold"><span style="color: #0000FF">using</span></span> CppAD<span style="color: #990000">::</span>AD<span style="color: #990000">;</span>
     <span style="font-weight: bold"><span style="color: #0000FF">typedef</span></span> <span style="font-weight: bold"><span style="color: #000000">CPPAD_TESTVECTOR</span></span><span style="color: #990000">(</span>AD<span style="color: #990000">&lt;</span><span style="color: #009900">double</span><span style="color: #990000">&gt;)</span>            ADVector<span style="color: #990000">;</span>
     <span style="font-weight: bold"><span style="color: #0000FF">typedef</span></span> CppAD<span style="color: #990000">::</span>atomic_base<span style="color: #990000">&lt;</span><span style="color: #009900">double</span><span style="color: #990000">&gt;::</span><span style="color: #008080">option_enum</span> option_enum<span style="color: #990000">;</span>

     <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">f_algo</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">const</span></span> ADVector<span style="color: #990000">&amp;</span> y<span style="color: #990000">,</span> ADVector<span style="color: #990000">&amp;</span> z<span style="color: #990000">)</span>
     <span style="color: #FF0000">{</span>     z<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #993399">0.0</span><span style="color: #990000">;</span>
          z<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #993399">0.0</span><span style="color: #990000">;</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span><span style="color: #008080">size_t</span> k <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> k <span style="color: #990000">&lt;</span> <span style="color: #993399">3</span><span style="color: #990000">;</span> k<span style="color: #990000">++)</span>
          <span style="color: #FF0000">{</span>     z<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">]</span> <span style="color: #990000">+=</span> y<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">];</span>
               z<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">]</span> <span style="color: #990000">+=</span> y<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">];</span>
          <span style="color: #FF0000">}</span>
          <span style="font-weight: bold"><span style="color: #0000FF">return</span></span><span style="color: #990000">;</span>
     <span style="color: #FF0000">}</span>
     <span style="color: #009900">void</span> <span style="font-weight: bold"><span style="color: #000000">g_algo</span></span><span style="color: #990000">(</span><span style="font-weight: bold"><span style="color: #0000FF">const</span></span> ADVector<span style="color: #990000">&amp;</span> x<span style="color: #990000">,</span> ADVector<span style="color: #990000">&amp;</span> y<span style="color: #990000">)</span>
     <span style="color: #FF0000">{</span>     y<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #993399">1.0</span><span style="color: #990000">;</span>
          y<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #993399">1.0</span><span style="color: #990000">;</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span><span style="color: #008080">size_t</span> k <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> k <span style="color: #990000">&lt;</span> <span style="color: #993399">3</span><span style="color: #990000">;</span> k<span style="color: #990000">++)</span>
          <span style="color: #FF0000">{</span>     y<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">]</span> <span style="color: #990000">*=</span> x<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">];</span>
               y<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">]</span> <span style="color: #990000">*=</span> x<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">];</span>
          <span style="color: #FF0000">}</span>
          <span style="font-weight: bold"><span style="color: #0000FF">return</span></span><span style="color: #990000">;</span>
     <span style="color: #FF0000">}</span>
     <span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">test_case</span></span><span style="color: #990000">(</span>
          <span style="color: #008080">option_enum</span> f_sparsity<span style="color: #990000">,</span> <span style="color: #008080">option_enum</span> g_sparsity<span style="color: #990000">,</span> <span style="color: #009900">bool</span> optimize <span style="color: #990000">)</span>
     <span style="color: #FF0000">{</span>     <span style="color: #009900">bool</span> ok <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">;</span>
          <span style="font-weight: bold"><span style="color: #0000FF">using</span></span> CppAD<span style="color: #990000">::</span>checkpoint<span style="color: #990000">;</span>
          <span style="font-weight: bold"><span style="color: #0000FF">using</span></span> CppAD<span style="color: #990000">::</span>ADFun<span style="color: #990000">;</span>
          <span style="font-weight: bold"><span style="color: #0000FF">using</span></span> CppAD<span style="color: #990000">::</span>NearEqual<span style="color: #990000">;</span>
          <span style="color: #008080">size_t</span> i<span style="color: #990000">,</span> j<span style="color: #990000">,</span> k<span style="color: #990000">,</span> n <span style="color: #990000">=</span> <span style="color: #993399">2</span><span style="color: #990000">,</span> m <span style="color: #990000">=</span> n<span style="color: #990000">;</span>
          <span style="color: #009900">double</span> eps <span style="color: #990000">=</span> <span style="color: #993399">10</span><span style="color: #990000">.</span> <span style="color: #990000">*</span> std<span style="color: #990000">::</span>numeric_limits<span style="color: #990000">&lt;</span><span style="color: #009900">double</span><span style="color: #990000">&gt;::</span><span style="font-weight: bold"><span style="color: #000000">epsilon</span></span><span style="color: #990000">();</span>

          <span style="font-style: italic"><span style="color: #9A1900">// checkpoint version of the function F(x)</span></span>
          <span style="color: #008080">ADVector</span> <span style="font-weight: bold"><span style="color: #000000">ax</span></span><span style="color: #990000">(</span>n<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">ay</span></span><span style="color: #990000">(</span>n<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">az</span></span><span style="color: #990000">(</span>m<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>j <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> j <span style="color: #990000">&lt;</span> n<span style="color: #990000">;</span> j<span style="color: #990000">++)</span>
               ax<span style="color: #990000">[</span>j<span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #009900">double</span><span style="color: #990000">(</span>j <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
          <span style="font-style: italic"><span style="color: #9A1900">// could also use bool_sparsity_enum or set_sparsity_enum</span></span>
          <span style="color: #008080">checkpoint&lt;double&gt;</span> <span style="font-weight: bold"><span style="color: #000000">atom_f</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"atom_f"</span><span style="color: #990000">,</span> f_algo<span style="color: #990000">,</span> ax<span style="color: #990000">,</span> ay<span style="color: #990000">,</span> f_sparsity<span style="color: #990000">);</span>
          <span style="color: #008080">checkpoint&lt;double&gt;</span> <span style="font-weight: bold"><span style="color: #000000">atom_g</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"atom_g"</span><span style="color: #990000">,</span> g_algo<span style="color: #990000">,</span> ay<span style="color: #990000">,</span> az<span style="color: #990000">,</span> g_sparsity<span style="color: #990000">);</span>

          <span style="font-style: italic"><span style="color: #9A1900">// Record a version of z = g[f(x)] without checkpointing</span></span>
          <span style="font-weight: bold"><span style="color: #000000">Independent</span></span><span style="color: #990000">(</span>ax<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #000000">f_algo</span></span><span style="color: #990000">(</span>ax<span style="color: #990000">,</span> ay<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #000000">g_algo</span></span><span style="color: #990000">(</span>ay<span style="color: #990000">,</span> az<span style="color: #990000">);</span>
          <span style="color: #008080">ADFun&lt;double&gt;</span> <span style="font-weight: bold"><span style="color: #000000">check_not</span></span><span style="color: #990000">(</span>ax<span style="color: #990000">,</span> az<span style="color: #990000">);</span>

          <span style="font-style: italic"><span style="color: #9A1900">// Record a version of z = g[f(x)] with checkpointing</span></span>
          <span style="font-weight: bold"><span style="color: #000000">Independent</span></span><span style="color: #990000">(</span>ax<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #000000">atom_f</span></span><span style="color: #990000">(</span>ax<span style="color: #990000">,</span> ay<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #000000">atom_g</span></span><span style="color: #990000">(</span>ay<span style="color: #990000">,</span> az<span style="color: #990000">);</span>
          <span style="color: #008080">ADFun&lt;double&gt;</span> <span style="font-weight: bold"><span style="color: #000000">check_yes</span></span><span style="color: #990000">(</span>ax<span style="color: #990000">,</span> az<span style="color: #990000">);</span>

          <span style="font-style: italic"><span style="color: #9A1900">// checkpointing should use fewer operations</span></span>
          ok <span style="color: #990000">&amp;=</span> check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">size_var</span></span><span style="color: #990000">()</span> <span style="color: #990000">&lt;</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">size_var</span></span><span style="color: #990000">();</span>

          <span style="font-style: italic"><span style="color: #9A1900">// this does not really save space because f and g are only used once</span></span>
          ok <span style="color: #990000">&amp;=</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">size_var</span></span><span style="color: #990000">()</span> <span style="color: #990000">&lt;=</span>
               check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">size_var</span></span><span style="color: #990000">()</span> <span style="color: #990000">+</span> atom_f<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">size_var</span></span><span style="color: #990000">()</span> <span style="color: #990000">+</span> atom_g<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">size_var</span></span><span style="color: #990000">();</span>

          <span style="font-style: italic"><span style="color: #9A1900">// compare forward mode results for orders 0, 1, 2</span></span>
          <span style="color: #008080">size_t</span> q <span style="color: #990000">=</span> <span style="color: #993399">2</span><span style="color: #990000">;</span>
          <span style="font-weight: bold"><span style="color: #000000">CPPAD_TESTVECTOR</span></span><span style="color: #990000">(</span><span style="color: #009900">double</span><span style="color: #990000">)</span> <span style="font-weight: bold"><span style="color: #000000">x_q</span></span><span style="color: #990000">(</span>n<span style="color: #990000">*(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)),</span> <span style="font-weight: bold"><span style="color: #000000">z_not</span></span><span style="color: #990000">(</span>m<span style="color: #990000">*(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)),</span> <span style="font-weight: bold"><span style="color: #000000">z_yes</span></span><span style="color: #990000">(</span>m<span style="color: #990000">*(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">));</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>j <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> j <span style="color: #990000">&lt;</span> n<span style="color: #990000">;</span> j<span style="color: #990000">++)</span>
          <span style="color: #FF0000">{</span>     <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>k <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> k <span style="color: #990000">&lt;=</span> q<span style="color: #990000">;</span> k<span style="color: #990000">++)</span>
                    x_q<span style="color: #990000">[</span> j <span style="color: #990000">*</span> <span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)</span> <span style="color: #990000">+</span> k <span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #993399">1.0</span> <span style="color: #990000">/</span> <span style="color: #009900">double</span><span style="color: #990000">(</span>q <span style="color: #990000">+</span> <span style="color: #993399">1</span> <span style="color: #990000">-</span> k<span style="color: #990000">);</span>
          <span style="color: #FF0000">}</span>
          z_not <span style="color: #990000">=</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">Forward</span></span><span style="color: #990000">(</span>q<span style="color: #990000">,</span> x_q<span style="color: #990000">);</span>
          z_yes <span style="color: #990000">=</span> check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">Forward</span></span><span style="color: #990000">(</span>q<span style="color: #990000">,</span> x_q<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> m<span style="color: #990000">;</span> i<span style="color: #990000">++)</span>
          <span style="color: #FF0000">{</span>     <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>k <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> k <span style="color: #990000">&lt;=</span> q<span style="color: #990000">;</span> k<span style="color: #990000">++)</span>
               <span style="color: #FF0000">{</span>     <span style="color: #009900">double</span> zik_not <span style="color: #990000">=</span> z_not<span style="color: #990000">[</span> i <span style="color: #990000">*</span> <span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)</span> <span style="color: #990000">+</span> k<span style="color: #990000">];</span>
                    <span style="color: #009900">double</span> zik_yes <span style="color: #990000">=</span> z_yes<span style="color: #990000">[</span> i <span style="color: #990000">*</span> <span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)</span> <span style="color: #990000">+</span> k<span style="color: #990000">];</span>
                    ok <span style="color: #990000">&amp;=</span> <span style="font-weight: bold"><span style="color: #000000">NearEqual</span></span><span style="color: #990000">(</span>zik_not<span style="color: #990000">,</span> zik_yes<span style="color: #990000">,</span> eps<span style="color: #990000">,</span> eps<span style="color: #990000">);</span>
               <span style="color: #FF0000">}</span>
          <span style="color: #FF0000">}</span>

          <span style="font-style: italic"><span style="color: #9A1900">// compare reverse mode results</span></span>
          <span style="font-weight: bold"><span style="color: #000000">CPPAD_TESTVECTOR</span></span><span style="color: #990000">(</span><span style="color: #009900">double</span><span style="color: #990000">)</span> <span style="font-weight: bold"><span style="color: #000000">w</span></span><span style="color: #990000">(</span>m<span style="color: #990000">*(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)),</span> <span style="font-weight: bold"><span style="color: #000000">dw_not</span></span><span style="color: #990000">(</span>n<span style="color: #990000">*(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)),</span> <span style="font-weight: bold"><span style="color: #000000">dw_yes</span></span><span style="color: #990000">(</span>n<span style="color: #990000">*(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">));</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> m <span style="color: #990000">*</span> <span style="color: #990000">(</span>q <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">);</span> i<span style="color: #990000">++)</span>
               w<span style="color: #990000">[</span>i<span style="color: #990000">]</span> <span style="color: #990000">=</span> <span style="color: #993399">1.0</span> <span style="color: #990000">/</span> <span style="color: #009900">double</span><span style="color: #990000">(</span>i <span style="color: #990000">+</span> <span style="color: #993399">1</span><span style="color: #990000">);</span>
          dw_not <span style="color: #990000">=</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">Reverse</span></span><span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">,</span> w<span style="color: #990000">);</span>
          dw_yes <span style="color: #990000">=</span> check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">Reverse</span></span><span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">,</span> w<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>j <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> j <span style="color: #990000">&lt;</span> n<span style="color: #990000">;</span> j<span style="color: #990000">++)</span>
          <span style="color: #FF0000">{</span>     <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>k <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> k <span style="color: #990000">&lt;=</span> q<span style="color: #990000">;</span> k<span style="color: #990000">++)</span>
               <span style="color: #FF0000">{</span>     <span style="color: #009900">double</span> dwjk_not <span style="color: #990000">=</span> dw_not<span style="color: #990000">[</span> j <span style="color: #990000">*</span> <span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)</span> <span style="color: #990000">+</span> k<span style="color: #990000">];</span>
                    <span style="color: #009900">double</span> dwjk_yes <span style="color: #990000">=</span> dw_yes<span style="color: #990000">[</span> j <span style="color: #990000">*</span> <span style="color: #990000">(</span>q<span style="color: #990000">+</span><span style="color: #993399">1</span><span style="color: #990000">)</span> <span style="color: #990000">+</span> k<span style="color: #990000">];</span>
                    ok <span style="color: #990000">&amp;=</span> <span style="font-weight: bold"><span style="color: #000000">NearEqual</span></span><span style="color: #990000">(</span>dwjk_not<span style="color: #990000">,</span> dwjk_yes<span style="color: #990000">,</span> eps<span style="color: #990000">,</span> eps<span style="color: #990000">);</span>
               <span style="color: #FF0000">}</span>
          <span style="color: #FF0000">}</span>

          <span style="font-style: italic"><span style="color: #9A1900">// compare forward mode Jacobian sparsity patterns</span></span>
          CppAD<span style="color: #990000">::</span><span style="color: #008080">vector&lt; std::set&lt;size_t&gt; &gt;</span> <span style="font-weight: bold"><span style="color: #000000">r</span></span><span style="color: #990000">(</span>n<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">s_not</span></span><span style="color: #990000">(</span>m<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">s_yes</span></span><span style="color: #990000">(</span>m<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>j <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> j <span style="color: #990000">&lt;</span> n<span style="color: #990000">;</span> j<span style="color: #990000">++)</span>
               r<span style="color: #990000">[</span>j<span style="color: #990000">].</span><span style="font-weight: bold"><span style="color: #000000">insert</span></span><span style="color: #990000">(</span>j<span style="color: #990000">);</span>
          s_not <span style="color: #990000">=</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">ForSparseJac</span></span><span style="color: #990000">(</span>n<span style="color: #990000">,</span> r<span style="color: #990000">);</span>
          s_yes <span style="color: #990000">=</span> check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">ForSparseJac</span></span><span style="color: #990000">(</span>n<span style="color: #990000">,</span> r<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> m<span style="color: #990000">;</span> i<span style="color: #990000">++)</span>
               ok <span style="color: #990000">&amp;=</span> s_not<span style="color: #990000">[</span>i<span style="color: #990000">]</span> <span style="color: #990000">==</span> s_yes<span style="color: #990000">[</span>i<span style="color: #990000">];</span>

          <span style="font-style: italic"><span style="color: #9A1900">// compare reverse mode Jacobian sparsity patterns</span></span>
          CppAD<span style="color: #990000">::</span><span style="color: #008080">vector&lt; std::set&lt;size_t&gt; &gt;</span> <span style="font-weight: bold"><span style="color: #000000">s</span></span><span style="color: #990000">(</span>m<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">r_not</span></span><span style="color: #990000">(</span>m<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">r_yes</span></span><span style="color: #990000">(</span>m<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> m<span style="color: #990000">;</span> i<span style="color: #990000">++)</span>
               s<span style="color: #990000">[</span>i<span style="color: #990000">].</span><span style="font-weight: bold"><span style="color: #000000">insert</span></span><span style="color: #990000">(</span>i<span style="color: #990000">);</span>
          r_not <span style="color: #990000">=</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">RevSparseJac</span></span><span style="color: #990000">(</span>m<span style="color: #990000">,</span> s<span style="color: #990000">);</span>
          r_yes <span style="color: #990000">=</span> check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">RevSparseJac</span></span><span style="color: #990000">(</span>m<span style="color: #990000">,</span> s<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> m<span style="color: #990000">;</span> i<span style="color: #990000">++)</span>
               ok <span style="color: #990000">&amp;=</span> r_not<span style="color: #990000">[</span>i<span style="color: #990000">]</span> <span style="color: #990000">==</span> r_yes<span style="color: #990000">[</span>i<span style="color: #990000">];</span>


          <span style="font-style: italic"><span style="color: #9A1900">// compare reverse mode Hessian sparsity patterns</span></span>
          CppAD<span style="color: #990000">::</span><span style="color: #008080">vector&lt; std::set&lt;size_t&gt; &gt;</span> <span style="font-weight: bold"><span style="color: #000000">s_one</span></span><span style="color: #990000">(</span><span style="color: #993399">1</span><span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">h_not</span></span><span style="color: #990000">(</span>n<span style="color: #990000">),</span> <span style="font-weight: bold"><span style="color: #000000">h_yes</span></span><span style="color: #990000">(</span>n<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> m<span style="color: #990000">;</span> i<span style="color: #990000">++)</span>
               s_one<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">].</span><span style="font-weight: bold"><span style="color: #000000">insert</span></span><span style="color: #990000">(</span>i<span style="color: #990000">);</span>
          h_not <span style="color: #990000">=</span> check_not<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">RevSparseHes</span></span><span style="color: #990000">(</span>n<span style="color: #990000">,</span> s_one<span style="color: #990000">);</span>
          h_yes <span style="color: #990000">=</span> check_yes<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">RevSparseHes</span></span><span style="color: #990000">(</span>n<span style="color: #990000">,</span> s_one<span style="color: #990000">);</span>
          <span style="font-weight: bold"><span style="color: #0000FF">for</span></span><span style="color: #990000">(</span>i <span style="color: #990000">=</span> <span style="color: #993399">0</span><span style="color: #990000">;</span> i <span style="color: #990000">&lt;</span> n<span style="color: #990000">;</span> i<span style="color: #990000">++)</span>
               ok <span style="color: #990000">&amp;=</span> h_not<span style="color: #990000">[</span>i<span style="color: #990000">]</span> <span style="color: #990000">==</span> h_yes<span style="color: #990000">[</span>i<span style="color: #990000">];</span>

          <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> ok<span style="color: #990000">;</span>
     <span style="color: #FF0000">}</span>
<span style="color: #FF0000">}</span>

<span style="color: #009900">bool</span> <span style="font-weight: bold"><span style="color: #000000">checkpoint</span></span><span style="color: #990000">(</span><span style="color: #009900">void</span><span style="color: #990000">)</span>
<span style="color: #FF0000">{</span>     <span style="color: #009900">bool</span> ok <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">;</span>

     <span style="font-style: italic"><span style="color: #9A1900">// different types of sparsity</span></span>
     <span style="color: #008080">option_enum</span> pack_sparsity <span style="color: #990000">=</span> CppAD<span style="color: #990000">::</span>atomic_base<span style="color: #990000">&lt;</span><span style="color: #009900">double</span><span style="color: #990000">&gt;::</span>pack_sparsity_enum<span style="color: #990000">;</span>
     <span style="color: #008080">option_enum</span> bool_sparsity <span style="color: #990000">=</span> CppAD<span style="color: #990000">::</span>atomic_base<span style="color: #990000">&lt;</span><span style="color: #009900">double</span><span style="color: #990000">&gt;::</span>bool_sparsity_enum<span style="color: #990000">;</span>
     <span style="color: #008080">option_enum</span> set_sparsity  <span style="color: #990000">=</span> CppAD<span style="color: #990000">::</span>atomic_base<span style="color: #990000">&lt;</span><span style="color: #009900">double</span><span style="color: #990000">&gt;::</span>set_sparsity_enum<span style="color: #990000">;</span>

     <span style="font-style: italic"><span style="color: #9A1900">// test some different cases</span></span>
     ok <span style="color: #990000">&amp;=</span> <span style="font-weight: bold"><span style="color: #000000">test_case</span></span><span style="color: #990000">(</span>pack_sparsity<span style="color: #990000">,</span> pack_sparsity<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">);</span>
     ok <span style="color: #990000">&amp;=</span> <span style="font-weight: bold"><span style="color: #000000">test_case</span></span><span style="color: #990000">(</span>pack_sparsity<span style="color: #990000">,</span> bool_sparsity<span style="color: #990000">,</span> <span style="font-weight: bold"><span style="color: #0000FF">false</span></span><span style="color: #990000">);</span>
     ok <span style="color: #990000">&amp;=</span> <span style="font-weight: bold"><span style="color: #000000">test_case</span></span><span style="color: #990000">(</span>bool_sparsity<span style="color: #990000">,</span> set_sparsity<span style="color: #990000">,</span>  <span style="font-weight: bold"><span style="color: #0000FF">true</span></span><span style="color: #990000">);</span>
     ok <span style="color: #990000">&amp;=</span> <span style="font-weight: bold"><span style="color: #000000">test_case</span></span><span style="color: #990000">(</span>set_sparsity<span style="color: #990000">,</span>  set_sparsity<span style="color: #990000">,</span>  <span style="font-weight: bold"><span style="color: #0000FF">false</span></span><span style="color: #990000">);</span>

     <span style="font-weight: bold"><span style="color: #0000FF">return</span></span> ok<span style="color: #990000">;</span>
<span style="color: #FF0000">}</span></tt></pre>
</font></code>
<hr/>Input File: example/atomic/checkpoint.cpp

</body>
</html>
