-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdev_intro.html
509 lines (467 loc) · 64.1 KB
/
dev_intro.html
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Introduction — N2D2 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=80d5e7a1" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
<!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/documentation_options.js?v=5929fcd5"></script>
<script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Example" href="core/example.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
N2D2
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Introduction</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="intro/intro.html">Presentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro/about.html">About N2D2-IP</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro/simus.html">Performing simulations</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro/perfs_tools.html">Performance evaluation tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="intro/tuto.html">Tutorials</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">ONNX Import</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="onnx/convert.html">Obtain ONNX models</a></li>
<li class="toctree-l1"><a class="reference internal" href="onnx/import.html">Import ONNX models</a></li>
<li class="toctree-l1"><a class="reference internal" href="onnx/transfer.html">Train from ONNX models</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Quantization and Export</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="quant/post.html">Post-training quantization</a></li>
<li class="toctree-l1"><a class="reference internal" href="quant/qat.html">Quantization-Aware Training</a></li>
<li class="toctree-l1"><a class="reference internal" href="quant/pruning.html">Pruning</a></li>
<li class="toctree-l1"><a class="reference internal" href="export/CPP.html">Export: C++</a></li>
<li class="toctree-l1"><a class="reference internal" href="export/CPP_STM32.html">Export: C++/STM32</a></li>
<li class="toctree-l1"><a class="reference internal" href="export/TensorRT.html">Export: TensorRT</a></li>
<li class="toctree-l1"><a class="reference internal" href="export/DNeuro.html">Export: DNeuro</a></li>
<li class="toctree-l1"><a class="reference internal" href="export/ONNX.html">Export: ONNX</a></li>
<li class="toctree-l1"><a class="reference internal" href="export/legacy.html">Export: other / legacy</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">INI File Interface</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="ini/intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="ini/databases.html">Databases</a></li>
<li class="toctree-l1"><a class="reference internal" href="ini/data_analysis.html">Stimuli data analysis</a></li>
<li class="toctree-l1"><a class="reference internal" href="ini/environment.html">Stimuli provider (Environment)</a></li>
<li class="toctree-l1"><a class="reference internal" href="ini/layers.html">Network Layers</a></li>
<li class="toctree-l1"><a class="reference internal" href="ini/target.html">Targets (outputs & losses)</a></li>
<li class="toctree-l1"><a class="reference internal" href="adversarial.html">Adversarial module</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="python_api/intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_api/databases.html">Databases</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_api/cells.html">Cells</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_api/tensor.html">Tensor</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_api/interoperability.html">Interoperability</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_api/export.html">Export</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_api/example.html">Example</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">C++/Python core</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="core/core.html">Core N2D2</a></li>
<li class="toctree-l1"><a class="reference internal" href="core/example.html">Example</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">C++ API / Developer</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Introduction</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#the-cell-modules">The <code class="docutils literal notranslate"><span class="pre">Cell</span></code> modules</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#cell-class"><code class="docutils literal notranslate"><span class="pre">Cell</span></code> class</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D24Cell7getNameEv"><code class="docutils literal notranslate"><span class="pre">Cell::getName()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D24Cell7getTypeEv"><code class="docutils literal notranslate"><span class="pre">Cell::getType()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D24Cell13getInputsDimsEv"><code class="docutils literal notranslate"><span class="pre">Cell::getInputsDims()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D24Cell14getOutputsDimsEv"><code class="docutils literal notranslate"><span class="pre">Cell::getOutputsDims()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D24Cell8addInputER15StimuliProviderjjjjjRK6TensorIbE"><code class="docutils literal notranslate"><span class="pre">Cell::addInput()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D24Cell8addInputER15StimuliProviderjjjjRK6TensorIbE"><code class="docutils literal notranslate"><span class="pre">Cell::addInput()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D24Cell8addInputEP4CellRK6TensorIbE"><code class="docutils literal notranslate"><span class="pre">Cell::addInput()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D24Cell8addInputEP4Celljjjj"><code class="docutils literal notranslate"><span class="pre">Cell::addInput()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D24Cell10initializeEv"><code class="docutils literal notranslate"><span class="pre">Cell::initialize()</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#cell-frame-top-class"><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top</span></code> class</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D214Cell_Frame_Top9propagateEb"><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top::propagate()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D214Cell_Frame_Top13backPropagateEv"><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top::backPropagate()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D214Cell_Frame_Top6updateEv"><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top::update()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D214Cell_Frame_Top13getActivationEv"><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top::getActivation()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D214Cell_Frame_Top13setActivationERKNSt10shared_ptrI10ActivationEE"><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top::setActivation()</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#cell-frame-t-class"><code class="docutils literal notranslate"><span class="pre">Cell_Frame<T></span></code> class</a></li>
<li class="toctree-l3"><a class="reference internal" href="#convcell-class"><code class="docutils literal notranslate"><span class="pre">ConvCell</span></code> class</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D28ConvCell16setWeightsFillerERKNSt10shared_ptrI6FillerEE"><code class="docutils literal notranslate"><span class="pre">ConvCell::setWeightsFiller()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D28ConvCell13setBiasFillerERKNSt10shared_ptrI6FillerEE"><code class="docutils literal notranslate"><span class="pre">ConvCell::setBiasFiller()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D28ConvCell16setWeightsSolverERKNSt10shared_ptrI6SolverEE"><code class="docutils literal notranslate"><span class="pre">ConvCell::setWeightsSolver()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D28ConvCell13setBiasSolverERKNSt10shared_ptrI6SolverEE"><code class="docutils literal notranslate"><span class="pre">ConvCell::setBiasSolver()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D28ConvCell9getWeightEjjR10BaseTensor"><code class="docutils literal notranslate"><span class="pre">ConvCell::getWeight()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4NK4N2D28ConvCell7getBiasEjR10BaseTensor"><code class="docutils literal notranslate"><span class="pre">ConvCell::getBias()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D28ConvCell9setWeightEjjRK10BaseTensor"><code class="docutils literal notranslate"><span class="pre">ConvCell::setWeight()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#_CPPv4N4N2D28ConvCell7setBiasEjRK10BaseTensor"><code class="docutils literal notranslate"><span class="pre">ConvCell::setBias()</span></code></a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#convcell-frame-t-class"><code class="docutils literal notranslate"><span class="pre">ConvCell_Frame<T></span></code> class</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#the-tensor-t-class">The <code class="docutils literal notranslate"><span class="pre">Tensor<T></span></code> class</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">N2D2</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Introduction</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/dev_intro.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="introduction">
<h1>Introduction<a class="headerlink" href="#introduction" title="Link to this heading">¶</a></h1>
<p>Welcome to the developer documentation. N2D2 is primarily developed in C++11 and
CUDA (for the GPU computing kernels). The library used internally for images processing is
OpenCV.</p>
<p>N2D2 is structured in module families, each family being defined by a base class,
for example <code class="docutils literal notranslate"><span class="pre">Database</span></code>, <code class="docutils literal notranslate"><span class="pre">Cell</span></code>, <code class="docutils literal notranslate"><span class="pre">Export</span></code>…
In this introduction, we will review the main N2D2 modules structure, which is
summarized in the figure below:</p>
<figure class="align-default" id="id1">
<img alt="Main N2D2 modules." src="_images/N2D2_modules.png" />
<figcaption>
<p><span class="caption-text">Main N2D2 modules.</span><a class="headerlink" href="#id1" title="Link to this image">¶</a></p>
</figcaption>
</figure>
<section id="the-cell-modules">
<h2>The <code class="docutils literal notranslate"><span class="pre">Cell</span></code> modules<a class="headerlink" href="#the-cell-modules" title="Link to this heading">¶</a></h2>
<p>A <code class="docutils literal notranslate"><span class="pre">Cell</span></code> defines a layer / operator, constituting a base building block of a
neural network (or more generally a compute graph), like a convolution, a
pooling and so on.
The base <code class="docutils literal notranslate"><span class="pre">Cell</span></code> class is abstract and does not make any assumption on the
compute model, the data precision and even the coding of the data.</p>
<p>The class hierarchy for <code class="docutils literal notranslate"><span class="pre">Cell</span></code> is shown in the figure below. While it may
seem a bit complicated, it was designed this way to really separate different
notions:</p>
<ul class="simple">
<li><p><em>Mathematical model</em>: the actual mathematical function performed by the <code class="docutils literal notranslate"><span class="pre">Cell</span></code>,
regardless of the algorithm used for its implementation. For example,
<code class="docutils literal notranslate"><span class="pre">ConvCell</span></code> for a convolution, or <code class="docutils literal notranslate"><span class="pre">FcCell</span></code> for a fully connected layer
(or inner product);</p></li>
<li><p><em>Coding model</em>: the model used to code the data. <code class="docutils literal notranslate"><span class="pre">Frame</span></code> is for standard
tensor-based deep learning and <code class="docutils literal notranslate"><span class="pre">Spike</span></code> is for neuromorphic spike coding;</p></li>
<li><p><em>Programming model</em>: the programming model that will be used for the
implementation, meaning either plain C++ (with OpenMP) for CPU or CUDA for
GPU. Other programming model, like OpenCL, may be added in the future. When
there is only one programming model, the class hierarchy can be simplified
like for <code class="docutils literal notranslate"><span class="pre">Cell_Spike</span></code>. The <em>Programming model</em> class can be templated to
handle different data precision. For the <code class="docutils literal notranslate"><span class="pre">Cell_Frame<T></span></code> and
<code class="docutils literal notranslate"><span class="pre">Cell_Frame_CUDA<T></span></code> classes, <code class="docutils literal notranslate"><span class="pre">half</span></code>, <code class="docutils literal notranslate"><span class="pre">float</span></code> and <code class="docutils literal notranslate"><span class="pre">double</span></code> precision
are supported, but may not be implemented for every model (it is not mandatory
to provide implementation for every possible precision);</p></li>
<li><p><em>Implementation</em>: the actual implementation of the <em>Mathematical model</em>, using
the inherited <em>Coding model</em> and <em>Programming model</em>. The implementation
may use different algorithm to obtain the same <em>Mathematical model</em>, like
direct, GEMM or FFT algorithms for the convolution.</p></li>
</ul>
<figure class="align-default" id="id2">
<img alt="``Cell`` modules class hierarchy." src="_images/Cell_hierarchy.png" />
<figcaption>
<p><span class="caption-text"><code class="docutils literal notranslate"><span class="pre">Cell</span></code> modules class hierarchy.</span><a class="headerlink" href="#id2" title="Link to this image">¶</a></p>
</figcaption>
</figure>
<section id="cell-class">
<h3><code class="docutils literal notranslate"><span class="pre">Cell</span></code> class<a class="headerlink" href="#cell-class" title="Link to this heading">¶</a></h3>
<p>The base <code class="docutils literal notranslate"><span class="pre">Cell</span></code> class only handles the topological information: the inputs
and outputs dimensions and virtual methods to connect the cells, among other.
The main methods are listed here:</p>
<div class="breathe-sectiondef docutils container">
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D24Cell7getNameEv">
<span id="_CPPv3NK4N2D24Cell7getNameEv"></span><span id="_CPPv2NK4N2D24Cell7getNameEv"></span><span id="N2D2::Cell::getNameC"></span><span class="target" id="classN2D2_1_1Cell_1aca4e8ebbe83a75f75dea7071325f88f5"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">string</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="sig-name descname"><span class="n"><span class="pre">getName</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><a class="headerlink" href="#_CPPv4NK4N2D24Cell7getNameEv" title="Link to this definition">¶</a><br /></dt>
<dd><p>Returns cell name. </p>
</dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D24Cell7getTypeEv">
<span id="_CPPv3NK4N2D24Cell7getTypeEv"></span><span id="_CPPv2NK4N2D24Cell7getTypeEv"></span><span id="N2D2::Cell::getTypeC"></span><span class="target" id="classN2D2_1_1Cell_1ac9aacf89700c29012883d0e4ac8a6364"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">getType</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4NK4N2D24Cell7getTypeEv" title="Link to this definition">¶</a><br /></dt>
<dd><p>Returns cell type. </p>
</dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D24Cell13getInputsDimsEv">
<span id="_CPPv3NK4N2D24Cell13getInputsDimsEv"></span><span id="_CPPv2NK4N2D24Cell13getInputsDimsEv"></span><span id="N2D2::Cell::getInputsDimsC"></span><span class="target" id="classN2D2_1_1Cell_1a00735bc841777bc30331ec9ac07e5d7b"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">vector</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">size_t</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="sig-name descname"><span class="n"><span class="pre">getInputsDims</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><a class="headerlink" href="#_CPPv4NK4N2D24Cell13getInputsDimsEv" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D24Cell14getOutputsDimsEv">
<span id="_CPPv3NK4N2D24Cell14getOutputsDimsEv"></span><span id="_CPPv2NK4N2D24Cell14getOutputsDimsEv"></span><span id="N2D2::Cell::getOutputsDimsC"></span><span class="target" id="classN2D2_1_1Cell_1a0221ac90d66d9d5c4b51e8dec8da9598"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">vector</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">size_t</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="sig-name descname"><span class="n"><span class="pre">getOutputsDims</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><a class="headerlink" href="#_CPPv4NK4N2D24Cell14getOutputsDimsEv" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
</div>
<p>In order to create a computing graph, or neural network, cells can be connected
together thanks to the <code class="docutils literal notranslate"><span class="pre">addInput</span></code> method. An <code class="docutils literal notranslate"><span class="pre">Cell</span></code> can be connected to
another <code class="docutils literal notranslate"><span class="pre">Cell</span></code> or to a <code class="docutils literal notranslate"><span class="pre">StimuliProvider</span></code>, which constitute an entry point
for the data. It is up to the implementation to allow or not multiple inputs.
The <code class="docutils literal notranslate"><span class="pre">initialize</span></code> virtual member initializes the state of the <code class="docutils literal notranslate"><span class="pre">Cell</span></code> in the
implementation (initialization may be different depending on the coding or
programming model).</p>
<div class="breathe-sectiondef docutils container">
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D24Cell8addInputER15StimuliProviderjjjjjRK6TensorIbE">
<span id="_CPPv3N4N2D24Cell8addInputER15StimuliProviderjjjjjRK6TensorIbE"></span><span id="_CPPv2N4N2D24Cell8addInputER15StimuliProviderjjjjjRK6TensorIbE"></span><span id="N2D2::Cell::addInput__StimuliProviderR.unsigned-i.unsigned-i.unsigned-i.unsigned-i.unsigned-i.Tensor:b:CR"></span><span class="target" id="classN2D2_1_1Cell_1a247b14e4513d7835db6f83068c12b451"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">addInput</span></span></span><span class="sig-paren">(</span><span class="n"><span class="pre">StimuliProvider</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">sp</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">channel</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">x0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">y0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">width</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">height</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">Tensor</span></span><span class="p"><span class="pre"><</span></span><span class="kt"><span class="pre">bool</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">mapping</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="n"><span class="pre">Tensor</span></span><span class="p"><span class="pre"><</span></span><span class="kt"><span class="pre">bool</span></span><span class="p"><span class="pre">></span></span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">)</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D24Cell8addInputER15StimuliProviderjjjjjRK6TensorIbE" title="Link to this definition">¶</a><br /></dt>
<dd><p>Connect an input filter from the environment to the cell. </p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>sp</strong> – N2D2 StimuliProvider object reference </p></li>
<li><p><strong>channel</strong> – Channel number in the environment </p></li>
<li><p><strong>x0</strong> – Left offset </p></li>
<li><p><strong>y0</strong> – Top offset </p></li>
<li><p><strong>width</strong> – Width </p></li>
<li><p><strong>height</strong> – Height </p></li>
<li><p><strong>mapping</strong> – Connection between the environment map and the cell output maps (size of the vector = number of output maps in the cell) </p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D24Cell8addInputER15StimuliProviderjjjjRK6TensorIbE">
<span id="_CPPv3N4N2D24Cell8addInputER15StimuliProviderjjjjRK6TensorIbE"></span><span id="_CPPv2N4N2D24Cell8addInputER15StimuliProviderjjjjRK6TensorIbE"></span><span id="N2D2::Cell::addInput__StimuliProviderR.unsigned-i.unsigned-i.unsigned-i.unsigned-i.Tensor:b:CR"></span><span class="target" id="classN2D2_1_1Cell_1a95d5f3a02da988542a918ac23af3038f"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">addInput</span></span></span><span class="sig-paren">(</span><span class="n"><span class="pre">StimuliProvider</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">sp</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">x0</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">y0</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">width</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">height</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">Tensor</span></span><span class="p"><span class="pre"><</span></span><span class="kt"><span class="pre">bool</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">mapping</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="n"><span class="pre">Tensor</span></span><span class="p"><span class="pre"><</span></span><span class="kt"><span class="pre">bool</span></span><span class="p"><span class="pre">></span></span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">)</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D24Cell8addInputER15StimuliProviderjjjjRK6TensorIbE" title="Link to this definition">¶</a><br /></dt>
<dd><p>Connect an input map from the environment to the cell. </p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>sp</strong> – N2D2 StimuliProvider object reference </p></li>
<li><p><strong>x0</strong> – Left offset </p></li>
<li><p><strong>y0</strong> – Top offset </p></li>
<li><p><strong>width</strong> – Width </p></li>
<li><p><strong>height</strong> – Height </p></li>
<li><p><strong>mapping</strong> – Connection between the environment map filters and the cell output maps (size of the matrix = number of output maps in the cell [cols] x number of filters in the environment map [rows]) </p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D24Cell8addInputEP4CellRK6TensorIbE">
<span id="_CPPv3N4N2D24Cell8addInputEP4CellRK6TensorIbE"></span><span id="_CPPv2N4N2D24Cell8addInputEP4CellRK6TensorIbE"></span><span id="N2D2::Cell::addInput__CellP.Tensor:b:CR"></span><span class="target" id="classN2D2_1_1Cell_1a696b557dcdad9b3b28035e4f2504338e"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">addInput</span></span></span><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv4N4N2D24CellE" title="N2D2::Cell"><span class="n"><span class="pre">Cell</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n sig-param"><span class="pre">cell</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">Tensor</span></span><span class="p"><span class="pre"><</span></span><span class="kt"><span class="pre">bool</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">mapping</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="n"><span class="pre">Tensor</span></span><span class="p"><span class="pre"><</span></span><span class="kt"><span class="pre">bool</span></span><span class="p"><span class="pre">></span></span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">)</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D24Cell8addInputEP4CellRK6TensorIbE" title="Link to this definition">¶</a><br /></dt>
<dd><p>Connect an input cell to the cell. </p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>cell</strong> – Pointer to the input cell </p></li>
<li><p><strong>mapping</strong> – Connection between the input cell output maps (input channels) and the cell output maps (size of the matrix = number of output maps in the cell [cols] x number of input cell output maps (input channels) [rows]) </p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D24Cell8addInputEP4Celljjjj">
<span id="_CPPv3N4N2D24Cell8addInputEP4Celljjjj"></span><span id="_CPPv2N4N2D24Cell8addInputEP4Celljjjj"></span><span id="N2D2::Cell::addInput__CellP.unsigned-i.unsigned-i.unsigned-i.unsigned-i"></span><span class="target" id="classN2D2_1_1Cell_1a0f2efb60d7fb24987e31754bdf3af4b1"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">addInput</span></span></span><span class="sig-paren">(</span><a class="reference internal" href="#_CPPv4N4N2D24CellE" title="N2D2::Cell"><span class="n"><span class="pre">Cell</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n sig-param"><span class="pre">cell</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">x0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">y0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">width</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">height</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D24Cell8addInputEP4Celljjjj" title="Link to this definition">¶</a><br /></dt>
<dd><p>Connect an input cell to the cell. </p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>cell</strong> – Pointer to the input cell </p></li>
<li><p><strong>x0</strong> – Left offset </p></li>
<li><p><strong>y0</strong> – Top offset </p></li>
<li><p><strong>width</strong> – Width </p></li>
<li><p><strong>height</strong> – Height </p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D24Cell10initializeEv">
<span id="_CPPv3N4N2D24Cell10initializeEv"></span><span id="_CPPv2N4N2D24Cell10initializeEv"></span><span id="N2D2::Cell::initialize"></span><span class="target" id="classN2D2_1_1Cell_1aca0f62b30fc941092d2c183fc185ec5b"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">initialize</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv4N4N2D24Cell10initializeEv" title="Link to this definition">¶</a><br /></dt>
<dd><p>Initialize the state of the cell (e.g. weights random initialization) </p>
</dd></dl>
</div>
</section>
<section id="cell-frame-top-class">
<h3><code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top</span></code> class<a class="headerlink" href="#cell-frame-top-class" title="Link to this heading">¶</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top</span></code> is a purely abstract class, which does not inherit from
the <code class="docutils literal notranslate"><span class="pre">Cell</span></code> class. It provides
all the actual interface for a given <em>Coding model</em>. For the <code class="docutils literal notranslate"><span class="pre">Frame</span></code> coding
model, the input/output data is a Nd-tensor. This coding model is also
“bi-directional”, as it supports differentiation, thus its interface comprise
a forward data path and backward data path for the gradient. It is however not
mandatory for the implementation to handle the backward path, for non-differentiable
cells for example.</p>
<p>The main interfaces provided by <code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top</span></code> are listed below:</p>
<div class="breathe-sectiondef docutils container">
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D214Cell_Frame_Top9propagateEb">
<span id="_CPPv3N4N2D214Cell_Frame_Top9propagateEb"></span><span id="_CPPv2N4N2D214Cell_Frame_Top9propagateEb"></span><span id="N2D2::Cell_Frame_Top::propagate__b"></span><span class="target" id="classN2D2_1_1Cell__Frame__Top_1ae23690330577716fa4691c9488c78ce1"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">propagate</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">bool</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">inference</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="k"><span class="pre">false</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D214Cell_Frame_Top9propagateEb" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D214Cell_Frame_Top13backPropagateEv">
<span id="_CPPv3N4N2D214Cell_Frame_Top13backPropagateEv"></span><span id="_CPPv2N4N2D214Cell_Frame_Top13backPropagateEv"></span><span id="N2D2::Cell_Frame_Top::backPropagate"></span><span class="target" id="classN2D2_1_1Cell__Frame__Top_1ab173fb0f3906fff66998b9ac5910a03b"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">backPropagate</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D214Cell_Frame_Top13backPropagateEv" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D214Cell_Frame_Top6updateEv">
<span id="_CPPv3N4N2D214Cell_Frame_Top6updateEv"></span><span id="_CPPv2N4N2D214Cell_Frame_Top6updateEv"></span><span id="N2D2::Cell_Frame_Top::update"></span><span class="target" id="classN2D2_1_1Cell__Frame__Top_1ae9a67bc2590ea47e9529250ed8ddc28c"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">update</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D214Cell_Frame_Top6updateEv" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
</div>
<p>This class also handles the <code class="docutils literal notranslate"><span class="pre">Activation</span></code> and contains the shared pointer to
the <code class="docutils literal notranslate"><span class="pre">Activation</span></code> object to use.</p>
<div class="breathe-sectiondef docutils container">
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D214Cell_Frame_Top13getActivationEv">
<span id="_CPPv3NK4N2D214Cell_Frame_Top13getActivationEv"></span><span id="_CPPv2NK4N2D214Cell_Frame_Top13getActivationEv"></span><span id="N2D2::Cell_Frame_Top::getActivationC"></span><span class="target" id="classN2D2_1_1Cell__Frame__Top_1a50b7b3674d673513c6ae32cc76bc1cc1"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">shared_ptr</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">Activation</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="sig-name descname"><span class="n"><span class="pre">getActivation</span></span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><a class="headerlink" href="#_CPPv4NK4N2D214Cell_Frame_Top13getActivationEv" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D214Cell_Frame_Top13setActivationERKNSt10shared_ptrI10ActivationEE">
<span id="_CPPv3N4N2D214Cell_Frame_Top13setActivationERKNSt10shared_ptrI10ActivationEE"></span><span id="_CPPv2N4N2D214Cell_Frame_Top13setActivationERKNSt10shared_ptrI10ActivationEE"></span><span id="N2D2::Cell_Frame_Top::setActivation__std::shared_ptr:Activation:CR"></span><span class="target" id="classN2D2_1_1Cell__Frame__Top_1a4ec112284c39cb61845c709340729814"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setActivation</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">shared_ptr</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">Activation</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">activation</span></span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv4N4N2D214Cell_Frame_Top13setActivationERKNSt10shared_ptrI10ActivationEE" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
</div>
</section>
<section id="cell-frame-t-class">
<h3><code class="docutils literal notranslate"><span class="pre">Cell_Frame<T></span></code> class<a class="headerlink" href="#cell-frame-t-class" title="Link to this heading">¶</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">Cell_Frame<T></span></code> inherits from <code class="docutils literal notranslate"><span class="pre">Cell</span></code> and <code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top</span></code>. It contains
the output tensors and input tensor references.
<code class="docutils literal notranslate"><span class="pre">Cell_Frame<T></span></code> should not provide more members than <code class="docutils literal notranslate"><span class="pre">Cell_Frame_Top</span></code> already does.</p>
<figure class="align-default" id="id3">
<img alt="``Cell_Frame<T>`` interface." src="_images/Cell_Frame_interface.png" />
<figcaption>
<p><span class="caption-text"><code class="docutils literal notranslate"><span class="pre">Cell_Frame<T></span></code> interface.</span><a class="headerlink" href="#id3" title="Link to this image">¶</a></p>
</figcaption>
</figure>
</section>
<section id="convcell-class">
<h3><code class="docutils literal notranslate"><span class="pre">ConvCell</span></code> class<a class="headerlink" href="#convcell-class" title="Link to this heading">¶</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">ConvCell</span></code> class (or any other model) provides additional interfaces to
the base <code class="docutils literal notranslate"><span class="pre">Cell</span></code> class that it inherits, specific to the <em>Mathematical model</em>
it represents, regardless of the <em>Coding model</em>. For a convolution for example,
getter and setter members are provided for the weights, but also references to
<code class="docutils literal notranslate"><span class="pre">Filler</span></code> and <code class="docutils literal notranslate"><span class="pre">Solver</span></code> for the weights. Some facilities may be specific to
a particular coding model. The data structure (tensor) containing the weights
is however not defined in this class, but in the implementation
(<code class="docutils literal notranslate"><span class="pre">ConvCell_Frame</span></code>), because it can depend on the programming model and data
precision.</p>
<p>The main members (for <code class="docutils literal notranslate"><span class="pre">ConvCell</span></code>) are:</p>
<div class="breathe-sectiondef docutils container">
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D28ConvCell16setWeightsFillerERKNSt10shared_ptrI6FillerEE">
<span id="_CPPv3N4N2D28ConvCell16setWeightsFillerERKNSt10shared_ptrI6FillerEE"></span><span id="_CPPv2N4N2D28ConvCell16setWeightsFillerERKNSt10shared_ptrI6FillerEE"></span><span id="N2D2::ConvCell::setWeightsFiller__std::shared_ptr:Filler:CR"></span><span class="target" id="classN2D2_1_1ConvCell_1a4f2a044f229a9196ad85caa2f49c5725"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setWeightsFiller</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">shared_ptr</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">Filler</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">filler</span></span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv4N4N2D28ConvCell16setWeightsFillerERKNSt10shared_ptrI6FillerEE" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D28ConvCell13setBiasFillerERKNSt10shared_ptrI6FillerEE">
<span id="_CPPv3N4N2D28ConvCell13setBiasFillerERKNSt10shared_ptrI6FillerEE"></span><span id="_CPPv2N4N2D28ConvCell13setBiasFillerERKNSt10shared_ptrI6FillerEE"></span><span id="N2D2::ConvCell::setBiasFiller__std::shared_ptr:Filler:CR"></span><span class="target" id="classN2D2_1_1ConvCell_1a538460fb556d487d0cca81e8eca311c3"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setBiasFiller</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">shared_ptr</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">Filler</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">filler</span></span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv4N4N2D28ConvCell13setBiasFillerERKNSt10shared_ptrI6FillerEE" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D28ConvCell16setWeightsSolverERKNSt10shared_ptrI6SolverEE">
<span id="_CPPv3N4N2D28ConvCell16setWeightsSolverERKNSt10shared_ptrI6SolverEE"></span><span id="_CPPv2N4N2D28ConvCell16setWeightsSolverERKNSt10shared_ptrI6SolverEE"></span><span id="N2D2::ConvCell::setWeightsSolver__std::shared_ptr:Solver:CR"></span><span class="target" id="classN2D2_1_1ConvCell_1a3193f39df4519a9c86a45136bdc5c9b3"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setWeightsSolver</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">shared_ptr</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">Solver</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">solver</span></span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv4N4N2D28ConvCell16setWeightsSolverERKNSt10shared_ptrI6SolverEE" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D28ConvCell13setBiasSolverERKNSt10shared_ptrI6SolverEE">
<span id="_CPPv3N4N2D28ConvCell13setBiasSolverERKNSt10shared_ptrI6SolverEE"></span><span id="_CPPv2N4N2D28ConvCell13setBiasSolverERKNSt10shared_ptrI6SolverEE"></span><span id="N2D2::ConvCell::setBiasSolver__std::shared_ptr:Solver:CR"></span><span class="target" id="classN2D2_1_1ConvCell_1a91a7e4e0f420953797dd1041dd74d6c1"></span><span class="k"><span class="pre">inline</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setBiasSolver</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">std</span></span><span class="p"><span class="pre">::</span></span><span class="n"><span class="pre">shared_ptr</span></span><span class="p"><span class="pre"><</span></span><span class="n"><span class="pre">Solver</span></span><span class="p"><span class="pre">></span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">solver</span></span><span class="sig-paren">)</span><a class="headerlink" href="#_CPPv4N4N2D28ConvCell13setBiasSolverERKNSt10shared_ptrI6SolverEE" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D28ConvCell9getWeightEjjR10BaseTensor">
<span id="_CPPv3NK4N2D28ConvCell9getWeightEjjR10BaseTensor"></span><span id="_CPPv2NK4N2D28ConvCell9getWeightEjjR10BaseTensor"></span><span id="N2D2::ConvCell::getWeight__unsigned-i.unsigned-i.BaseTensorRC"></span><span class="target" id="classN2D2_1_1ConvCell_1a182687318aa6f1c4fdceef52a03074c7"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">getWeight</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">output</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">channel</span></span>, <span class="n"><span class="pre">BaseTensor</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">value</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4NK4N2D28ConvCell9getWeightEjjR10BaseTensor" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4NK4N2D28ConvCell7getBiasEjR10BaseTensor">
<span id="_CPPv3NK4N2D28ConvCell7getBiasEjR10BaseTensor"></span><span id="_CPPv2NK4N2D28ConvCell7getBiasEjR10BaseTensor"></span><span id="N2D2::ConvCell::getBias__unsigned-i.BaseTensorRC"></span><span class="target" id="classN2D2_1_1ConvCell_1a5f39d338d2279a1af658c0392788b900"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">getBias</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">output</span></span>, <span class="n"><span class="pre">BaseTensor</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">value</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4NK4N2D28ConvCell7getBiasEjR10BaseTensor" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D28ConvCell9setWeightEjjRK10BaseTensor">
<span id="_CPPv3N4N2D28ConvCell9setWeightEjjRK10BaseTensor"></span><span id="_CPPv2N4N2D28ConvCell9setWeightEjjRK10BaseTensor"></span><span id="N2D2::ConvCell::setWeight__unsigned-i.unsigned-i.BaseTensorCR"></span><span class="target" id="classN2D2_1_1ConvCell_1af518c399531d4e9279d18e6ed3605058"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setWeight</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">output</span></span>, <span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">channel</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">BaseTensor</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">value</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D28ConvCell9setWeightEjjRK10BaseTensor" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
<dl class="cpp function">
<dt class="sig sig-object cpp" id="_CPPv4N4N2D28ConvCell7setBiasEjRK10BaseTensor">
<span id="_CPPv3N4N2D28ConvCell7setBiasEjRK10BaseTensor"></span><span id="_CPPv2N4N2D28ConvCell7setBiasEjRK10BaseTensor"></span><span id="N2D2::ConvCell::setBias__unsigned-i.BaseTensorCR"></span><span class="target" id="classN2D2_1_1ConvCell_1a5b8207782207281a6789c349b8f6288d"></span><span class="k"><span class="pre">virtual</span></span><span class="w"> </span><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">setBias</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n sig-param"><span class="pre">output</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="n"><span class="pre">BaseTensor</span></span><span class="w"> </span><span class="p"><span class="pre">&</span></span><span class="n sig-param"><span class="pre">value</span></span><span class="sig-paren">)</span><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="m"><span class="pre">0</span></span><a class="headerlink" href="#_CPPv4N4N2D28ConvCell7setBiasEjRK10BaseTensor" title="Link to this definition">¶</a><br /></dt>
<dd></dd></dl>
</div>
</section>
<section id="convcell-frame-t-class">
<h3><code class="docutils literal notranslate"><span class="pre">ConvCell_Frame<T></span></code> class<a class="headerlink" href="#convcell-frame-t-class" title="Link to this heading">¶</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">ConvCell_Frame<T></span></code> is the final class implementing the convolution
<em>Mathematical model</em> with the tensor-based <code class="docutils literal notranslate"><span class="pre">Frame</span></code> <em>Coding model</em> on standard
C++ for CPU <em>Programming model</em>. It is only an implementation class, which
therefore does not provide any new members.</p>
</section>
</section>
<section id="the-tensor-t-class">
<span id="dev-tensor-t"></span><h2>The <code class="docutils literal notranslate"><span class="pre">Tensor<T></span></code> class<a class="headerlink" href="#the-tensor-t-class" title="Link to this heading">¶</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">Tensor<T></span></code> class is the base data structure in N2D2, a Nd-tensor. In
N2D2, a tensor has the following properties:</p>
<ul class="simple">
<li><p>Its data is guaranteed to be <strong>continuous</strong>. It therefore does not handle
arbitrary strides without actual data reorganization. While this property
may appear restricting, it is an assumed design choice to simplify the
implementation of the many possible coding and programming models;</p></li>
<li><p>It <strong>holds a reference</strong> to the data, meaning no data is actually copied in a
tensor assignment and the new tensor will point to the same data. To perform
an actual copy, the <code class="docutils literal notranslate"><span class="pre">clone()</span></code> method should be used;</p></li>
<li><p>It is <strong>explicitly typed</strong>, meaning that the data type is part of the tensor
type, as a template parameter. When the type does not need to be known or can
be arbitrary, a reference to the <code class="docutils literal notranslate"><span class="pre">BaseTensor</span></code> base class should be used.
Conversion from one tensor type (or from a <code class="docutils literal notranslate"><span class="pre">BaseTensor</span></code> reference) to another
can be performed with the <code class="docutils literal notranslate"><span class="pre">tensor_cast<T>()</span></code> function;</p></li>
<li><p>Down to <strong>zero overhead</strong> type conversion. Memory is only allocated once
for a given type conversion during the lifetime of the tensor.
Type conversion can be made without any data copy-conversion,
with the <code class="docutils literal notranslate"><span class="pre">tensor_cast_nocopy<T>()</span></code> function, when it is known that a previous
conversion is still valid, thus incurring zero overhead.</p></li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">Tensor<T></span></code> implementation classes hierarchy is shown in the figure below.</p>
<figure class="align-default" id="id4">
<img alt="``Tensor<T>`` implementation classes hierarchy." src="_images/Tensor_diagram.png" />
<figcaption>
<p><span class="caption-text"><code class="docutils literal notranslate"><span class="pre">Tensor<T></span></code> implementation classes hierarchy.</span><a class="headerlink" href="#id4" title="Link to this image">¶</a></p>
</figcaption>
</figure>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="core/example.html" class="btn btn-neutral float-left" title="Example" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 2019, CEA LIST.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>