File: group__utilities.html

package info (click to toggle)
quantlib-refman-html 1.20-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 103,140 kB
  • sloc: javascript: 13,408; makefile: 35
file content (120 lines) | stat: -rw-r--r-- 8,089 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.20"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>QuantLib: Utilities</title>
<link href='https://fonts.googleapis.com/css?family=Merriweather+Sans:800' rel='stylesheet' type='text/css'>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script>
<script type="text/javascript" async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="quantlibextra.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname"><a href="http://quantlib.org">
       <img alt="QuantLib" src="QL-title.jpg"></a>
   <div id="projectbrief">A free/open-source library for quantitative finance</div>
   <div id="projectnumber">Reference manual - version 1.20</div>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.20 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Utilities</div>  </div>
</div><!--header-->
<div class="contents">
<p>Iterators are meant to build a sequence on the fly from one or more other sequences, without having to allocate place for storing it. A couple of examples: suppose we have a function which calculates the average of a sequence, and that for genericity we have implemented it as a template function which takes the beginning and the end of the sequence, so that its declaration is:</p>
<div class="fragment"><div class="line"><span class="keyword">template</span> &lt;<span class="keyword">class</span> Iterator&gt;</div>
<div class="line"><span class="keyword">typename</span> Iterator::value_type</div>
<div class="line">average(<span class="keyword">const</span> Iterator&amp; begin, <span class="keyword">const</span> Iterator&amp; end)</div>
</div><!-- fragment --><p>This kind of genericity allows one to use the same function to calculate the average of a std::vector, a std::list, a QuantLib::History, any other container, of a subset of any of the former.</p>
<p>Now let's say we have two sequences of numbers, and we want to calculate the average of their products. One approach could be to store the products in another sequence, and to calculate the average of the latter, as in:</p>
<div class="fragment"><div class="line"><span class="comment">// we have sequence1 and sequence2 and assume equal size:</span></div>
<div class="line"><span class="comment">// first we store their product in a vector...</span></div>
<div class="line">std::vector&lt;double&gt; products;</div>
<div class="line">std::transform(sequence1.begin(),sequence1.end(), <span class="comment">// first sequence</span></div>
<div class="line">               sequence2.begin(),                 <span class="comment">// second sequence</span></div>
<div class="line">               std::back_inserter(products),      <span class="comment">// output</span></div>
<div class="line">               std::multiplies&lt;double&gt;());        <span class="comment">// operation to perform</span></div>
<div class="line"><span class="comment">// ...then we calculate the average</span></div>
<div class="line"><span class="keywordtype">double</span> result = average(products.begin(),products.end());</div>
</div><!-- fragment --><p>The above works, however, it might be not particularly efficient since we have to allocate the product vector, quite possibly just to throw it away when the calculation is done.</p>
<p>QuantLib::coupling_iterator allows us to do the same thing without allocating the extra vector: what we do is simply:</p>
<div class="fragment"><div class="line"><span class="comment">// we have sequence1 and sequence2 and assume equal size:</span></div>
<div class="line"><span class="keywordtype">double</span> result = average(</div>
<div class="line">    make_coupling_iterator(sequence1.begin(),</div>
<div class="line">                           sequence2.begin(),</div>
<div class="line">                           std::multiplies&lt;<span class="keywordtype">double</span>()),</div>
<div class="line">    make_coupling_iterator(sequence1.end(),</div>
<div class="line">                           sequence2.end(),</div>
<div class="line">                           std::multiplies&lt;<span class="keywordtype">double</span>()));</div>
</div><!-- fragment --><p>The call to make_coupling_iterator creates an iterator which is really a reference to the two iterators and the operation we passed. Dereferencing such iterator returns the result of applying such operation to the values pointed to by the two contained iterators. Advancing the coupling iterator advances the two underlying ones. One can see how iterating on such iterator generates the products one by one so that they can be processed by <code>average()</code>, but does not need allocating memory for storing the results. The product sequence is generated on the fly.</p>
<p>The other iterators share the same principle but have different functionalities:</p><ul>
<li>combining_iterator is the same as coupling_iterator, but works on \( N \) sequences while the latter works on 2;</li>
<li>filtering_iterator generates the elements of a given sequence which satisfy a given predicate, i.e., it takes a sequence \( [x_0,x_1,\dots] \) and a predicate \( p \) and generates the sequence of those \( x_i \) for which \( p(x_i) \) returns <code>true</code>;</li>
<li>processing_iterator takes a sequence \( [x_0,x_1,\dots] \) and a function \( f \) and generates the sequence \( [f(x_0),f(x_1),\dots] \);</li>
<li>stepping_iterator takes a sequence \( [x_0,x_1,\dots] \) and a step \( m \) and generates the sequence \( [x_0,x_m,x_{2m},\dots] \) </li>
</ul>
</div><!-- contents -->
<!-- HTML footer for doxygen 1.8.9.1-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by <a href="http://www.doxygen.org/index.html">Doxygen</a>
1.8.20
</small></address>
</body>
</html>