-
Notifications
You must be signed in to change notification settings - Fork 73
/
active_information_storage.html
709 lines (638 loc) · 84.1 KB
/
active_information_storage.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
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>idtxl.active_information_storage — IDTxl 1.5 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/pyramid.css" />
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Neuton&subset=latin" type="text/css" media="screen" charset="utf-8" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Nobile:regular,italic,bold,bolditalic&subset=latin" type="text/css" media="screen" charset="utf-8" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="../../_static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../index.html">IDTxl 1.5 documentation</a> »</li>
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li>
<li class="nav-item nav-item-this"><a href="">idtxl.active_information_storage</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for idtxl.active_information_storage</h1><div class="highlight"><pre>
<span></span><span class="sd">"""Analysis of AIS in a network of processes.</span>
<span class="sd">Analysis of active information storage (AIS) in individual processes of a</span>
<span class="sd">network. The algorithm uses non-uniform embedding as described in Faes (2011).</span>
<span class="sd">Note:</span>
<span class="sd"> Written for Python 3.4+</span>
<span class="sd">"""</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">stats</span>
<span class="kn">from</span> <span class="nn">.single_process_analysis</span> <span class="kn">import</span> <span class="n">SingleProcessAnalysis</span>
<span class="kn">from</span> <span class="nn">.results</span> <span class="kn">import</span> <span class="n">ResultsSingleProcessAnalysis</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">idtxl_exceptions</span> <span class="k">as</span> <span class="n">ex</span>
<div class="viewcode-block" id="ActiveInformationStorage"><a class="viewcode-back" href="../../idtxl_process_analysis.html#idtxl.active_information_storage.ActiveInformationStorage">[docs]</a><span class="k">class</span> <span class="nc">ActiveInformationStorage</span><span class="p">(</span><span class="n">SingleProcessAnalysis</span><span class="p">):</span>
<span class="sd">"""Estimate active information storage in individual processes.</span>
<span class="sd"> Estimate active information storage (AIS) in individual processes of the</span>
<span class="sd"> network. To perform AIS estimation call analyse_network() on the whole</span>
<span class="sd"> network or a set of nodes or call analyse_single_process() to estimate</span>
<span class="sd"> AIS for a single process. See docstrings of the two functions for more</span>
<span class="sd"> information.</span>
<span class="sd"> References:</span>
<span class="sd"> - Lizier, J. T., Prokopenko, M., & Zomaya, A. Y. (2012). Local measures of</span>
<span class="sd"> information storage in complex distributed computation. Inform Sci, 208,</span>
<span class="sd"> 39–54. http://doi.org/10.1016/j.ins.2012.04.016</span>
<span class="sd"> - Wibral, M., Lizier, J. T., Vögler, S., Priesemann, V., & Galuske, R.</span>
<span class="sd"> (2014). Local active information storage as a tool to understand</span>
<span class="sd"> distributed neural information processing. Front Neuroinf, 8, 1.</span>
<span class="sd"> http://doi.org/10.3389/fninf.2014.00001</span>
<span class="sd"> - Faes, L., Nollo, G., & Porta, A. (2011). Information-based detection</span>
<span class="sd"> of nonlinear Granger causality in multivariate processes via a</span>
<span class="sd"> nonuniform embedding technique. Phys Rev E, 83, 1–15.</span>
<span class="sd"> http://doi.org/10.1103/PhysRevE.83.051112</span>
<span class="sd"> Attributes:</span>
<span class="sd"> process_set : list</span>
<span class="sd"> list with indices of analyzed processes</span>
<span class="sd"> settings : dict</span>
<span class="sd"> analysis settings</span>
<span class="sd"> current_value : tuple</span>
<span class="sd"> index of the current value in AIS estimation, (idx process,</span>
<span class="sd"> idx sample)</span>
<span class="sd"> selected_vars_full : list of tuples</span>
<span class="sd"> samples in the past state, (idx process, idx sample)</span>
<span class="sd"> ais : float</span>
<span class="sd"> raw AIS value</span>
<span class="sd"> sign : bool</span>
<span class="sd"> true if AIS is significant</span>
<span class="sd"> pvalue: float</span>
<span class="sd"> p-value of AIS</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<div class="viewcode-block" id="ActiveInformationStorage.analyse_network"><a class="viewcode-back" href="../../idtxl_process_analysis.html#idtxl.active_information_storage.ActiveInformationStorage.analyse_network">[docs]</a> <span class="k">def</span> <span class="nf">analyse_network</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">processes</span><span class="o">=</span><span class="s1">'all'</span><span class="p">):</span>
<span class="sd">"""Estimate active information storage for multiple network processes.</span>
<span class="sd"> Estimate active information storage for all or a subset of processes in</span>
<span class="sd"> the network.</span>
<span class="sd"> Note:</span>
<span class="sd"> For a detailed description of the algorithm and settings see</span>
<span class="sd"> documentation of the analyse_single_process() method and</span>
<span class="sd"> references in the class docstring.</span>
<span class="sd"> Example:</span>
<span class="sd"> >>> data = Data()</span>
<span class="sd"> >>> data.generate_mute_data(100, 5)</span>
<span class="sd"> >>> settings = {</span>
<span class="sd"> >>> 'cmi_estimator': 'JidtKraskovCMI',</span>
<span class="sd"> >>> 'n_perm_max_stat': 200,</span>
<span class="sd"> >>> 'n_perm_min_stat': 200,</span>
<span class="sd"> >>> 'max_lag': 5,</span>
<span class="sd"> >>> 'tau': 1</span>
<span class="sd"> >>> }</span>
<span class="sd"> >>> processes = [1, 2, 3]</span>
<span class="sd"> >>> network_analysis = ActiveInformationStorage()</span>
<span class="sd"> >>> results = network_analysis.analyse_network(settings, data,</span>
<span class="sd"> >>> processes)</span>
<span class="sd"> Args:</span>
<span class="sd"> settings : dict</span>
<span class="sd"> parameters for estimation and statistical testing, see</span>
<span class="sd"> documentation of analyse_single_target() for details, settings</span>
<span class="sd"> can further contain</span>
<span class="sd"> - verbose : bool [optional] - toggle console output</span>
<span class="sd"> (default=True)</span>
<span class="sd"> - fdr_correction : bool [optional] - correct results on the</span>
<span class="sd"> network level, see documentation of stats.ais_fdr() for</span>
<span class="sd"> details (default=True)</span>
<span class="sd"> data : Data instance</span>
<span class="sd"> raw data for analysis</span>
<span class="sd"> processes : list of int | 'all'</span>
<span class="sd"> index of processes (default='all');</span>
<span class="sd"> if 'all', AIS is estimated for all processes;</span>
<span class="sd"> if list of int, AIS is estimated for processes specified in the</span>
<span class="sd"> list.</span>
<span class="sd"> Returns:</span>
<span class="sd"> ResultsSingleProcessAnalysis instance</span>
<span class="sd"> results of network AIS estimation, see documentation of</span>
<span class="sd"> ResultsSingleProcessAnalysis()</span>
<span class="sd"> """</span>
<span class="c1"># Set defaults for AIS estimation.</span>
<span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'verbose'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'fdr_correction'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="c1"># Check provided processes for analysis.</span>
<span class="k">if</span> <span class="n">processes</span> <span class="o">==</span> <span class="s1">'all'</span><span class="p">:</span>
<span class="n">processes</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_processes</span><span class="p">)]</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">processes</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">processes</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="ow">is</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Processes were not specified correctly: '</span>
<span class="s1">'</span><span class="si">{0}</span><span class="s1">.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">processes</span><span class="p">))</span>
<span class="c1"># Check and set defaults for checkpointing.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_checkpointing_defaults</span><span class="p">(</span>
<span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="p">[],</span> <span class="n">processes</span><span class="p">)</span>
<span class="c1"># Perform AIS estimation for each target individually.</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">ResultsSingleProcessAnalysis</span><span class="p">(</span>
<span class="n">n_nodes</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">n_processes</span><span class="p">,</span>
<span class="n">n_realisations</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">(),</span>
<span class="n">normalised</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">normalise</span><span class="p">)</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">processes</span><span class="p">)):</span>
<span class="k">if</span> <span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">####### analysing process </span><span class="si">{0}</span><span class="s1"> of </span><span class="si">{1}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">processes</span><span class="p">[</span><span class="n">t</span><span class="p">],</span> <span class="n">processes</span><span class="p">))</span>
<span class="n">res_single</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">analyse_single_process</span><span class="p">(</span>
<span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">processes</span><span class="p">[</span><span class="n">t</span><span class="p">])</span>
<span class="n">results</span><span class="o">.</span><span class="n">combine_results</span><span class="p">(</span><span class="n">res_single</span><span class="p">)</span>
<span class="c1"># Get no. realisations actually used for estimation from single target</span>
<span class="c1"># analysis.</span>
<span class="n">results</span><span class="o">.</span><span class="n">data_properties</span><span class="o">.</span><span class="n">n_realisations</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">res_single</span><span class="o">.</span><span class="n">data_properties</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">)</span>
<span class="c1"># Perform FDR-correction on the network level. Add FDR-corrected</span>
<span class="c1"># results as an extra field. Network_fdr/combine_results internally</span>
<span class="c1"># creates a deep copy of the results.</span>
<span class="k">if</span> <span class="n">settings</span><span class="p">[</span><span class="s1">'fdr_correction'</span><span class="p">]:</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">ais_fdr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">results</span><span class="p">)</span>
<span class="k">return</span> <span class="n">results</span></div>
<div class="viewcode-block" id="ActiveInformationStorage.analyse_single_process"><a class="viewcode-back" href="../../idtxl_process_analysis.html#idtxl.active_information_storage.ActiveInformationStorage.analyse_single_process">[docs]</a> <span class="k">def</span> <span class="nf">analyse_single_process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">process</span><span class="p">):</span>
<span class="sd">"""Estimate active information storage for a single process.</span>
<span class="sd"> Estimate active information storage for one process in the network.</span>
<span class="sd"> Uses non-uniform embedding found through information maximisation. This</span>
<span class="sd"> is done in three steps (see Lizier and Faes for details):</span>
<span class="sd"> (1) Find all relevant samples in the processes' own past, by</span>
<span class="sd"> iteratively adding candidate samples that have significant</span>
<span class="sd"> conditional mutual information (CMI) with the current value</span>
<span class="sd"> (conditional on all samples that were added previously)</span>
<span class="sd"> (2) Prune the final conditional set by testing the CMI between each</span>
<span class="sd"> sample in the final set and the current value, conditional on all</span>
<span class="sd"> other samples in the final set</span>
<span class="sd"> (3) Calculate AIS using the final set of candidates as the past state</span>
<span class="sd"> (calculate MI between samples in the past and the current value);</span>
<span class="sd"> test for statistical significance using a permutation test</span>
<span class="sd"> Note:</span>
<span class="sd"> For a further description of the algorithm see references in the</span>
<span class="sd"> class docstring.</span>
<span class="sd"> Args:</span>
<span class="sd"> settings : dict</span>
<span class="sd"> parameters for estimator use and statistics:</span>
<span class="sd"> - cmi_estimator : str - estimator to be used for CMI and MI</span>
<span class="sd"> calculation (for estimator settings see the documentation in</span>
<span class="sd"> the estimators_* modules)</span>
<span class="sd"> - max_lag : int - maximum temporal search depth for candidates</span>
<span class="sd"> in the processes' past in samples</span>
<span class="sd"> - tau : int [optional] - spacing between candidates in the</span>
<span class="sd"> sources' past in samples (default=1)</span>
<span class="sd"> - n_perm_* : int [optional] - number of permutations, where *</span>
<span class="sd"> can be 'max_stat', 'min_stat', 'mi' (default=500)</span>
<span class="sd"> - alpha_* : float [optional] - critical alpha level for</span>
<span class="sd"> statistical significance, where * can be 'max_stat',</span>
<span class="sd"> 'min_stat', 'mi' (default=0.05)</span>
<span class="sd"> - add_conditionals : list of tuples | str [optional] - force</span>
<span class="sd"> the estimator to add these conditionals when estimating TE;</span>
<span class="sd"> can either be a list of variables, where each variable is</span>
<span class="sd"> described as (idx process, lag wrt to current value) or can</span>
<span class="sd"> be a string: 'faes' for Faes-Method (see references)</span>
<span class="sd"> - permute_in_time : bool [optional] - force surrogate creation</span>
<span class="sd"> by shuffling realisations in time instead of shuffling</span>
<span class="sd"> replications; see documentation of Data.permute_samples() for</span>
<span class="sd"> further settings (default=False)</span>
<span class="sd"> - verbose : bool [optional] - toggle console output</span>
<span class="sd"> (default=True)</span>
<span class="sd"> - write_ckp : bool [optional] - enable checkpointing, writes</span>
<span class="sd"> analysis state to disk every time a variable is selected;</span>
<span class="sd"> resume crashed analysis using</span>
<span class="sd"> network_analysis.resume_checkpoint() (default=False)</span>
<span class="sd"> - filename_ckp : str [optional] - checkpoint file name (without</span>
<span class="sd"> extension) (default='./idtxl_checkpoint')</span>
<span class="sd"> data : Data instance</span>
<span class="sd"> raw data for analysis</span>
<span class="sd"> process : int</span>
<span class="sd"> index of process</span>
<span class="sd"> Returns:</span>
<span class="sd"> ResultsSingleProcessAnalysis instance</span>
<span class="sd"> results of AIS estimation, see documentation of</span>
<span class="sd"> ResultsSingleProcessAnalysis()</span>
<span class="sd"> """</span>
<span class="c1"># Check input and clean up object if it was used before.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_initialise</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">process</span><span class="p">)</span>
<span class="c1"># Main algorithm.</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">---------------------------- (1) include candidates'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_include_process_candidates</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">---------------------------- (2) prune source candidates'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_prune_candidates</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">---------------------------- (3) final statistics'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_test_final_conditional</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="c1"># Clean up and return results.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'final conditional samples: </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_full</span><span class="p">)))</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">ResultsSingleProcessAnalysis</span><span class="p">(</span>
<span class="n">n_nodes</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">n_processes</span><span class="p">,</span>
<span class="n">n_realisations</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">),</span>
<span class="n">normalised</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">normalise</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">_add_single_result</span><span class="p">(</span>
<span class="n">process</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="p">,</span>
<span class="n">settings</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">,</span>
<span class="n">results</span><span class="o">=</span><span class="p">{</span>
<span class="s1">'current_value'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span>
<span class="s1">'selected_vars'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_full</span><span class="p">),</span>
<span class="s1">'ais'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">ais</span><span class="p">,</span>
<span class="s1">'ais_pval'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">pvalue</span><span class="p">,</span>
<span class="s1">'ais_sign'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign</span>
<span class="p">})</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reset</span><span class="p">()</span> <span class="c1"># remove realisations and min_stats surrogate table</span>
<span class="k">return</span> <span class="n">results</span></div>
<span class="k">def</span> <span class="nf">_initialise</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">process</span><span class="p">):</span>
<span class="sd">"""Check input, set initial or default values for analysis settings."""</span>
<span class="c1"># Check analysis settings and set defaults.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'verbose'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'add_conditionals'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'tau'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'local_values'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">])</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">int</span> <span class="ow">or</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">]</span> <span class="o"><</span> <span class="mi">0</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'max_lag has to be an integer >= 0.'</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'tau'</span><span class="p">])</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">int</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'tau'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'tau has to be an integer > 0.'</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'tau'</span><span class="p">]</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">]:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'tau (</span><span class="si">{0}</span><span class="s1">) has to be equal to or smaller than max_lag (</span><span class="si">{1}</span><span class="s1">)'</span>
<span class="s1">'.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'tau'</span><span class="p">],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">]))</span>
<span class="c1"># Set CMI estimator.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_set_cmi_estimator</span><span class="p">()</span>
<span class="c1"># Initialise class attributes.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_min_stats_surr_table</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Check process to be analysed.</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">process</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">int</span> <span class="ow">or</span> <span class="n">process</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'The index of the process (</span><span class="si">{0}</span><span class="s1">) has to be an '</span>
<span class="s1">'int >= 0.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">process</span><span class="p">))</span>
<span class="k">if</span> <span class="n">process</span> <span class="o">></span> <span class="n">data</span><span class="o">.</span><span class="n">n_processes</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">'Trying to analyse process with index </span><span class="si">{0}</span><span class="s1">, '</span>
<span class="s1">'which greater than the number of processes in '</span>
<span class="s1">'the data (</span><span class="si">{1}</span><span class="s1">).'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">process</span><span class="p">,</span>
<span class="n">data</span><span class="o">.</span><span class="n">n_processes</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">process</span> <span class="o">=</span> <span class="n">process</span>
<span class="c1"># Check provided search depths for source and target</span>
<span class="k">assert</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_samples</span> <span class="o">>=</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span>
<span class="s1">'Not enough samples in data (</span><span class="si">{0}</span><span class="s1">) to allow for the chosen maximum '</span>
<span class="s1">'lag (</span><span class="si">{1}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_samples</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">]))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_value</span> <span class="o">=</span> <span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">])</span>
<span class="p">[</span><span class="n">cv_realisation</span><span class="p">,</span> <span class="n">repl_idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get_realisations</span><span class="p">(</span>
<span class="n">current_value</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span>
<span class="n">idx_list</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_value_realisations</span> <span class="o">=</span> <span class="n">cv_realisation</span>
<span class="c1"># Remember which realisations come from which replication. This may be</span>
<span class="c1"># needed for surrogate creation at a later point.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_replication_index</span> <span class="o">=</span> <span class="n">repl_idx</span>
<span class="c1"># Check the permutation type and no. permutations requested by the</span>
<span class="c1"># user. This tests if there is sufficient data to do all tests.</span>
<span class="c1"># surrogates.check_permutations(self, data)</span>
<span class="c1"># Check and set defaults for checkpointing.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_checkpointing_defaults</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="p">[],</span> <span class="n">process</span><span class="p">)</span>
<span class="c1"># Reset all attributes to inital values if the instance has been used</span>
<span class="c1"># before.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_full</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_full</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selected_vars_realisations</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pvalue</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sign</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ais</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_min_stats_surr_table</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Check if the user provided a list of candidates that must go into</span>
<span class="c1"># the conditioning set. These will be added and used for TE estimation,</span>
<span class="c1"># but never tested for significance.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'add_conditionals'</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_force_conditionals</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'add_conditionals'</span><span class="p">],</span> <span class="n">data</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_include_process_candidates</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">"""Test candidates in the process's past."""</span>
<span class="n">process</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="p">]</span>
<span class="n">samples</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'max_lag'</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
<span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'tau'</span><span class="p">])</span>
<span class="n">candidates</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_define_candidates</span><span class="p">(</span><span class="n">process</span><span class="p">,</span> <span class="n">samples</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">candidates</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_include_candidates</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_include_candidates</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">candidate_set</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">"""Include informative candidates into the conditioning set.</span>
<span class="sd"> Loop over each candidate in the candidate set and test if it has</span>
<span class="sd"> significant mutual information with the current value, conditional</span>
<span class="sd"> on all samples that were informative in previous rounds and are already</span>
<span class="sd"> in the conditioning set. If this conditional mutual information is</span>
<span class="sd"> significant using maximum statistics, add the current candidate to the</span>
<span class="sd"> conditional set.</span>
<span class="sd"> Args:</span>
<span class="sd"> candidate_set : list of tuples</span>
<span class="sd"> candidate set to be tested, where each entry is a tuple</span>
<span class="sd"> (process index, sample index)</span>
<span class="sd"> data : Data instance</span>
<span class="sd"> raw data</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool</span>
<span class="sd"> True if a significant variable was found in the process's past.</span>
<span class="sd"> """</span>
<span class="n">success</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'testing candidate set: </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">(</span><span class="n">candidate_set</span><span class="p">)))</span>
<span class="k">while</span> <span class="n">candidate_set</span><span class="p">:</span>
<span class="c1"># Get realisations for all candidates.</span>
<span class="n">cand_real</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span>
<span class="n">candidate_set</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">cand_real</span> <span class="o">=</span> <span class="n">cand_real</span><span class="o">.</span><span class="n">T</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">cand_real</span><span class="o">.</span><span class="n">size</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># Calculate the (C)MI for each candidate and the target.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">temp_te</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cmi_estimator</span><span class="o">.</span><span class="n">estimate_parallel</span><span class="p">(</span>
<span class="n">n_chunks</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">candidate_set</span><span class="p">),</span>
<span class="n">re_use</span><span class="o">=</span><span class="p">[</span><span class="s1">'var2'</span><span class="p">,</span> <span class="s1">'conditional'</span><span class="p">],</span>
<span class="n">var1</span><span class="o">=</span><span class="n">cand_real</span><span class="p">,</span>
<span class="n">var2</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_current_value_realisations</span><span class="p">,</span>
<span class="n">conditional</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_selected_vars_realisations</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ex</span><span class="o">.</span><span class="n">AlgorithmExhaustedError</span> <span class="k">as</span> <span class="n">aee</span><span class="p">:</span>
<span class="c1"># The algorithm cannot continue here, so</span>
<span class="c1"># we'll terminate the search for more candidates,</span>
<span class="c1"># though those identified already remain valid</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'AlgorithmExhaustedError encountered in '</span>
<span class="s1">'estimations: '</span> <span class="o">+</span> <span class="n">aee</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Halting current estimation set.'</span><span class="p">)</span>
<span class="c1"># For now we don't need a stack trace:</span>
<span class="c1"># traceback.print_tb(aee.__traceback__)</span>
<span class="k">break</span>
<span class="c1"># Test max CMI for significance with maximum statistics.</span>
<span class="n">te_max_candidate</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">temp_te</span><span class="p">)</span>
<span class="n">max_candidate</span> <span class="o">=</span> <span class="n">candidate_set</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">temp_te</span><span class="p">)]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'testing candidate </span><span class="si">{0}</span><span class="s1"> '</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">([</span><span class="n">max_candidate</span><span class="p">])[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">end</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span>
<span class="n">significant</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">significant</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">max_statistic</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">candidate_set</span><span class="p">,</span> <span class="n">te_max_candidate</span><span class="p">,</span>
<span class="n">conditional</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_selected_vars_realisations</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">except</span> <span class="n">ex</span><span class="o">.</span><span class="n">AlgorithmExhaustedError</span> <span class="k">as</span> <span class="n">aee</span><span class="p">:</span>
<span class="c1"># The algorithm cannot continue here, so</span>
<span class="c1"># we'll terminate the check on the max stats and not let the</span>
<span class="c1"># source pass</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'AlgorithmExhaustedError encountered in '</span>
<span class="s1">'estimations: '</span> <span class="o">+</span> <span class="n">aee</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Halting max stats and further selection for target.'</span><span class="p">)</span>
<span class="c1"># For now we don't need a stack trace:</span>
<span class="c1"># traceback.print_tb(aee.__traceback__)</span>
<span class="k">break</span>
<span class="c1"># If the max is significant keep it and test the next candidate. If</span>
<span class="c1"># it is not significant break. There will be no further significant</span>
<span class="c1"># sources b/c they all have lesser TE.</span>
<span class="k">if</span> <span class="n">significant</span><span class="p">:</span>
<span class="c1"># if self.settings['verbose']:</span>
<span class="c1"># print(' -- significant')</span>
<span class="n">success</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># Remove candidate from candidate set and add it to the</span>
<span class="c1"># selected variables (used as the conditioning set).</span>
<span class="n">candidate_set</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">temp_te</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_append_selected_vars</span><span class="p">(</span>
<span class="p">[</span><span class="n">max_candidate</span><span class="p">],</span>
<span class="n">data</span><span class="o">.</span><span class="n">get_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span>
<span class="p">[</span><span class="n">max_candidate</span><span class="p">])[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'write_ckp'</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_write_checkpoint</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">' -- not significant'</span><span class="p">)</span>
<span class="k">break</span>
<span class="k">return</span> <span class="n">success</span>
<span class="k">def</span> <span class="nf">_prune_candidates</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">"""Remove uninformative candidates from the final conditional set.</span>
<span class="sd"> For each sample in the final conditioning set, check if it is</span>
<span class="sd"> informative about the current value given all other samples in the</span>
<span class="sd"> final set. If a sample is not informative, it is removed from the</span>
<span class="sd"> final set.</span>
<span class="sd"> Args:</span>
<span class="sd"> data : Data instance</span>
<span class="sd"> raw data</span>
<span class="sd"> """</span>
<span class="c1"># FOR LATER we don't need to test the last included in the first round</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'testing candidate set: </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">)),</span> <span class="n">end</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'no sources selected, nothing to prune ...'</span><span class="p">)</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">:</span>
<span class="c1"># Find the candidate with the minimum TE into the target.</span>
<span class="n">cond_dim</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">candidate_realisations</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span>
<span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">)</span> <span class="o">*</span>
<span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">),</span>
<span class="mi">1</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">data_type</span><span class="p">)</span>
<span class="n">conditional_realisations</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span>
<span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">)</span> <span class="o">*</span>
<span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">),</span>
<span class="n">cond_dim</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">data_type</span><span class="p">)</span>
<span class="n">i_1</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">i_2</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">)</span>
<span class="k">for</span> <span class="n">candidate</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">:</span>
<span class="c1"># Separate the candidate realisations and all other</span>
<span class="c1"># realisations to test the candidate's individual contribution.</span>
<span class="p">[</span><span class="n">temp_cond</span><span class="p">,</span> <span class="n">temp_cand</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_separate_realisations</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">,</span>
<span class="n">candidate</span><span class="p">)</span>
<span class="k">if</span> <span class="n">temp_cond</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">conditional_realisations</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">re_use</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'var2'</span><span class="p">,</span> <span class="s1">'conditional'</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">conditional_realisations</span><span class="p">[</span><span class="n">i_1</span><span class="p">:</span><span class="n">i_2</span><span class="p">,</span> <span class="p">]</span> <span class="o">=</span> <span class="n">temp_cond</span>
<span class="n">re_use</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'var2'</span><span class="p">]</span>
<span class="n">candidate_realisations</span><span class="p">[</span><span class="n">i_1</span><span class="p">:</span><span class="n">i_2</span><span class="p">,</span> <span class="p">]</span> <span class="o">=</span> <span class="n">temp_cand</span>
<span class="n">i_1</span> <span class="o">=</span> <span class="n">i_2</span>
<span class="n">i_2</span> <span class="o">+=</span> <span class="n">data</span><span class="o">.</span><span class="n">n_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">temp_te</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cmi_estimator</span><span class="o">.</span><span class="n">estimate_parallel</span><span class="p">(</span>
<span class="n">n_chunks</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">),</span>
<span class="n">re_use</span><span class="o">=</span><span class="n">re_use</span><span class="p">,</span>
<span class="n">var1</span><span class="o">=</span><span class="n">candidate_realisations</span><span class="p">,</span>
<span class="n">var2</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_current_value_realisations</span><span class="p">,</span>
<span class="n">conditional</span><span class="o">=</span><span class="n">conditional_realisations</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ex</span><span class="o">.</span><span class="n">AlgorithmExhaustedError</span> <span class="k">as</span> <span class="n">aee</span><span class="p">:</span>
<span class="c1"># The algorithm cannot continue here, so we'll terminate the</span>
<span class="c1"># pruning check, assuming that we need not prune any more</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'AlgorithmExhaustedError encountered in '</span>
<span class="s1">'estimations: '</span> <span class="o">+</span> <span class="n">aee</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Halting current pruning and allowing others to'</span>
<span class="s1">' remain.'</span><span class="p">)</span>
<span class="c1"># For now we don't need a stack trace:</span>
<span class="c1"># traceback.print_tb(aee.__traceback__)</span>
<span class="k">break</span>
<span class="c1"># Test min TE for significance with minimum statistics.</span>
<span class="n">te_min_candidate</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">temp_te</span><span class="p">)</span>
<span class="n">min_candidate</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">argmin</span><span class="p">(</span><span class="n">temp_te</span><span class="p">)]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'testing candidate: </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">([</span><span class="n">min_candidate</span><span class="p">])[</span><span class="mi">0</span><span class="p">]))</span>
<span class="n">remaining_candidates</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">)</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span>
<span class="nb">set</span><span class="p">([</span><span class="n">min_candidate</span><span class="p">]))</span>
<span class="n">conditional_realisations</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get_realisations</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span> <span class="n">remaining_candidates</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="p">[</span><span class="n">significant</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">surr_table</span><span class="p">]</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">min_statistic</span><span class="p">(</span>
<span class="n">analysis_setup</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
<span class="n">candidate_set</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_sources</span><span class="p">,</span>
<span class="n">te_min_candidate</span><span class="o">=</span><span class="n">te_min_candidate</span><span class="p">,</span>
<span class="n">conditional</span><span class="o">=</span><span class="n">conditional_realisations</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ex</span><span class="o">.</span><span class="n">AlgorithmExhaustedError</span> <span class="k">as</span> <span class="n">aee</span><span class="p">:</span>
<span class="c1"># The algorithm cannot continue here, so</span>
<span class="c1"># we'll terminate the min statistics</span>
<span class="c1"># assuming that we need not prune any more</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'AlgorithmExhaustedError encountered in '</span>
<span class="s1">'estimations: '</span> <span class="o">+</span> <span class="n">aee</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Halting current pruning and allowing others to'</span>
<span class="s1">' remain.'</span><span class="p">)</span>
<span class="c1"># For now we don't need a stack trace:</span>
<span class="c1"># traceback.print_tb(aee.__traceback__)</span>
<span class="k">break</span>
<span class="c1"># Remove the minimum it is not significant and test the next min.</span>
<span class="c1"># candidate. If the minimum is significant, break, all other</span>
<span class="c1"># sources will be significant as well (b/c they have higher TE).</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">significant</span><span class="p">:</span>
<span class="c1"># if self.settings['verbose']:</span>
<span class="c1"># print(' -- not significant')</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_remove_selected_var</span><span class="p">(</span><span class="n">min_candidate</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'write_ckp'</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_write_checkpoint</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">' -- significant'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_min_stats_surr_table</span> <span class="o">=</span> <span class="n">surr_table</span>
<span class="k">break</span>
<span class="k">def</span> <span class="nf">_test_final_conditional</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">"""Perform statistical test on AIS using the final conditional set."""</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selected_vars_full</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'selected sources: </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_idx_to_lag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">selected_vars_full</span><span class="p">)))</span>
<span class="k">try</span><span class="p">:</span>
<span class="p">[</span><span class="n">ais</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">mi_against_surrogates</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ex</span><span class="o">.</span><span class="n">AlgorithmExhaustedError</span> <span class="k">as</span> <span class="n">aee</span><span class="p">:</span>
<span class="c1"># The algorithm cannot continue here, so</span>
<span class="c1"># we'll set the results to zero</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'AlgorithmExhaustedError encountered in '</span>
<span class="s1">'estimations: '</span> <span class="o">+</span> <span class="n">aee</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Halting AIS final conditional test and setting to not '</span>
<span class="s1">'significant.'</span><span class="p">)</span>
<span class="c1"># For now we don't need a stack trace:</span>
<span class="c1"># traceback.print_tb(aee.__traceback__)</span>
<span class="n">ais</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">s</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">p</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c1"># If a parallel estimator was used, an array of AIS estimates is</span>
<span class="c1"># returned. Make the output uniform for both estimator types.</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">ais</span><span class="p">)</span> <span class="ow">is</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">ais</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'AIS result is not a scalar.'</span>
<span class="n">ais</span> <span class="o">=</span> <span class="n">ais</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'local_values'</span><span class="p">]:</span>
<span class="n">replication_ind</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get_realisations</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selected_vars_sources</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">local_ais</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cmi_estimator_local</span><span class="o">.</span><span class="n">estimate</span><span class="p">(</span>
<span class="n">var1</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_current_value_realisations</span><span class="p">,</span>
<span class="n">var2</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_selected_vars_realisations</span><span class="p">,</span>
<span class="n">conditional</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ex</span><span class="o">.</span><span class="n">AlgorithmExhaustedError</span> <span class="k">as</span> <span class="n">aee</span><span class="p">:</span>
<span class="c1"># The algorithm cannot continue here, so</span>
<span class="c1"># we'll set the results to zero</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'AlgorithmExhaustedError encountered in '</span>
<span class="s1">'final local AIS estimations: '</span> <span class="o">+</span> <span class="n">aee</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Setting all local results to zero (but leaving'</span>
<span class="s1">' surrogate statistical test results)'</span><span class="p">)</span>
<span class="c1"># For now we don't need a stack trace:</span>
<span class="c1"># traceback.print_tb(aee.__traceback__)</span>
<span class="c1"># Return local AIS values of all zeros:</span>
<span class="c1"># (length gleaned from line below)</span>
<span class="n">local_ais</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span>
<span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">replication_ind</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="nb">sum</span><span class="p">(</span><span class="n">replication_ind</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span>
<span class="c1"># Reshape local AIS to a [replications x samples] matrix.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ais</span> <span class="o">=</span> <span class="n">local_ais</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
<span class="nb">max</span><span class="p">(</span><span class="n">replication_ind</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">sum</span><span class="p">(</span><span class="n">replication_ind</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ais</span> <span class="o">=</span> <span class="n">ais</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sign</span> <span class="o">=</span> <span class="n">s</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pvalue</span> <span class="o">=</span> <span class="n">p</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s1">'verbose'</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'no sources selected'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ais</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sign</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pvalue</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="k">def</span> <span class="nf">_force_conditionals</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cond</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="sd">"""Enforce a given conditioning set."""</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">cond</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">tuple</span><span class="p">:</span> <span class="c1"># easily add single variable</span>
<span class="n">cond</span> <span class="o">=</span> <span class="p">[</span><span class="n">cond</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Adding the following variables to the conditioning set: </span><span class="si">{0}</span><span class="s1">.'</span><span class="o">.</span>
<span class="nb">format</span><span class="p">(</span><span class="n">cond</span><span class="p">))</span>
<span class="n">cond_idx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lag_to_idx</span><span class="p">(</span><span class="n">cond</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_append_selected_vars</span><span class="p">(</span>
<span class="n">cond_idx</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">get_realisations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">current_value</span><span class="p">,</span> <span class="n">cond_idx</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">_reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""Reset instance after analysis."""</span>
<span class="bp">self</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">pvalue</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">ais</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cmi_estimator</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../index.html">IDTxl 1.5 documentation</a> »</li>
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li>
<li class="nav-item nav-item-this"><a href="">idtxl.active_information_storage</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
© Copyright 2018, Patricia Wollstadt, Joseph T. Lizier, Raul Vicente, Conor Finn, Mario Martinez-Zarzuela, Pedro Mediano, Leonardo Novelli, Michael Wibral.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.4.0.
</div>
</body>
</html>