dhavalkadia-fda commited on
Commit
128403f
·
verified ·
1 Parent(s): 61d4ba5

Upload 114 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +2 -0
  2. Dockerfile +27 -0
  3. LICENSE +121 -0
  4. README.rst +64 -0
  5. assets/AIM-CU-Overview.drawio.png +3 -0
  6. assets/AIM-CU-Overview.drawio.xml +0 -0
  7. assets/params.csv +9 -0
  8. config/config.toml +42 -0
  9. config/spec-60-60.csv +121 -0
  10. docs/Makefile +20 -0
  11. docs/README.rst +26 -0
  12. docs/build/doctrees/environment.pickle +3 -0
  13. docs/build/doctrees/index.doctree +0 -0
  14. docs/build/doctrees/ref_cusum.doctree +0 -0
  15. docs/build/doctrees/ref_method.doctree +0 -0
  16. docs/build/doctrees/ref_theoretical.doctree +0 -0
  17. docs/build/doctrees/ref_utils.doctree +0 -0
  18. docs/build/html/.buildinfo +4 -0
  19. docs/build/html/_sources/index.rst.txt +52 -0
  20. docs/build/html/_sources/ref_cusum.rst.txt +5 -0
  21. docs/build/html/_sources/ref_method.rst.txt +32 -0
  22. docs/build/html/_sources/ref_theoretical.rst.txt +5 -0
  23. docs/build/html/_sources/ref_utils.rst.txt +5 -0
  24. docs/build/html/_static/alabaster.css +663 -0
  25. docs/build/html/_static/basic.css +914 -0
  26. docs/build/html/_static/custom.css +1 -0
  27. docs/build/html/_static/doctools.js +149 -0
  28. docs/build/html/_static/documentation_options.js +13 -0
  29. docs/build/html/_static/file.png +0 -0
  30. docs/build/html/_static/github-banner.svg +5 -0
  31. docs/build/html/_static/language_data.js +192 -0
  32. docs/build/html/_static/minus.png +0 -0
  33. docs/build/html/_static/plus.png +0 -0
  34. docs/build/html/_static/pygments.css +84 -0
  35. docs/build/html/_static/searchtools.js +632 -0
  36. docs/build/html/_static/sphinx_highlight.js +154 -0
  37. docs/build/html/_static/tabs.css +89 -0
  38. docs/build/html/_static/tabs.js +145 -0
  39. docs/build/html/genindex.html +231 -0
  40. docs/build/html/index.html +173 -0
  41. docs/build/html/objects.inv +0 -0
  42. docs/build/html/py-modindex.html +143 -0
  43. docs/build/html/ref_cusum.html +252 -0
  44. docs/build/html/ref_method.html +179 -0
  45. docs/build/html/ref_theoretical.html +208 -0
  46. docs/build/html/ref_utils.html +180 -0
  47. docs/build/html/search.html +131 -0
  48. docs/build/html/searchindex.js +1 -0
  49. docs/build/latex/LICRcyr2utf8.xdy +101 -0
  50. docs/build/latex/LICRlatin2utf8.xdy +239 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ assets/AIM-CU-Overview.drawio.png filter=lfs diff=lfs merge=lfs -text
37
+ docs/build/latex/aim-cu.pdf filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM ubuntu:22.04
2
+
3
+ ENV DEBIAN_FRONTEND=noninteractive
4
+ RUN apt-get update && apt-get install -y software-properties-common dirmngr wget
5
+
6
+ RUN apt-get update && apt-get install -y python3 python3-distutils python3-dev
7
+ RUN wget https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py
8
+
9
+ RUN wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
10
+ RUN add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
11
+ RUN apt-get install -y --no-install-recommends r-base r-base-dev
12
+
13
+ # setup R configs
14
+ RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile
15
+ RUN Rscript -e "install.packages('ggplot2')"
16
+ RUN Rscript -e "install.packages('hexbin')"
17
+ RUN Rscript -e "install.packages('lazyeval')"
18
+ RUN Rscript -e "install.packages('cusumcharter')"
19
+ RUN Rscript -e "install.packages('RcppCNPy')"
20
+ RUN Rscript -e "install.packages('spc')"
21
+
22
+ WORKDIR /app/src/package
23
+ COPY . /app/
24
+
25
+ RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
26
+
27
+ CMD ["python3", "app.py"]
LICENSE ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Creative Commons Legal Code
2
+
3
+ CC0 1.0 Universal
4
+
5
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12
+ HEREUNDER.
13
+
14
+ Statement of Purpose
15
+
16
+ The laws of most jurisdictions throughout the world automatically confer
17
+ exclusive Copyright and Related Rights (defined below) upon the creator
18
+ and subsequent owner(s) (each and all, an "owner") of an original work of
19
+ authorship and/or a database (each, a "Work").
20
+
21
+ Certain owners wish to permanently relinquish those rights to a Work for
22
+ the purpose of contributing to a commons of creative, cultural and
23
+ scientific works ("Commons") that the public can reliably and without fear
24
+ of later claims of infringement build upon, modify, incorporate in other
25
+ works, reuse and redistribute as freely as possible in any form whatsoever
26
+ and for any purposes, including without limitation commercial purposes.
27
+ These owners may contribute to the Commons to promote the ideal of a free
28
+ culture and the further production of creative, cultural and scientific
29
+ works, or to gain reputation or greater distribution for their Work in
30
+ part through the use and efforts of others.
31
+
32
+ For these and/or other purposes and motivations, and without any
33
+ expectation of additional consideration or compensation, the person
34
+ associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35
+ is an owner of Copyright and Related Rights in the Work, voluntarily
36
+ elects to apply CC0 to the Work and publicly distribute the Work under its
37
+ terms, with knowledge of his or her Copyright and Related Rights in the
38
+ Work and the meaning and intended legal effect of CC0 on those rights.
39
+
40
+ 1. Copyright and Related Rights. A Work made available under CC0 may be
41
+ protected by copyright and related or neighboring rights ("Copyright and
42
+ Related Rights"). Copyright and Related Rights include, but are not
43
+ limited to, the following:
44
+
45
+ i. the right to reproduce, adapt, distribute, perform, display,
46
+ communicate, and translate a Work;
47
+ ii. moral rights retained by the original author(s) and/or performer(s);
48
+ iii. publicity and privacy rights pertaining to a person's image or
49
+ likeness depicted in a Work;
50
+ iv. rights protecting against unfair competition in regards to a Work,
51
+ subject to the limitations in paragraph 4(a), below;
52
+ v. rights protecting the extraction, dissemination, use and reuse of data
53
+ in a Work;
54
+ vi. database rights (such as those arising under Directive 96/9/EC of the
55
+ European Parliament and of the Council of 11 March 1996 on the legal
56
+ protection of databases, and under any national implementation
57
+ thereof, including any amended or successor version of such
58
+ directive); and
59
+ vii. other similar, equivalent or corresponding rights throughout the
60
+ world based on applicable law or treaty, and any national
61
+ implementations thereof.
62
+
63
+ 2. Waiver. To the greatest extent permitted by, but not in contravention
64
+ of, applicable law, Affirmer hereby overtly, fully, permanently,
65
+ irrevocably and unconditionally waives, abandons, and surrenders all of
66
+ Affirmer's Copyright and Related Rights and associated claims and causes
67
+ of action, whether now known or unknown (including existing as well as
68
+ future claims and causes of action), in the Work (i) in all territories
69
+ worldwide, (ii) for the maximum duration provided by applicable law or
70
+ treaty (including future time extensions), (iii) in any current or future
71
+ medium and for any number of copies, and (iv) for any purpose whatsoever,
72
+ including without limitation commercial, advertising or promotional
73
+ purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74
+ member of the public at large and to the detriment of Affirmer's heirs and
75
+ successors, fully intending that such Waiver shall not be subject to
76
+ revocation, rescission, cancellation, termination, or any other legal or
77
+ equitable action to disrupt the quiet enjoyment of the Work by the public
78
+ as contemplated by Affirmer's express Statement of Purpose.
79
+
80
+ 3. Public License Fallback. Should any part of the Waiver for any reason
81
+ be judged legally invalid or ineffective under applicable law, then the
82
+ Waiver shall be preserved to the maximum extent permitted taking into
83
+ account Affirmer's express Statement of Purpose. In addition, to the
84
+ extent the Waiver is so judged Affirmer hereby grants to each affected
85
+ person a royalty-free, non transferable, non sublicensable, non exclusive,
86
+ irrevocable and unconditional license to exercise Affirmer's Copyright and
87
+ Related Rights in the Work (i) in all territories worldwide, (ii) for the
88
+ maximum duration provided by applicable law or treaty (including future
89
+ time extensions), (iii) in any current or future medium and for any number
90
+ of copies, and (iv) for any purpose whatsoever, including without
91
+ limitation commercial, advertising or promotional purposes (the
92
+ "License"). The License shall be deemed effective as of the date CC0 was
93
+ applied by Affirmer to the Work. Should any part of the License for any
94
+ reason be judged legally invalid or ineffective under applicable law, such
95
+ partial invalidity or ineffectiveness shall not invalidate the remainder
96
+ of the License, and in such case Affirmer hereby affirms that he or she
97
+ will not (i) exercise any of his or her remaining Copyright and Related
98
+ Rights in the Work or (ii) assert any associated claims and causes of
99
+ action with respect to the Work, in either case contrary to Affirmer's
100
+ express Statement of Purpose.
101
+
102
+ 4. Limitations and Disclaimers.
103
+
104
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
105
+ surrendered, licensed or otherwise affected by this document.
106
+ b. Affirmer offers the Work as-is and makes no representations or
107
+ warranties of any kind concerning the Work, express, implied,
108
+ statutory or otherwise, including without limitation warranties of
109
+ title, merchantability, fitness for a particular purpose, non
110
+ infringement, or the absence of latent or other defects, accuracy, or
111
+ the present or absence of errors, whether or not discoverable, all to
112
+ the greatest extent permissible under applicable law.
113
+ c. Affirmer disclaims responsibility for clearing rights of other persons
114
+ that may apply to the Work or any use thereof, including without
115
+ limitation any person's Copyright and Related Rights in the Work.
116
+ Further, Affirmer disclaims responsibility for obtaining any necessary
117
+ consents, permissions or other rights required for any use of the
118
+ Work.
119
+ d. Affirmer understands and acknowledges that Creative Commons is not a
120
+ party to this document and has no duty or obligation with respect to
121
+ this CC0 or use of the Work.
README.rst ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ AIM-CU : A CUSUM-based tool for AI Monitoring
2
+ ======
3
+
4
+ .. image:: assets/AIM-CU-Overview.drawio.png
5
+ :width: 800
6
+ :align: center
7
+ :alt: AIM-CU flowchart
8
+
9
+ Monitoring a clinically deployed AI device to detect performance drift is an essential step to
10
+ ensure the safety and effectiveness of AI.
11
+
12
+ AIM-CU is a statistical tool for AI monitoring using cumulative sum (AIM-CU).
13
+ AIM-CU computes:
14
+
15
+ * The parameter choices for change-point detection based on an acceptable false alarm rate
16
+ * Detection delay estimates for a given displacement of the performance metric from the target for those parameter choices.
17
+
18
+ Code execution
19
+ --------------
20
+ Clone AIM-CU repository.
21
+
22
+ .. code-block:: shell
23
+
24
+ git clone https://github.com/DIDSR/AIM-CU.git
25
+
26
+ Run the following commands to install required dependencies (Python = 3.10 is used).
27
+
28
+ .. code-block:: shell
29
+
30
+ apt-get -y install python3
31
+ apt-get -y install pip
32
+ cd AIM-CU
33
+ pip install -r requirements.txt
34
+
35
+ Run AIM-CU.
36
+
37
+ .. code-block:: shell
38
+
39
+ python3 app.py
40
+
41
+ Open the URL http://0.0.0.0:7860 that is running the AIM-CU locally.
42
+
43
+ Example code execution
44
+ ----------------------
45
+ Example code can be run in a Jupyter Notebook after opening it with ``jupyter notebook`` command from ``/src/package`` directory.
46
+
47
+ Demo
48
+ ----
49
+ AIM-CU can also be run through the demo available at https://huggingface.co/spaces/didsr/AIM-CU. If Space is paused, click on Restart button.
50
+
51
+ Related References
52
+ ------------------
53
+ * Smriti Prathapan, Ravi K. Samala, Nathan Hadjiyski, Pierre‑François D’Haese, Nicholas Petrick, Jana Delfino, Fabien Maldonado, Brandon Nelson, Ghada Zamzmi, Phuong Nguyen, Yelena Yesha, and Berkman Sahiner, "Detecting performance drift in AI models for medical image analysis using CUSUM chart" (Journal Draft in-progress 2025)
54
+
55
+ * Prathapan, S., Sahiner, B., Kadia, D., and Samala, R.K. 2025, AIM-CU: A statistical tool for AI Monitoring. In Medical Imaging 2025: Computer-Aided Diagnosis. SPIE. (Accepted)
56
+
57
+ * Prathapan, S., Samala, R.K., Hadjiyski, N., D’Haese, P.F., Maldonado, F., Nguyen, P., Yesha, Y. and Sahiner, B., 2024, April. Quantifying input data drift in medical machine learning models by detecting change-points in time-series data. In Medical Imaging 2024: Computer-Aided Diagnosis (Vol. 12927, pp. 67-76). SPIE. https://doi.org/10.1117/12.3008771
58
+
59
+ * Smriti Prathapan, Ravi K. Samala, Nathan Hadjiyski, Pierre‑François D’Haese, Nicholas Petrick, Jana Delfino, Fabien Maldonado, Brandon Nelson, Ghada Zamzmi, Phuong Nguyen, Yelena Yesha, and Berkman Sahiner, "Post-market Monitoring of AI-enabled Medical Devices for Radiology and Healthcare Applications" (FDA-UMiami Collaboration Poster, September 2023)
60
+
61
+
62
+ Disclaimer
63
+ ----------
64
+ This software and documentation was developed at the Food and Drug Administration (FDA) by employees of the Federal Government in the course of their official duties. Pursuant to Title 17, Section 105 of the United States Code, this work is not subject to copyright protection and is in the public domain. Permission is hereby granted, free of charge, to any person obtaining a copy of the Software, to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, or sell copies of the Software or derivatives, and to permit persons to whom the Software is furnished to do so. FDA assumes no responsibility whatsoever for use by other parties of the Software, its source code, documentation or compiled executables, and makes no guarantees, expressed or implied, about its quality, reliability, or any other characteristic. Further, use of this code in no way implies endorsement by the FDA or confers any advantage in regulatory decisions. Although this software can be redistributed and/or modified freely, we ask that any derivative works bear some notice that they are derived from it, and any modified versions bear some notice that they have been modified.
assets/AIM-CU-Overview.drawio.png ADDED

Git LFS Details

  • SHA256: 9a833bf26041308d91f66125c1f05c13280e86f1822d0d23a4148a127fc43599
  • Pointer size: 131 Bytes
  • Size of remote file: 377 kB
assets/AIM-CU-Overview.drawio.xml ADDED
The diff for this file is too large to render. See raw diff
 
assets/params.csv ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ Parameter,Description
2
+ μ_in,"The mean of the performance metric when the process is in-control, i.e., when there is no performance drift"
3
+ ARL_0,Number of observations before the control chart signals a false detection
4
+ σ_in,The in-control standard deviation of the metric
5
+ ARL_1,Number of observations before the control chart signals a true detection
6
+ k,"The normalized reference value, which is related to the magnitude of change that one is interested in detecting. k = 0.5 is the default choice for detecting a unit standard deviation change"
7
+ S_hi,Cumulative sum of positive changes in the metric
8
+ h,The normalized threshold or control limit (default =4). This threshold determines when the control chart signals a detection
9
+ S_lo,Cumulative sum of negative changes in the metric
config/config.toml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # paths to input files
2
+ [path_input]
3
+ path_df_metric = "config/spec-60-60.csv"
4
+
5
+ # paths to output files
6
+ [path_output]
7
+ path_figure = "figure/"
8
+
9
+ # primary colors
10
+ [color]
11
+ blue_005 = "#F3F9FC"
12
+ blue_020 = "#D0E4F0"
13
+ blue_040 = "#A3CAE1"
14
+ blue_060 = "#77B0D2"
15
+ blue_080 = "#4F96C4"
16
+ blue_100 = "#007CBA"
17
+
18
+ # controls
19
+ [control]
20
+ save_figure = "false"
21
+
22
+ # CUSUM parameters
23
+ [params_cusum]
24
+ list_ARL_0 = [50, 100, 150, 200, 300, 400, 500, 1000]
25
+ shift_in_mean = [
26
+ 0.1,
27
+ 0.2,
28
+ 0.3,
29
+ 0.4,
30
+ 0.5,
31
+ 0.6,
32
+ 0.7,
33
+ 0.8,
34
+ 0.9,
35
+ 1.0,
36
+ 1.1,
37
+ 1.2,
38
+ 1.3,
39
+ 1.4,
40
+ 1.5,
41
+ 1.6,
42
+ ]
config/spec-60-60.csv ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ x,y
2
+ 0,0.8426395939086294
3
+ 1,0.8913043478260869
4
+ 2,0.8826530612244898
5
+ 3,0.8308457711442786
6
+ 4,0.7679558011049724
7
+ 5,0.8444444444444444
8
+ 6,0.8306878306878307
9
+ 7,0.8308457711442786
10
+ 8,0.8936170212765957
11
+ 9,0.8138297872340425
12
+ 10,0.7747252747252747
13
+ 11,0.8052631578947368
14
+ 12,0.8090452261306532
15
+ 13,0.8317757009345794
16
+ 14,0.8958333333333334
17
+ 15,0.8306878306878307
18
+ 16,0.8556701030927835
19
+ 17,0.8387096774193549
20
+ 18,0.7894736842105263
21
+ 19,0.8563829787234043
22
+ 20,0.8186813186813187
23
+ 21,0.8306878306878307
24
+ 22,0.7918781725888325
25
+ 23,0.8823529411764706
26
+ 24,0.8737373737373737
27
+ 25,0.8666666666666667
28
+ 26,0.8518518518518519
29
+ 27,0.8659217877094972
30
+ 28,0.8232044198895028
31
+ 29,0.8764044943820225
32
+ 30,0.8167539267015707
33
+ 31,0.8478260869565217
34
+ 32,0.8363636363636363
35
+ 33,0.797752808988764
36
+ 34,0.8309859154929577
37
+ 35,0.875
38
+ 36,0.8
39
+ 37,0.8608247422680413
40
+ 38,0.8288770053475936
41
+ 39,0.8556149732620321
42
+ 40,0.8153846153846154
43
+ 41,0.859375
44
+ 42,0.8324607329842932
45
+ 43,0.9043062200956937
46
+ 44,0.8279569892473119
47
+ 45,0.8197674418604651
48
+ 46,0.7795698924731183
49
+ 47,0.8135593220338984
50
+ 48,0.8481675392670157
51
+ 49,0.8134715025906736
52
+ 50,0.7864583333333334
53
+ 51,0.8548387096774194
54
+ 52,0.8370786516853933
55
+ 53,0.7157360406091371
56
+ 54,0.8324607329842932
57
+ 55,0.8296703296703297
58
+ 56,0.8844221105527639
59
+ 57,0.7884615384615384
60
+ 58,0.935
61
+ 59,0.8840579710144928
62
+ 60,0.75
63
+ 61,0.8324607329842932
64
+ 62,0.7939698492462312
65
+ 63,0.7272727272727273
66
+ 64,0.8284313725490197
67
+ 65,0.7692307692307693
68
+ 66,0.8010204081632653
69
+ 67,0.8235294117647058
70
+ 68,0.7277486910994765
71
+ 69,0.775
72
+ 70,0.8361581920903954
73
+ 71,0.7959183673469388
74
+ 72,0.8489583333333334
75
+ 73,0.8465346534653465
76
+ 74,0.812807881773399
77
+ 75,0.7475247524752475
78
+ 76,0.8491620111731844
79
+ 77,0.6989247311827957
80
+ 78,0.7967914438502673
81
+ 79,0.7236180904522613
82
+ 80,0.746031746031746
83
+ 81,0.7371428571428571
84
+ 82,0.7839195979899497
85
+ 83,0.7921348314606742
86
+ 84,0.8258706467661692
87
+ 85,0.8121827411167513
88
+ 86,0.8258426966292135
89
+ 87,0.7675675675675676
90
+ 88,0.6666666666666666
91
+ 89,0.7872340425531915
92
+ 90,0.8325123152709359
93
+ 91,0.8247422680412371
94
+ 92,0.7619047619047619
95
+ 93,0.7967032967032966
96
+ 94,0.867816091954023
97
+ 95,0.8010471204188482
98
+ 96,0.625
99
+ 97,0.7684210526315789
100
+ 98,0.7409326424870466
101
+ 99,0.7593582887700535
102
+ 100,0.8041237113402062
103
+ 101,0.8160919540229885
104
+ 102,0.803030303030303
105
+ 103,0.6898395721925134
106
+ 104,0.7037037037037037
107
+ 105,0.8219895287958116
108
+ 106,0.8153846153846154
109
+ 107,0.712707182320442
110
+ 108,0.7548076923076923
111
+ 109,0.8258426966292135
112
+ 110,0.8
113
+ 111,0.7444444444444445
114
+ 112,0.7604166666666666
115
+ 113,0.7446808510638298
116
+ 114,0.7845303867403315
117
+ 115,0.7616279069767442
118
+ 116,0.7525773195876289
119
+ 117,0.7213930348258707
120
+ 118,0.8222222222222222
121
+ 119,0.817258883248731
docs/Makefile ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Minimal makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line, and also
5
+ # from the environment for the first two.
6
+ SPHINXOPTS ?=
7
+ SPHINXBUILD ?= sphinx-build
8
+ SOURCEDIR = source
9
+ BUILDDIR = build
10
+
11
+ # Put it first so that "make" without argument is like "make help".
12
+ help:
13
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
+
15
+ .PHONY: help Makefile
16
+
17
+ # Catch-all target: route all unknown targets to Sphinx using the new
18
+ # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19
+ %: Makefile
20
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
docs/README.rst ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Documentation
2
+ =============
3
+
4
+ Read the documentation
5
+ ----------------------
6
+ Access the documentation from `index.html <build/html/index.html>`_
7
+
8
+ Generate Sphinx documentation
9
+ -----------------------------
10
+ Run the below command from ``/src/package``.
11
+
12
+ HTML format:
13
+
14
+ .. code-block:: shell
15
+
16
+ sphinx-build -M html ../../docs/source ../../docs/build --fail-on-warning
17
+
18
+ As a PDF file:
19
+
20
+ Required: Install latex - ``sudo apt-get install texlive-full``
21
+
22
+ .. code-block:: shell
23
+
24
+ sphinx-build -M latexpdf ../../docs/source ../../docs/build --fail-on-warning
25
+
26
+ Access it from `aim-cu.pdf <build/latex/aim-cu.pdf>`_
docs/build/doctrees/environment.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:73a5f70cee490be573c5c2a1614594bb93b5aa232863c9f4004a876906fc4d13
3
+ size 34605
docs/build/doctrees/index.doctree ADDED
Binary file (7.51 kB). View file
 
docs/build/doctrees/ref_cusum.doctree ADDED
Binary file (46.1 kB). View file
 
docs/build/doctrees/ref_method.doctree ADDED
Binary file (12.2 kB). View file
 
docs/build/doctrees/ref_theoretical.doctree ADDED
Binary file (31.6 kB). View file
 
docs/build/doctrees/ref_utils.doctree ADDED
Binary file (20.2 kB). View file
 
docs/build/html/.buildinfo ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ # Sphinx build info version 1
2
+ # This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
3
+ config: d98e84fc2d439aaf1e5c362e015e369c
4
+ tags: 645f666f9bcd5a90fca523b33c5a78b7
docs/build/html/_sources/index.rst.txt ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .. AIM-CU documentation master file, created by
2
+ sphinx-quickstart on Wed Nov 27 09:59:49 2024.
3
+ You can adapt this file completely to your liking, but it should at least
4
+ contain the root `toctree` directive.
5
+
6
+ AIM-CU documentation
7
+ ====================
8
+
9
+ A CUSUM-based tool for AI Monitoring
10
+
11
+ AIM-CU is a statistical tool for AI monitoring using cumulative sum (AIM-CU). AIM-CU computes:
12
+
13
+ * The parameter choices for change-point detection based on an acceptable false alarm rate
14
+ * Detection delay estimates for a given displacement of the performance metric from the target for those parameter choices.
15
+
16
+ Code execution
17
+ ------------------
18
+ Clone AIM-CU repository.
19
+
20
+ .. code-block:: shell
21
+
22
+ git clone https://github.com/DIDSR/AIM-CU.git
23
+
24
+ Run the following commands to install required dependencies (Python = 3.10 is used).
25
+
26
+ .. code-block:: shell
27
+
28
+ apt-get -y install python3
29
+ apt-get -y install pip
30
+ cd AIM-CU
31
+ pip install -r requirements.txt
32
+
33
+ Run AIM-CU.
34
+
35
+ .. code-block:: shell
36
+
37
+ python3 app.py
38
+
39
+ Open the URL http://0.0.0.0:7860 that is running the AIM-CU locally.
40
+
41
+ Demo
42
+ ------------------
43
+ AIM-CU can also be run through the demo available at https://huggingface.co/spaces/didsr/AIM-CU. If Space is paused, click on Restart button.
44
+
45
+ .. toctree::
46
+ :maxdepth: 2
47
+ :caption: Contents:
48
+
49
+ ref_method
50
+ ref_cusum
51
+ ref_theoretical
52
+ ref_utils
docs/build/html/_sources/ref_cusum.rst.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ CUSUM
2
+ =====
3
+
4
+ .. automodule:: package.cusum
5
+ :members:
docs/build/html/_sources/ref_method.rst.txt ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Methods
2
+ =======
3
+
4
+ CUSUM parameters
5
+ ----------------
6
+
7
+ .. csv-table:: CUSUM parameters
8
+ :file: ../../assets/params.csv
9
+ :header-rows: 1
10
+
11
+ CUSUM chart
12
+ -----------
13
+
14
+ A two-sided CUSUM control chart computes the cumulative differences or
15
+ deviations of individual observations from the target mean (or
16
+ in-control mean, :math:`\mu_{in}`). The positive and negative cumulative
17
+ sums are calculated:
18
+
19
+ .. math::
20
+
21
+ \\ S_{hi}(d) = max(0, S_{hi}(d-1) + x_d - \hat{\mu}_{in} - K)
22
+ \\ S_{lo}(d) = max(0, S_{lo}(d-1) - x_d + \hat{\mu}_{in} - K)
23
+
24
+ where *d* denotes a unit of time, :math:`x_d` is the value of quantity
25
+ being monitored at time :math:`d`, :math:`\hat{\mu}_{in}` is the
26
+ in-control mean of :math:`x_d`, and :math:`K` is a "reference value"
27
+ related to the magnitude of change that one is interested in detecting.
28
+ :math:`S_{hi}` and :math:`S_{lo}` are the cumulative sum of positive and
29
+ negative changes. To detect a change in the observed values from the
30
+ in-control mean, the CUSUM scheme accumulates deviations that are
31
+ :math:`K` units away from the in-control mean. Let :math:`\sigma_{in}`
32
+ denote the in-control standard deviation of :math:`x_d`.
docs/build/html/_sources/ref_theoretical.rst.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ ARLTheoretical
2
+ ==============
3
+
4
+ .. automodule:: package.ARLTheoretical
5
+ :members:
docs/build/html/_sources/ref_utils.rst.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Utils
2
+ =====
3
+
4
+ .. automodule:: package.utils
5
+ :members:
docs/build/html/_static/alabaster.css ADDED
@@ -0,0 +1,663 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* -- page layout ----------------------------------------------------------- */
2
+
3
+ body {
4
+ font-family: Georgia, serif;
5
+ font-size: 17px;
6
+ background-color: #fff;
7
+ color: #000;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+
12
+
13
+ div.document {
14
+ width: 1200px;
15
+ margin: 30px auto 0 auto;
16
+ }
17
+
18
+ div.documentwrapper {
19
+ float: left;
20
+ width: 100%;
21
+ }
22
+
23
+ div.bodywrapper {
24
+ margin: 0 0 0 300px;
25
+ }
26
+
27
+ div.sphinxsidebar {
28
+ width: 300px;
29
+ font-size: 14px;
30
+ line-height: 1.5;
31
+ }
32
+
33
+ hr {
34
+ border: 1px solid #B1B4B6;
35
+ }
36
+
37
+ div.body {
38
+ background-color: #fff;
39
+ color: #3E4349;
40
+ padding: 0 30px 0 30px;
41
+ }
42
+
43
+ div.body > .section {
44
+ text-align: left;
45
+ }
46
+
47
+ div.footer {
48
+ width: 1200px;
49
+ margin: 20px auto 30px auto;
50
+ font-size: 14px;
51
+ color: #888;
52
+ text-align: right;
53
+ }
54
+
55
+ div.footer a {
56
+ color: #888;
57
+ }
58
+
59
+ p.caption {
60
+ font-family: inherit;
61
+ font-size: inherit;
62
+ }
63
+
64
+
65
+ div.relations {
66
+ display: none;
67
+ }
68
+
69
+
70
+ div.sphinxsidebar {
71
+ max-height: 100%;
72
+ overflow-y: auto;
73
+ }
74
+
75
+ div.sphinxsidebar a {
76
+ color: #444;
77
+ text-decoration: none;
78
+ border-bottom: 1px dotted #999;
79
+ }
80
+
81
+ div.sphinxsidebar a:hover {
82
+ border-bottom: 1px solid #999;
83
+ }
84
+
85
+ div.sphinxsidebarwrapper {
86
+ padding: 18px 10px;
87
+ }
88
+
89
+ div.sphinxsidebarwrapper p.logo {
90
+ padding: 0;
91
+ margin: -10px 0 0 0px;
92
+ text-align: center;
93
+ }
94
+
95
+ div.sphinxsidebarwrapper h1.logo {
96
+ margin-top: -10px;
97
+ text-align: center;
98
+ margin-bottom: 5px;
99
+ text-align: left;
100
+ }
101
+
102
+ div.sphinxsidebarwrapper h1.logo-name {
103
+ margin-top: 0px;
104
+ }
105
+
106
+ div.sphinxsidebarwrapper p.blurb {
107
+ margin-top: 0;
108
+ font-style: normal;
109
+ }
110
+
111
+ div.sphinxsidebar h3,
112
+ div.sphinxsidebar h4 {
113
+ font-family: Georgia, serif;
114
+ color: #444;
115
+ font-size: 24px;
116
+ font-weight: normal;
117
+ margin: 0 0 5px 0;
118
+ padding: 0;
119
+ }
120
+
121
+ div.sphinxsidebar h4 {
122
+ font-size: 20px;
123
+ }
124
+
125
+ div.sphinxsidebar h3 a {
126
+ color: #444;
127
+ }
128
+
129
+ div.sphinxsidebar p.logo a,
130
+ div.sphinxsidebar h3 a,
131
+ div.sphinxsidebar p.logo a:hover,
132
+ div.sphinxsidebar h3 a:hover {
133
+ border: none;
134
+ }
135
+
136
+ div.sphinxsidebar p {
137
+ color: #555;
138
+ margin: 10px 0;
139
+ }
140
+
141
+ div.sphinxsidebar ul {
142
+ margin: 10px 0;
143
+ padding: 0;
144
+ color: #000;
145
+ }
146
+
147
+ div.sphinxsidebar ul li.toctree-l1 > a {
148
+ font-size: 120%;
149
+ }
150
+
151
+ div.sphinxsidebar ul li.toctree-l2 > a {
152
+ font-size: 110%;
153
+ }
154
+
155
+ div.sphinxsidebar input {
156
+ border: 1px solid #CCC;
157
+ font-family: Georgia, serif;
158
+ font-size: 1em;
159
+ }
160
+
161
+ div.sphinxsidebar #searchbox {
162
+ margin: 1em 0;
163
+ }
164
+
165
+ div.sphinxsidebar .search > div {
166
+ display: table-cell;
167
+ }
168
+
169
+ div.sphinxsidebar hr {
170
+ border: none;
171
+ height: 1px;
172
+ color: #AAA;
173
+ background: #AAA;
174
+
175
+ text-align: left;
176
+ margin-left: 0;
177
+ width: 50%;
178
+ }
179
+
180
+ div.sphinxsidebar .badge {
181
+ border-bottom: none;
182
+ }
183
+
184
+ div.sphinxsidebar .badge:hover {
185
+ border-bottom: none;
186
+ }
187
+
188
+ /* To address an issue with donation coming after search */
189
+ div.sphinxsidebar h3.donation {
190
+ margin-top: 10px;
191
+ }
192
+
193
+ /* -- body styles ----------------------------------------------------------- */
194
+
195
+ a {
196
+ color: #004B6B;
197
+ text-decoration: underline;
198
+ }
199
+
200
+ a:hover {
201
+ color: #6D4100;
202
+ text-decoration: underline;
203
+ }
204
+
205
+ div.body h1,
206
+ div.body h2,
207
+ div.body h3,
208
+ div.body h4,
209
+ div.body h5,
210
+ div.body h6 {
211
+ font-family: Georgia, serif;
212
+ font-weight: normal;
213
+ margin: 30px 0px 10px 0px;
214
+ padding: 0;
215
+ }
216
+
217
+ div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
218
+ div.body h2 { font-size: 180%; }
219
+ div.body h3 { font-size: 150%; }
220
+ div.body h4 { font-size: 130%; }
221
+ div.body h5 { font-size: 100%; }
222
+ div.body h6 { font-size: 100%; }
223
+
224
+ a.headerlink {
225
+ color: #DDD;
226
+ padding: 0 4px;
227
+ text-decoration: none;
228
+ }
229
+
230
+ a.headerlink:hover {
231
+ color: #444;
232
+ background: #EAEAEA;
233
+ }
234
+
235
+ div.body p, div.body dd, div.body li {
236
+ line-height: 1.4em;
237
+ }
238
+
239
+ div.admonition {
240
+ margin: 20px 0px;
241
+ padding: 10px 30px;
242
+ background-color: #EEE;
243
+ border: 1px solid #CCC;
244
+ }
245
+
246
+ div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
247
+ background-color: #FBFBFB;
248
+ border-bottom: 1px solid #fafafa;
249
+ }
250
+
251
+ div.admonition p.admonition-title {
252
+ font-family: Georgia, serif;
253
+ font-weight: normal;
254
+ font-size: 24px;
255
+ margin: 0 0 10px 0;
256
+ padding: 0;
257
+ line-height: 1;
258
+ }
259
+
260
+ div.admonition p.last {
261
+ margin-bottom: 0;
262
+ }
263
+
264
+ dt:target, .highlight {
265
+ background: #FAF3E8;
266
+ }
267
+
268
+ div.warning {
269
+ background-color: #FCC;
270
+ border: 1px solid #FAA;
271
+ }
272
+
273
+ div.danger {
274
+ background-color: #FCC;
275
+ border: 1px solid #FAA;
276
+ -moz-box-shadow: 2px 2px 4px #D52C2C;
277
+ -webkit-box-shadow: 2px 2px 4px #D52C2C;
278
+ box-shadow: 2px 2px 4px #D52C2C;
279
+ }
280
+
281
+ div.error {
282
+ background-color: #FCC;
283
+ border: 1px solid #FAA;
284
+ -moz-box-shadow: 2px 2px 4px #D52C2C;
285
+ -webkit-box-shadow: 2px 2px 4px #D52C2C;
286
+ box-shadow: 2px 2px 4px #D52C2C;
287
+ }
288
+
289
+ div.caution {
290
+ background-color: #FCC;
291
+ border: 1px solid #FAA;
292
+ }
293
+
294
+ div.attention {
295
+ background-color: #FCC;
296
+ border: 1px solid #FAA;
297
+ }
298
+
299
+ div.important {
300
+ background-color: #EEE;
301
+ border: 1px solid #CCC;
302
+ }
303
+
304
+ div.note {
305
+ background-color: #EEE;
306
+ border: 1px solid #CCC;
307
+ }
308
+
309
+ div.tip {
310
+ background-color: #EEE;
311
+ border: 1px solid #CCC;
312
+ }
313
+
314
+ div.hint {
315
+ background-color: #EEE;
316
+ border: 1px solid #CCC;
317
+ }
318
+
319
+ div.seealso {
320
+ background-color: #EEE;
321
+ border: 1px solid #CCC;
322
+ }
323
+
324
+ div.topic {
325
+ background-color: #EEE;
326
+ }
327
+
328
+ p.admonition-title {
329
+ display: inline;
330
+ }
331
+
332
+ p.admonition-title:after {
333
+ content: ":";
334
+ }
335
+
336
+ pre, tt, code {
337
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
338
+ font-size: 0.9em;
339
+ }
340
+
341
+ .hll {
342
+ background-color: #FFC;
343
+ margin: 0 -12px;
344
+ padding: 0 12px;
345
+ display: block;
346
+ }
347
+
348
+ img.screenshot {
349
+ }
350
+
351
+ tt.descname, tt.descclassname, code.descname, code.descclassname {
352
+ font-size: 0.95em;
353
+ }
354
+
355
+ tt.descname, code.descname {
356
+ padding-right: 0.08em;
357
+ }
358
+
359
+ img.screenshot {
360
+ -moz-box-shadow: 2px 2px 4px #EEE;
361
+ -webkit-box-shadow: 2px 2px 4px #EEE;
362
+ box-shadow: 2px 2px 4px #EEE;
363
+ }
364
+
365
+ table.docutils {
366
+ border: 1px solid #888;
367
+ -moz-box-shadow: 2px 2px 4px #EEE;
368
+ -webkit-box-shadow: 2px 2px 4px #EEE;
369
+ box-shadow: 2px 2px 4px #EEE;
370
+ }
371
+
372
+ table.docutils td, table.docutils th {
373
+ border: 1px solid #888;
374
+ padding: 0.25em 0.7em;
375
+ }
376
+
377
+ table.field-list, table.footnote {
378
+ border: none;
379
+ -moz-box-shadow: none;
380
+ -webkit-box-shadow: none;
381
+ box-shadow: none;
382
+ }
383
+
384
+ table.footnote {
385
+ margin: 15px 0;
386
+ width: 100%;
387
+ border: 1px solid #EEE;
388
+ background: #FDFDFD;
389
+ font-size: 0.9em;
390
+ }
391
+
392
+ table.footnote + table.footnote {
393
+ margin-top: -15px;
394
+ border-top: none;
395
+ }
396
+
397
+ table.field-list th {
398
+ padding: 0 0.8em 0 0;
399
+ }
400
+
401
+ table.field-list td {
402
+ padding: 0;
403
+ }
404
+
405
+ table.field-list p {
406
+ margin-bottom: 0.8em;
407
+ }
408
+
409
+ /* Cloned from
410
+ * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
411
+ */
412
+ .field-name {
413
+ -moz-hyphens: manual;
414
+ -ms-hyphens: manual;
415
+ -webkit-hyphens: manual;
416
+ hyphens: manual;
417
+ }
418
+
419
+ table.footnote td.label {
420
+ width: .1px;
421
+ padding: 0.3em 0 0.3em 0.5em;
422
+ }
423
+
424
+ table.footnote td {
425
+ padding: 0.3em 0.5em;
426
+ }
427
+
428
+ dl {
429
+ margin-left: 0;
430
+ margin-right: 0;
431
+ margin-top: 0;
432
+ padding: 0;
433
+ }
434
+
435
+ dl dd {
436
+ margin-left: 30px;
437
+ }
438
+
439
+ blockquote {
440
+ margin: 0 0 0 30px;
441
+ padding: 0;
442
+ }
443
+
444
+ ul, ol {
445
+ /* Matches the 30px from the narrow-screen "li > ul" selector below */
446
+ margin: 10px 0 10px 30px;
447
+ padding: 0;
448
+ }
449
+
450
+ pre {
451
+ background: unset;
452
+ padding: 7px 30px;
453
+ margin: 15px 0px;
454
+ line-height: 1.3em;
455
+ }
456
+
457
+ div.viewcode-block:target {
458
+ background: #ffd;
459
+ }
460
+
461
+ dl pre, blockquote pre, li pre {
462
+ margin-left: 0;
463
+ padding-left: 30px;
464
+ }
465
+
466
+ tt, code {
467
+ background-color: #ecf0f3;
468
+ color: #222;
469
+ /* padding: 1px 2px; */
470
+ }
471
+
472
+ tt.xref, code.xref, a tt {
473
+ background-color: #FBFBFB;
474
+ border-bottom: 1px solid #fff;
475
+ }
476
+
477
+ a.reference {
478
+ text-decoration: none;
479
+ border-bottom: 1px dotted #004B6B;
480
+ }
481
+
482
+ a.reference:hover {
483
+ border-bottom: 1px solid #6D4100;
484
+ }
485
+
486
+ /* Don't put an underline on images */
487
+ a.image-reference, a.image-reference:hover {
488
+ border-bottom: none;
489
+ }
490
+
491
+ a.footnote-reference {
492
+ text-decoration: none;
493
+ font-size: 0.7em;
494
+ vertical-align: top;
495
+ border-bottom: 1px dotted #004B6B;
496
+ }
497
+
498
+ a.footnote-reference:hover {
499
+ border-bottom: 1px solid #6D4100;
500
+ }
501
+
502
+ a:hover tt, a:hover code {
503
+ background: #EEE;
504
+ }
505
+
506
+ @media screen and (max-width: 1200px) {
507
+
508
+ body {
509
+ margin: 0;
510
+ padding: 20px 30px;
511
+ }
512
+
513
+ div.documentwrapper {
514
+ float: none;
515
+ background: #fff;
516
+ margin-left: 0;
517
+ margin-top: 0;
518
+ margin-right: 0;
519
+ margin-bottom: 0;
520
+ }
521
+
522
+ div.sphinxsidebar {
523
+ display: block;
524
+ float: none;
525
+ width: unset;
526
+ margin: 50px -30px -20px -30px;
527
+ padding: 10px 20px;
528
+ background: #333;
529
+ color: #FFF;
530
+ }
531
+
532
+ div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
533
+ div.sphinxsidebar h3 a {
534
+ color: #fff;
535
+ }
536
+
537
+ div.sphinxsidebar a {
538
+ color: #AAA;
539
+ }
540
+
541
+ div.sphinxsidebar p.logo {
542
+ display: none;
543
+ }
544
+
545
+ div.document {
546
+ width: 100%;
547
+ margin: 0;
548
+ }
549
+
550
+ div.footer {
551
+ display: none;
552
+ }
553
+
554
+ div.bodywrapper {
555
+ margin: 0;
556
+ }
557
+
558
+ div.body {
559
+ min-height: 0;
560
+ min-width: auto; /* fixes width on small screens, breaks .hll */
561
+ padding: 0;
562
+ }
563
+
564
+ .hll {
565
+ /* "fixes" the breakage */
566
+ width: max-content;
567
+ }
568
+
569
+ .rtd_doc_footer {
570
+ display: none;
571
+ }
572
+
573
+ .document {
574
+ width: auto;
575
+ }
576
+
577
+ .footer {
578
+ width: auto;
579
+ }
580
+
581
+ .github {
582
+ display: none;
583
+ }
584
+
585
+ ul {
586
+ margin-left: 0;
587
+ }
588
+
589
+ li > ul {
590
+ /* Matches the 30px from the "ul, ol" selector above */
591
+ margin-left: 30px;
592
+ }
593
+ }
594
+
595
+
596
+ /* misc. */
597
+
598
+ .revsys-inline {
599
+ display: none!important;
600
+ }
601
+
602
+ /* Hide ugly table cell borders in ..bibliography:: directive output */
603
+ table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
604
+ border: none;
605
+ /* Below needed in some edge cases; if not applied, bottom shadows appear */
606
+ -moz-box-shadow: none;
607
+ -webkit-box-shadow: none;
608
+ box-shadow: none;
609
+ }
610
+
611
+
612
+ /* relbar */
613
+
614
+ .related {
615
+ line-height: 30px;
616
+ width: 100%;
617
+ font-size: 0.9rem;
618
+ }
619
+
620
+ .related.top {
621
+ border-bottom: 1px solid #EEE;
622
+ margin-bottom: 20px;
623
+ }
624
+
625
+ .related.bottom {
626
+ border-top: 1px solid #EEE;
627
+ }
628
+
629
+ .related ul {
630
+ padding: 0;
631
+ margin: 0;
632
+ list-style: none;
633
+ }
634
+
635
+ .related li {
636
+ display: inline;
637
+ }
638
+
639
+ nav#rellinks {
640
+ float: right;
641
+ }
642
+
643
+ nav#rellinks li+li:before {
644
+ content: "|";
645
+ }
646
+
647
+ nav#breadcrumbs li+li:before {
648
+ content: "\00BB";
649
+ }
650
+
651
+ /* Hide certain items when printing */
652
+ @media print {
653
+ div.related {
654
+ display: none;
655
+ }
656
+ }
657
+
658
+ img.github {
659
+ position: absolute;
660
+ top: 0;
661
+ border: 0;
662
+ right: 0;
663
+ }
docs/build/html/_static/basic.css ADDED
@@ -0,0 +1,914 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * Sphinx stylesheet -- basic theme.
3
+ */
4
+
5
+ /* -- main layout ----------------------------------------------------------- */
6
+
7
+ div.clearer {
8
+ clear: both;
9
+ }
10
+
11
+ div.section::after {
12
+ display: block;
13
+ content: '';
14
+ clear: left;
15
+ }
16
+
17
+ /* -- relbar ---------------------------------------------------------------- */
18
+
19
+ div.related {
20
+ width: 100%;
21
+ font-size: 90%;
22
+ }
23
+
24
+ div.related h3 {
25
+ display: none;
26
+ }
27
+
28
+ div.related ul {
29
+ margin: 0;
30
+ padding: 0 0 0 10px;
31
+ list-style: none;
32
+ }
33
+
34
+ div.related li {
35
+ display: inline;
36
+ }
37
+
38
+ div.related li.right {
39
+ float: right;
40
+ margin-right: 5px;
41
+ }
42
+
43
+ /* -- sidebar --------------------------------------------------------------- */
44
+
45
+ div.sphinxsidebarwrapper {
46
+ padding: 10px 5px 0 10px;
47
+ }
48
+
49
+ div.sphinxsidebar {
50
+ float: left;
51
+ width: 230px;
52
+ margin-left: -100%;
53
+ font-size: 90%;
54
+ word-wrap: break-word;
55
+ overflow-wrap : break-word;
56
+ }
57
+
58
+ div.sphinxsidebar ul {
59
+ list-style: none;
60
+ }
61
+
62
+ div.sphinxsidebar ul ul,
63
+ div.sphinxsidebar ul.want-points {
64
+ margin-left: 20px;
65
+ list-style: square;
66
+ }
67
+
68
+ div.sphinxsidebar ul ul {
69
+ margin-top: 0;
70
+ margin-bottom: 0;
71
+ }
72
+
73
+ div.sphinxsidebar form {
74
+ margin-top: 10px;
75
+ }
76
+
77
+ div.sphinxsidebar input {
78
+ border: 1px solid #98dbcc;
79
+ font-family: sans-serif;
80
+ font-size: 1em;
81
+ }
82
+
83
+ div.sphinxsidebar #searchbox form.search {
84
+ overflow: hidden;
85
+ }
86
+
87
+ div.sphinxsidebar #searchbox input[type="text"] {
88
+ float: left;
89
+ width: 80%;
90
+ padding: 0.25em;
91
+ box-sizing: border-box;
92
+ }
93
+
94
+ div.sphinxsidebar #searchbox input[type="submit"] {
95
+ float: left;
96
+ width: 20%;
97
+ border-left: none;
98
+ padding: 0.25em;
99
+ box-sizing: border-box;
100
+ }
101
+
102
+
103
+ img {
104
+ border: 0;
105
+ max-width: 100%;
106
+ }
107
+
108
+ /* -- search page ----------------------------------------------------------- */
109
+
110
+ ul.search {
111
+ margin-top: 10px;
112
+ }
113
+
114
+ ul.search li {
115
+ padding: 5px 0;
116
+ }
117
+
118
+ ul.search li a {
119
+ font-weight: bold;
120
+ }
121
+
122
+ ul.search li p.context {
123
+ color: #888;
124
+ margin: 2px 0 0 30px;
125
+ text-align: left;
126
+ }
127
+
128
+ ul.keywordmatches li.goodmatch a {
129
+ font-weight: bold;
130
+ }
131
+
132
+ /* -- index page ------------------------------------------------------------ */
133
+
134
+ table.contentstable {
135
+ width: 90%;
136
+ margin-left: auto;
137
+ margin-right: auto;
138
+ }
139
+
140
+ table.contentstable p.biglink {
141
+ line-height: 150%;
142
+ }
143
+
144
+ a.biglink {
145
+ font-size: 1.3em;
146
+ }
147
+
148
+ span.linkdescr {
149
+ font-style: italic;
150
+ padding-top: 5px;
151
+ font-size: 90%;
152
+ }
153
+
154
+ /* -- general index --------------------------------------------------------- */
155
+
156
+ table.indextable {
157
+ width: 100%;
158
+ }
159
+
160
+ table.indextable td {
161
+ text-align: left;
162
+ vertical-align: top;
163
+ }
164
+
165
+ table.indextable ul {
166
+ margin-top: 0;
167
+ margin-bottom: 0;
168
+ list-style-type: none;
169
+ }
170
+
171
+ table.indextable > tbody > tr > td > ul {
172
+ padding-left: 0em;
173
+ }
174
+
175
+ table.indextable tr.pcap {
176
+ height: 10px;
177
+ }
178
+
179
+ table.indextable tr.cap {
180
+ margin-top: 10px;
181
+ background-color: #f2f2f2;
182
+ }
183
+
184
+ img.toggler {
185
+ margin-right: 3px;
186
+ margin-top: 3px;
187
+ cursor: pointer;
188
+ }
189
+
190
+ div.modindex-jumpbox {
191
+ border-top: 1px solid #ddd;
192
+ border-bottom: 1px solid #ddd;
193
+ margin: 1em 0 1em 0;
194
+ padding: 0.4em;
195
+ }
196
+
197
+ div.genindex-jumpbox {
198
+ border-top: 1px solid #ddd;
199
+ border-bottom: 1px solid #ddd;
200
+ margin: 1em 0 1em 0;
201
+ padding: 0.4em;
202
+ }
203
+
204
+ /* -- domain module index --------------------------------------------------- */
205
+
206
+ table.modindextable td {
207
+ padding: 2px;
208
+ border-collapse: collapse;
209
+ }
210
+
211
+ /* -- general body styles --------------------------------------------------- */
212
+
213
+ div.body {
214
+ min-width: inherit;
215
+ max-width: auto;
216
+ }
217
+
218
+ div.body p, div.body dd, div.body li, div.body blockquote {
219
+ -moz-hyphens: auto;
220
+ -ms-hyphens: auto;
221
+ -webkit-hyphens: auto;
222
+ hyphens: auto;
223
+ }
224
+
225
+ a.headerlink {
226
+ visibility: hidden;
227
+ }
228
+
229
+ a:visited {
230
+ color: #551A8B;
231
+ }
232
+
233
+ h1:hover > a.headerlink,
234
+ h2:hover > a.headerlink,
235
+ h3:hover > a.headerlink,
236
+ h4:hover > a.headerlink,
237
+ h5:hover > a.headerlink,
238
+ h6:hover > a.headerlink,
239
+ dt:hover > a.headerlink,
240
+ caption:hover > a.headerlink,
241
+ p.caption:hover > a.headerlink,
242
+ div.code-block-caption:hover > a.headerlink {
243
+ visibility: visible;
244
+ }
245
+
246
+ div.body p.caption {
247
+ text-align: inherit;
248
+ }
249
+
250
+ div.body td {
251
+ text-align: left;
252
+ }
253
+
254
+ .first {
255
+ margin-top: 0 !important;
256
+ }
257
+
258
+ p.rubric {
259
+ margin-top: 30px;
260
+ font-weight: bold;
261
+ }
262
+
263
+ img.align-left, figure.align-left, .figure.align-left, object.align-left {
264
+ clear: left;
265
+ float: left;
266
+ margin-right: 1em;
267
+ }
268
+
269
+ img.align-right, figure.align-right, .figure.align-right, object.align-right {
270
+ clear: right;
271
+ float: right;
272
+ margin-left: 1em;
273
+ }
274
+
275
+ img.align-center, figure.align-center, .figure.align-center, object.align-center {
276
+ display: block;
277
+ margin-left: auto;
278
+ margin-right: auto;
279
+ }
280
+
281
+ img.align-default, figure.align-default, .figure.align-default {
282
+ display: block;
283
+ margin-left: auto;
284
+ margin-right: auto;
285
+ }
286
+
287
+ .align-left {
288
+ text-align: left;
289
+ }
290
+
291
+ .align-center {
292
+ text-align: center;
293
+ }
294
+
295
+ .align-default {
296
+ text-align: center;
297
+ }
298
+
299
+ .align-right {
300
+ text-align: right;
301
+ }
302
+
303
+ /* -- sidebars -------------------------------------------------------------- */
304
+
305
+ div.sidebar,
306
+ aside.sidebar {
307
+ margin: 0 0 0.5em 1em;
308
+ border: 1px solid #ddb;
309
+ padding: 7px;
310
+ background-color: #ffe;
311
+ width: 40%;
312
+ float: right;
313
+ clear: right;
314
+ overflow-x: auto;
315
+ }
316
+
317
+ p.sidebar-title {
318
+ font-weight: bold;
319
+ }
320
+
321
+ nav.contents,
322
+ aside.topic,
323
+ div.admonition, div.topic, blockquote {
324
+ clear: left;
325
+ }
326
+
327
+ /* -- topics ---------------------------------------------------------------- */
328
+
329
+ nav.contents,
330
+ aside.topic,
331
+ div.topic {
332
+ border: 1px solid #ccc;
333
+ padding: 7px;
334
+ margin: 10px 0 10px 0;
335
+ }
336
+
337
+ p.topic-title {
338
+ font-size: 1.1em;
339
+ font-weight: bold;
340
+ margin-top: 10px;
341
+ }
342
+
343
+ /* -- admonitions ----------------------------------------------------------- */
344
+
345
+ div.admonition {
346
+ margin-top: 10px;
347
+ margin-bottom: 10px;
348
+ padding: 7px;
349
+ }
350
+
351
+ div.admonition dt {
352
+ font-weight: bold;
353
+ }
354
+
355
+ p.admonition-title {
356
+ margin: 0px 10px 5px 0px;
357
+ font-weight: bold;
358
+ }
359
+
360
+ div.body p.centered {
361
+ text-align: center;
362
+ margin-top: 25px;
363
+ }
364
+
365
+ /* -- content of sidebars/topics/admonitions -------------------------------- */
366
+
367
+ div.sidebar > :last-child,
368
+ aside.sidebar > :last-child,
369
+ nav.contents > :last-child,
370
+ aside.topic > :last-child,
371
+ div.topic > :last-child,
372
+ div.admonition > :last-child {
373
+ margin-bottom: 0;
374
+ }
375
+
376
+ div.sidebar::after,
377
+ aside.sidebar::after,
378
+ nav.contents::after,
379
+ aside.topic::after,
380
+ div.topic::after,
381
+ div.admonition::after,
382
+ blockquote::after {
383
+ display: block;
384
+ content: '';
385
+ clear: both;
386
+ }
387
+
388
+ /* -- tables ---------------------------------------------------------------- */
389
+
390
+ table.docutils {
391
+ margin-top: 10px;
392
+ margin-bottom: 10px;
393
+ border: 0;
394
+ border-collapse: collapse;
395
+ }
396
+
397
+ table.align-center {
398
+ margin-left: auto;
399
+ margin-right: auto;
400
+ }
401
+
402
+ table.align-default {
403
+ margin-left: auto;
404
+ margin-right: auto;
405
+ }
406
+
407
+ table caption span.caption-number {
408
+ font-style: italic;
409
+ }
410
+
411
+ table caption span.caption-text {
412
+ }
413
+
414
+ table.docutils td, table.docutils th {
415
+ padding: 1px 8px 1px 5px;
416
+ border-top: 0;
417
+ border-left: 0;
418
+ border-right: 0;
419
+ border-bottom: 1px solid #aaa;
420
+ }
421
+
422
+ th {
423
+ text-align: left;
424
+ padding-right: 5px;
425
+ }
426
+
427
+ table.citation {
428
+ border-left: solid 1px gray;
429
+ margin-left: 1px;
430
+ }
431
+
432
+ table.citation td {
433
+ border-bottom: none;
434
+ }
435
+
436
+ th > :first-child,
437
+ td > :first-child {
438
+ margin-top: 0px;
439
+ }
440
+
441
+ th > :last-child,
442
+ td > :last-child {
443
+ margin-bottom: 0px;
444
+ }
445
+
446
+ /* -- figures --------------------------------------------------------------- */
447
+
448
+ div.figure, figure {
449
+ margin: 0.5em;
450
+ padding: 0.5em;
451
+ }
452
+
453
+ div.figure p.caption, figcaption {
454
+ padding: 0.3em;
455
+ }
456
+
457
+ div.figure p.caption span.caption-number,
458
+ figcaption span.caption-number {
459
+ font-style: italic;
460
+ }
461
+
462
+ div.figure p.caption span.caption-text,
463
+ figcaption span.caption-text {
464
+ }
465
+
466
+ /* -- field list styles ----------------------------------------------------- */
467
+
468
+ table.field-list td, table.field-list th {
469
+ border: 0 !important;
470
+ }
471
+
472
+ .field-list ul {
473
+ margin: 0;
474
+ padding-left: 1em;
475
+ }
476
+
477
+ .field-list p {
478
+ margin: 0;
479
+ }
480
+
481
+ .field-name {
482
+ -moz-hyphens: manual;
483
+ -ms-hyphens: manual;
484
+ -webkit-hyphens: manual;
485
+ hyphens: manual;
486
+ }
487
+
488
+ /* -- hlist styles ---------------------------------------------------------- */
489
+
490
+ table.hlist {
491
+ margin: 1em 0;
492
+ }
493
+
494
+ table.hlist td {
495
+ vertical-align: top;
496
+ }
497
+
498
+ /* -- object description styles --------------------------------------------- */
499
+
500
+ .sig {
501
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
502
+ }
503
+
504
+ .sig-name, code.descname {
505
+ background-color: transparent;
506
+ font-weight: bold;
507
+ }
508
+
509
+ .sig-name {
510
+ font-size: 1.1em;
511
+ }
512
+
513
+ code.descname {
514
+ font-size: 1.2em;
515
+ }
516
+
517
+ .sig-prename, code.descclassname {
518
+ background-color: transparent;
519
+ }
520
+
521
+ .optional {
522
+ font-size: 1.3em;
523
+ }
524
+
525
+ .sig-paren {
526
+ font-size: larger;
527
+ }
528
+
529
+ .sig-param.n {
530
+ font-style: italic;
531
+ }
532
+
533
+ /* C++ specific styling */
534
+
535
+ .sig-inline.c-texpr,
536
+ .sig-inline.cpp-texpr {
537
+ font-family: unset;
538
+ }
539
+
540
+ .sig.c .k, .sig.c .kt,
541
+ .sig.cpp .k, .sig.cpp .kt {
542
+ color: #0033B3;
543
+ }
544
+
545
+ .sig.c .m,
546
+ .sig.cpp .m {
547
+ color: #1750EB;
548
+ }
549
+
550
+ .sig.c .s, .sig.c .sc,
551
+ .sig.cpp .s, .sig.cpp .sc {
552
+ color: #067D17;
553
+ }
554
+
555
+
556
+ /* -- other body styles ----------------------------------------------------- */
557
+
558
+ ol.arabic {
559
+ list-style: decimal;
560
+ }
561
+
562
+ ol.loweralpha {
563
+ list-style: lower-alpha;
564
+ }
565
+
566
+ ol.upperalpha {
567
+ list-style: upper-alpha;
568
+ }
569
+
570
+ ol.lowerroman {
571
+ list-style: lower-roman;
572
+ }
573
+
574
+ ol.upperroman {
575
+ list-style: upper-roman;
576
+ }
577
+
578
+ :not(li) > ol > li:first-child > :first-child,
579
+ :not(li) > ul > li:first-child > :first-child {
580
+ margin-top: 0px;
581
+ }
582
+
583
+ :not(li) > ol > li:last-child > :last-child,
584
+ :not(li) > ul > li:last-child > :last-child {
585
+ margin-bottom: 0px;
586
+ }
587
+
588
+ ol.simple ol p,
589
+ ol.simple ul p,
590
+ ul.simple ol p,
591
+ ul.simple ul p {
592
+ margin-top: 0;
593
+ }
594
+
595
+ ol.simple > li:not(:first-child) > p,
596
+ ul.simple > li:not(:first-child) > p {
597
+ margin-top: 0;
598
+ }
599
+
600
+ ol.simple p,
601
+ ul.simple p {
602
+ margin-bottom: 0;
603
+ }
604
+
605
+ aside.footnote > span,
606
+ div.citation > span {
607
+ float: left;
608
+ }
609
+ aside.footnote > span:last-of-type,
610
+ div.citation > span:last-of-type {
611
+ padding-right: 0.5em;
612
+ }
613
+ aside.footnote > p {
614
+ margin-left: 2em;
615
+ }
616
+ div.citation > p {
617
+ margin-left: 4em;
618
+ }
619
+ aside.footnote > p:last-of-type,
620
+ div.citation > p:last-of-type {
621
+ margin-bottom: 0em;
622
+ }
623
+ aside.footnote > p:last-of-type:after,
624
+ div.citation > p:last-of-type:after {
625
+ content: "";
626
+ clear: both;
627
+ }
628
+
629
+ dl.field-list {
630
+ display: grid;
631
+ grid-template-columns: fit-content(30%) auto;
632
+ }
633
+
634
+ dl.field-list > dt {
635
+ font-weight: bold;
636
+ word-break: break-word;
637
+ padding-left: 0.5em;
638
+ padding-right: 5px;
639
+ }
640
+
641
+ dl.field-list > dd {
642
+ padding-left: 0.5em;
643
+ margin-top: 0em;
644
+ margin-left: 0em;
645
+ margin-bottom: 0em;
646
+ }
647
+
648
+ dl {
649
+ margin-bottom: 15px;
650
+ }
651
+
652
+ dd > :first-child {
653
+ margin-top: 0px;
654
+ }
655
+
656
+ dd ul, dd table {
657
+ margin-bottom: 10px;
658
+ }
659
+
660
+ dd {
661
+ margin-top: 3px;
662
+ margin-bottom: 10px;
663
+ margin-left: 30px;
664
+ }
665
+
666
+ .sig dd {
667
+ margin-top: 0px;
668
+ margin-bottom: 0px;
669
+ }
670
+
671
+ .sig dl {
672
+ margin-top: 0px;
673
+ margin-bottom: 0px;
674
+ }
675
+
676
+ dl > dd:last-child,
677
+ dl > dd:last-child > :last-child {
678
+ margin-bottom: 0;
679
+ }
680
+
681
+ dt:target, span.highlighted {
682
+ background-color: #fbe54e;
683
+ }
684
+
685
+ rect.highlighted {
686
+ fill: #fbe54e;
687
+ }
688
+
689
+ dl.glossary dt {
690
+ font-weight: bold;
691
+ font-size: 1.1em;
692
+ }
693
+
694
+ .versionmodified {
695
+ font-style: italic;
696
+ }
697
+
698
+ .system-message {
699
+ background-color: #fda;
700
+ padding: 5px;
701
+ border: 3px solid red;
702
+ }
703
+
704
+ .footnote:target {
705
+ background-color: #ffa;
706
+ }
707
+
708
+ .line-block {
709
+ display: block;
710
+ margin-top: 1em;
711
+ margin-bottom: 1em;
712
+ }
713
+
714
+ .line-block .line-block {
715
+ margin-top: 0;
716
+ margin-bottom: 0;
717
+ margin-left: 1.5em;
718
+ }
719
+
720
+ .guilabel, .menuselection {
721
+ font-family: sans-serif;
722
+ }
723
+
724
+ .accelerator {
725
+ text-decoration: underline;
726
+ }
727
+
728
+ .classifier {
729
+ font-style: oblique;
730
+ }
731
+
732
+ .classifier:before {
733
+ font-style: normal;
734
+ margin: 0 0.5em;
735
+ content: ":";
736
+ display: inline-block;
737
+ }
738
+
739
+ abbr, acronym {
740
+ border-bottom: dotted 1px;
741
+ cursor: help;
742
+ }
743
+
744
+ .translated {
745
+ background-color: rgba(207, 255, 207, 0.2)
746
+ }
747
+
748
+ .untranslated {
749
+ background-color: rgba(255, 207, 207, 0.2)
750
+ }
751
+
752
+ /* -- code displays --------------------------------------------------------- */
753
+
754
+ pre {
755
+ overflow: auto;
756
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
757
+ }
758
+
759
+ pre, div[class*="highlight-"] {
760
+ clear: both;
761
+ }
762
+
763
+ span.pre {
764
+ -moz-hyphens: none;
765
+ -ms-hyphens: none;
766
+ -webkit-hyphens: none;
767
+ hyphens: none;
768
+ white-space: nowrap;
769
+ }
770
+
771
+ div[class*="highlight-"] {
772
+ margin: 1em 0;
773
+ }
774
+
775
+ td.linenos pre {
776
+ border: 0;
777
+ background-color: transparent;
778
+ color: #aaa;
779
+ }
780
+
781
+ table.highlighttable {
782
+ display: block;
783
+ }
784
+
785
+ table.highlighttable tbody {
786
+ display: block;
787
+ }
788
+
789
+ table.highlighttable tr {
790
+ display: flex;
791
+ }
792
+
793
+ table.highlighttable td {
794
+ margin: 0;
795
+ padding: 0;
796
+ }
797
+
798
+ table.highlighttable td.linenos {
799
+ padding-right: 0.5em;
800
+ }
801
+
802
+ table.highlighttable td.code {
803
+ flex: 1;
804
+ overflow: hidden;
805
+ }
806
+
807
+ .highlight .hll {
808
+ display: block;
809
+ }
810
+
811
+ div.highlight pre,
812
+ table.highlighttable pre {
813
+ margin: 0;
814
+ }
815
+
816
+ div.code-block-caption + div {
817
+ margin-top: 0;
818
+ }
819
+
820
+ div.code-block-caption {
821
+ margin-top: 1em;
822
+ padding: 2px 5px;
823
+ font-size: small;
824
+ }
825
+
826
+ div.code-block-caption code {
827
+ background-color: transparent;
828
+ }
829
+
830
+ table.highlighttable td.linenos,
831
+ span.linenos,
832
+ div.highlight span.gp { /* gp: Generic.Prompt */
833
+ user-select: none;
834
+ -webkit-user-select: text; /* Safari fallback only */
835
+ -webkit-user-select: none; /* Chrome/Safari */
836
+ -moz-user-select: none; /* Firefox */
837
+ -ms-user-select: none; /* IE10+ */
838
+ }
839
+
840
+ div.code-block-caption span.caption-number {
841
+ padding: 0.1em 0.3em;
842
+ font-style: italic;
843
+ }
844
+
845
+ div.code-block-caption span.caption-text {
846
+ }
847
+
848
+ div.literal-block-wrapper {
849
+ margin: 1em 0;
850
+ }
851
+
852
+ code.xref, a code {
853
+ background-color: transparent;
854
+ font-weight: bold;
855
+ }
856
+
857
+ h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
858
+ background-color: transparent;
859
+ }
860
+
861
+ .viewcode-link {
862
+ float: right;
863
+ }
864
+
865
+ .viewcode-back {
866
+ float: right;
867
+ font-family: sans-serif;
868
+ }
869
+
870
+ div.viewcode-block:target {
871
+ margin: -1px -10px;
872
+ padding: 0 10px;
873
+ }
874
+
875
+ /* -- math display ---------------------------------------------------------- */
876
+
877
+ img.math {
878
+ vertical-align: middle;
879
+ }
880
+
881
+ div.body div.math p {
882
+ text-align: center;
883
+ }
884
+
885
+ span.eqno {
886
+ float: right;
887
+ }
888
+
889
+ span.eqno a.headerlink {
890
+ position: absolute;
891
+ z-index: 1;
892
+ }
893
+
894
+ div.math:hover a.headerlink {
895
+ visibility: visible;
896
+ }
897
+
898
+ /* -- printout stylesheet --------------------------------------------------- */
899
+
900
+ @media print {
901
+ div.document,
902
+ div.documentwrapper,
903
+ div.bodywrapper {
904
+ margin: 0 !important;
905
+ width: 100%;
906
+ }
907
+
908
+ div.sphinxsidebar,
909
+ div.related,
910
+ div.footer,
911
+ #top-link {
912
+ display: none;
913
+ }
914
+ }
docs/build/html/_static/custom.css ADDED
@@ -0,0 +1 @@
 
 
1
+ /* This file intentionally left blank. */
docs/build/html/_static/doctools.js ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * Base JavaScript utilities for all Sphinx HTML documentation.
3
+ */
4
+ "use strict";
5
+
6
+ const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
7
+ "TEXTAREA",
8
+ "INPUT",
9
+ "SELECT",
10
+ "BUTTON",
11
+ ]);
12
+
13
+ const _ready = (callback) => {
14
+ if (document.readyState !== "loading") {
15
+ callback();
16
+ } else {
17
+ document.addEventListener("DOMContentLoaded", callback);
18
+ }
19
+ };
20
+
21
+ /**
22
+ * Small JavaScript module for the documentation.
23
+ */
24
+ const Documentation = {
25
+ init: () => {
26
+ Documentation.initDomainIndexTable();
27
+ Documentation.initOnKeyListeners();
28
+ },
29
+
30
+ /**
31
+ * i18n support
32
+ */
33
+ TRANSLATIONS: {},
34
+ PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
35
+ LOCALE: "unknown",
36
+
37
+ // gettext and ngettext don't access this so that the functions
38
+ // can safely bound to a different name (_ = Documentation.gettext)
39
+ gettext: (string) => {
40
+ const translated = Documentation.TRANSLATIONS[string];
41
+ switch (typeof translated) {
42
+ case "undefined":
43
+ return string; // no translation
44
+ case "string":
45
+ return translated; // translation exists
46
+ default:
47
+ return translated[0]; // (singular, plural) translation tuple exists
48
+ }
49
+ },
50
+
51
+ ngettext: (singular, plural, n) => {
52
+ const translated = Documentation.TRANSLATIONS[singular];
53
+ if (typeof translated !== "undefined")
54
+ return translated[Documentation.PLURAL_EXPR(n)];
55
+ return n === 1 ? singular : plural;
56
+ },
57
+
58
+ addTranslations: (catalog) => {
59
+ Object.assign(Documentation.TRANSLATIONS, catalog.messages);
60
+ Documentation.PLURAL_EXPR = new Function(
61
+ "n",
62
+ `return (${catalog.plural_expr})`
63
+ );
64
+ Documentation.LOCALE = catalog.locale;
65
+ },
66
+
67
+ /**
68
+ * helper function to focus on search bar
69
+ */
70
+ focusSearchBar: () => {
71
+ document.querySelectorAll("input[name=q]")[0]?.focus();
72
+ },
73
+
74
+ /**
75
+ * Initialise the domain index toggle buttons
76
+ */
77
+ initDomainIndexTable: () => {
78
+ const toggler = (el) => {
79
+ const idNumber = el.id.substr(7);
80
+ const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
81
+ if (el.src.substr(-9) === "minus.png") {
82
+ el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
83
+ toggledRows.forEach((el) => (el.style.display = "none"));
84
+ } else {
85
+ el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
86
+ toggledRows.forEach((el) => (el.style.display = ""));
87
+ }
88
+ };
89
+
90
+ const togglerElements = document.querySelectorAll("img.toggler");
91
+ togglerElements.forEach((el) =>
92
+ el.addEventListener("click", (event) => toggler(event.currentTarget))
93
+ );
94
+ togglerElements.forEach((el) => (el.style.display = ""));
95
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
96
+ },
97
+
98
+ initOnKeyListeners: () => {
99
+ // only install a listener if it is really needed
100
+ if (
101
+ !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
102
+ !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
103
+ )
104
+ return;
105
+
106
+ document.addEventListener("keydown", (event) => {
107
+ // bail for input elements
108
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
109
+ // bail with special keys
110
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
111
+
112
+ if (!event.shiftKey) {
113
+ switch (event.key) {
114
+ case "ArrowLeft":
115
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
116
+
117
+ const prevLink = document.querySelector('link[rel="prev"]');
118
+ if (prevLink && prevLink.href) {
119
+ window.location.href = prevLink.href;
120
+ event.preventDefault();
121
+ }
122
+ break;
123
+ case "ArrowRight":
124
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
125
+
126
+ const nextLink = document.querySelector('link[rel="next"]');
127
+ if (nextLink && nextLink.href) {
128
+ window.location.href = nextLink.href;
129
+ event.preventDefault();
130
+ }
131
+ break;
132
+ }
133
+ }
134
+
135
+ // some keyboard layouts may need Shift to get /
136
+ switch (event.key) {
137
+ case "/":
138
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
139
+ Documentation.focusSearchBar();
140
+ event.preventDefault();
141
+ }
142
+ });
143
+ },
144
+ };
145
+
146
+ // quick alias for translations
147
+ const _ = Documentation.gettext;
148
+
149
+ _ready(Documentation.init);
docs/build/html/_static/documentation_options.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const DOCUMENTATION_OPTIONS = {
2
+ VERSION: '1.0.0',
3
+ LANGUAGE: 'en',
4
+ COLLAPSE_INDEX: false,
5
+ BUILDER: 'html',
6
+ FILE_SUFFIX: '.html',
7
+ LINK_SUFFIX: '.html',
8
+ HAS_SOURCE: true,
9
+ SOURCELINK_SUFFIX: '.txt',
10
+ NAVIGATION_WITH_KEYS: false,
11
+ SHOW_SEARCH_SUMMARY: true,
12
+ ENABLE_SEARCH_SHORTCUTS: true,
13
+ };
docs/build/html/_static/file.png ADDED
docs/build/html/_static/github-banner.svg ADDED
docs/build/html/_static/language_data.js ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * This script contains the language-specific data used by searchtools.js,
3
+ * namely the list of stopwords, stemmer, scorer and splitter.
4
+ */
5
+
6
+ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
7
+
8
+
9
+ /* Non-minified version is copied as a separate JS file, if available */
10
+
11
+ /**
12
+ * Porter Stemmer
13
+ */
14
+ var Stemmer = function() {
15
+
16
+ var step2list = {
17
+ ational: 'ate',
18
+ tional: 'tion',
19
+ enci: 'ence',
20
+ anci: 'ance',
21
+ izer: 'ize',
22
+ bli: 'ble',
23
+ alli: 'al',
24
+ entli: 'ent',
25
+ eli: 'e',
26
+ ousli: 'ous',
27
+ ization: 'ize',
28
+ ation: 'ate',
29
+ ator: 'ate',
30
+ alism: 'al',
31
+ iveness: 'ive',
32
+ fulness: 'ful',
33
+ ousness: 'ous',
34
+ aliti: 'al',
35
+ iviti: 'ive',
36
+ biliti: 'ble',
37
+ logi: 'log'
38
+ };
39
+
40
+ var step3list = {
41
+ icate: 'ic',
42
+ ative: '',
43
+ alize: 'al',
44
+ iciti: 'ic',
45
+ ical: 'ic',
46
+ ful: '',
47
+ ness: ''
48
+ };
49
+
50
+ var c = "[^aeiou]"; // consonant
51
+ var v = "[aeiouy]"; // vowel
52
+ var C = c + "[^aeiouy]*"; // consonant sequence
53
+ var V = v + "[aeiou]*"; // vowel sequence
54
+
55
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
56
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
57
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
58
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
59
+
60
+ this.stemWord = function (w) {
61
+ var stem;
62
+ var suffix;
63
+ var firstch;
64
+ var origword = w;
65
+
66
+ if (w.length < 3)
67
+ return w;
68
+
69
+ var re;
70
+ var re2;
71
+ var re3;
72
+ var re4;
73
+
74
+ firstch = w.substr(0,1);
75
+ if (firstch == "y")
76
+ w = firstch.toUpperCase() + w.substr(1);
77
+
78
+ // Step 1a
79
+ re = /^(.+?)(ss|i)es$/;
80
+ re2 = /^(.+?)([^s])s$/;
81
+
82
+ if (re.test(w))
83
+ w = w.replace(re,"$1$2");
84
+ else if (re2.test(w))
85
+ w = w.replace(re2,"$1$2");
86
+
87
+ // Step 1b
88
+ re = /^(.+?)eed$/;
89
+ re2 = /^(.+?)(ed|ing)$/;
90
+ if (re.test(w)) {
91
+ var fp = re.exec(w);
92
+ re = new RegExp(mgr0);
93
+ if (re.test(fp[1])) {
94
+ re = /.$/;
95
+ w = w.replace(re,"");
96
+ }
97
+ }
98
+ else if (re2.test(w)) {
99
+ var fp = re2.exec(w);
100
+ stem = fp[1];
101
+ re2 = new RegExp(s_v);
102
+ if (re2.test(stem)) {
103
+ w = stem;
104
+ re2 = /(at|bl|iz)$/;
105
+ re3 = new RegExp("([^aeiouylsz])\\1$");
106
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
107
+ if (re2.test(w))
108
+ w = w + "e";
109
+ else if (re3.test(w)) {
110
+ re = /.$/;
111
+ w = w.replace(re,"");
112
+ }
113
+ else if (re4.test(w))
114
+ w = w + "e";
115
+ }
116
+ }
117
+
118
+ // Step 1c
119
+ re = /^(.+?)y$/;
120
+ if (re.test(w)) {
121
+ var fp = re.exec(w);
122
+ stem = fp[1];
123
+ re = new RegExp(s_v);
124
+ if (re.test(stem))
125
+ w = stem + "i";
126
+ }
127
+
128
+ // Step 2
129
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
130
+ if (re.test(w)) {
131
+ var fp = re.exec(w);
132
+ stem = fp[1];
133
+ suffix = fp[2];
134
+ re = new RegExp(mgr0);
135
+ if (re.test(stem))
136
+ w = stem + step2list[suffix];
137
+ }
138
+
139
+ // Step 3
140
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
141
+ if (re.test(w)) {
142
+ var fp = re.exec(w);
143
+ stem = fp[1];
144
+ suffix = fp[2];
145
+ re = new RegExp(mgr0);
146
+ if (re.test(stem))
147
+ w = stem + step3list[suffix];
148
+ }
149
+
150
+ // Step 4
151
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
152
+ re2 = /^(.+?)(s|t)(ion)$/;
153
+ if (re.test(w)) {
154
+ var fp = re.exec(w);
155
+ stem = fp[1];
156
+ re = new RegExp(mgr1);
157
+ if (re.test(stem))
158
+ w = stem;
159
+ }
160
+ else if (re2.test(w)) {
161
+ var fp = re2.exec(w);
162
+ stem = fp[1] + fp[2];
163
+ re2 = new RegExp(mgr1);
164
+ if (re2.test(stem))
165
+ w = stem;
166
+ }
167
+
168
+ // Step 5
169
+ re = /^(.+?)e$/;
170
+ if (re.test(w)) {
171
+ var fp = re.exec(w);
172
+ stem = fp[1];
173
+ re = new RegExp(mgr1);
174
+ re2 = new RegExp(meq1);
175
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
176
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
177
+ w = stem;
178
+ }
179
+ re = /ll$/;
180
+ re2 = new RegExp(mgr1);
181
+ if (re.test(w) && re2.test(w)) {
182
+ re = /.$/;
183
+ w = w.replace(re,"");
184
+ }
185
+
186
+ // and turn initial Y back to y
187
+ if (firstch == "y")
188
+ w = firstch.toLowerCase() + w.substr(1);
189
+ return w;
190
+ }
191
+ }
192
+
docs/build/html/_static/minus.png ADDED
docs/build/html/_static/plus.png ADDED
docs/build/html/_static/pygments.css ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ pre { line-height: 125%; }
2
+ td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
3
+ span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
4
+ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
5
+ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
6
+ .highlight .hll { background-color: #ffffcc }
7
+ .highlight { background: #f8f8f8; }
8
+ .highlight .c { color: #8F5902; font-style: italic } /* Comment */
9
+ .highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */
10
+ .highlight .g { color: #000 } /* Generic */
11
+ .highlight .k { color: #004461; font-weight: bold } /* Keyword */
12
+ .highlight .l { color: #000 } /* Literal */
13
+ .highlight .n { color: #000 } /* Name */
14
+ .highlight .o { color: #582800 } /* Operator */
15
+ .highlight .x { color: #000 } /* Other */
16
+ .highlight .p { color: #000; font-weight: bold } /* Punctuation */
17
+ .highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */
18
+ .highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */
19
+ .highlight .cp { color: #8F5902 } /* Comment.Preproc */
20
+ .highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */
21
+ .highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */
22
+ .highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */
23
+ .highlight .gd { color: #A40000 } /* Generic.Deleted */
24
+ .highlight .ge { color: #000; font-style: italic } /* Generic.Emph */
25
+ .highlight .ges { color: #000 } /* Generic.EmphStrong */
26
+ .highlight .gr { color: #EF2929 } /* Generic.Error */
27
+ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
28
+ .highlight .gi { color: #00A000 } /* Generic.Inserted */
29
+ .highlight .go { color: #888 } /* Generic.Output */
30
+ .highlight .gp { color: #745334 } /* Generic.Prompt */
31
+ .highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */
32
+ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
33
+ .highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */
34
+ .highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
35
+ .highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
36
+ .highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
37
+ .highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
38
+ .highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
39
+ .highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
40
+ .highlight .ld { color: #000 } /* Literal.Date */
41
+ .highlight .m { color: #900 } /* Literal.Number */
42
+ .highlight .s { color: #4E9A06 } /* Literal.String */
43
+ .highlight .na { color: #C4A000 } /* Name.Attribute */
44
+ .highlight .nb { color: #004461 } /* Name.Builtin */
45
+ .highlight .nc { color: #000 } /* Name.Class */
46
+ .highlight .no { color: #000 } /* Name.Constant */
47
+ .highlight .nd { color: #888 } /* Name.Decorator */
48
+ .highlight .ni { color: #CE5C00 } /* Name.Entity */
49
+ .highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */
50
+ .highlight .nf { color: #000 } /* Name.Function */
51
+ .highlight .nl { color: #F57900 } /* Name.Label */
52
+ .highlight .nn { color: #000 } /* Name.Namespace */
53
+ .highlight .nx { color: #000 } /* Name.Other */
54
+ .highlight .py { color: #000 } /* Name.Property */
55
+ .highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
56
+ .highlight .nv { color: #000 } /* Name.Variable */
57
+ .highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
58
+ .highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */
59
+ .highlight .w { color: #F8F8F8 } /* Text.Whitespace */
60
+ .highlight .mb { color: #900 } /* Literal.Number.Bin */
61
+ .highlight .mf { color: #900 } /* Literal.Number.Float */
62
+ .highlight .mh { color: #900 } /* Literal.Number.Hex */
63
+ .highlight .mi { color: #900 } /* Literal.Number.Integer */
64
+ .highlight .mo { color: #900 } /* Literal.Number.Oct */
65
+ .highlight .sa { color: #4E9A06 } /* Literal.String.Affix */
66
+ .highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */
67
+ .highlight .sc { color: #4E9A06 } /* Literal.String.Char */
68
+ .highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */
69
+ .highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */
70
+ .highlight .s2 { color: #4E9A06 } /* Literal.String.Double */
71
+ .highlight .se { color: #4E9A06 } /* Literal.String.Escape */
72
+ .highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */
73
+ .highlight .si { color: #4E9A06 } /* Literal.String.Interpol */
74
+ .highlight .sx { color: #4E9A06 } /* Literal.String.Other */
75
+ .highlight .sr { color: #4E9A06 } /* Literal.String.Regex */
76
+ .highlight .s1 { color: #4E9A06 } /* Literal.String.Single */
77
+ .highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */
78
+ .highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */
79
+ .highlight .fm { color: #000 } /* Name.Function.Magic */
80
+ .highlight .vc { color: #000 } /* Name.Variable.Class */
81
+ .highlight .vg { color: #000 } /* Name.Variable.Global */
82
+ .highlight .vi { color: #000 } /* Name.Variable.Instance */
83
+ .highlight .vm { color: #000 } /* Name.Variable.Magic */
84
+ .highlight .il { color: #900 } /* Literal.Number.Integer.Long */
docs/build/html/_static/searchtools.js ADDED
@@ -0,0 +1,632 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * Sphinx JavaScript utilities for the full-text search.
3
+ */
4
+ "use strict";
5
+
6
+ /**
7
+ * Simple result scoring code.
8
+ */
9
+ if (typeof Scorer === "undefined") {
10
+ var Scorer = {
11
+ // Implement the following function to further tweak the score for each result
12
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
13
+ // and returns the new score.
14
+ /*
15
+ score: result => {
16
+ const [docname, title, anchor, descr, score, filename, kind] = result
17
+ return score
18
+ },
19
+ */
20
+
21
+ // query matches the full name of an object
22
+ objNameMatch: 11,
23
+ // or matches in the last dotted part of the object name
24
+ objPartialMatch: 6,
25
+ // Additive scores depending on the priority of the object
26
+ objPrio: {
27
+ 0: 15, // used to be importantResults
28
+ 1: 5, // used to be objectResults
29
+ 2: -5, // used to be unimportantResults
30
+ },
31
+ // Used when the priority is not in the mapping.
32
+ objPrioDefault: 0,
33
+
34
+ // query found in title
35
+ title: 15,
36
+ partialTitle: 7,
37
+ // query found in terms
38
+ term: 5,
39
+ partialTerm: 2,
40
+ };
41
+ }
42
+
43
+ // Global search result kind enum, used by themes to style search results.
44
+ class SearchResultKind {
45
+ static get index() { return "index"; }
46
+ static get object() { return "object"; }
47
+ static get text() { return "text"; }
48
+ static get title() { return "title"; }
49
+ }
50
+
51
+ const _removeChildren = (element) => {
52
+ while (element && element.lastChild) element.removeChild(element.lastChild);
53
+ };
54
+
55
+ /**
56
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
57
+ */
58
+ const _escapeRegExp = (string) =>
59
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
60
+
61
+ const _displayItem = (item, searchTerms, highlightTerms) => {
62
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
63
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
64
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
65
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
66
+ const contentRoot = document.documentElement.dataset.content_root;
67
+
68
+ const [docName, title, anchor, descr, score, _filename, kind] = item;
69
+
70
+ let listItem = document.createElement("li");
71
+ // Add a class representing the item's type:
72
+ // can be used by a theme's CSS selector for styling
73
+ // See SearchResultKind for the class names.
74
+ listItem.classList.add(`kind-${kind}`);
75
+ let requestUrl;
76
+ let linkUrl;
77
+ if (docBuilder === "dirhtml") {
78
+ // dirhtml builder
79
+ let dirname = docName + "/";
80
+ if (dirname.match(/\/index\/$/))
81
+ dirname = dirname.substring(0, dirname.length - 6);
82
+ else if (dirname === "index/") dirname = "";
83
+ requestUrl = contentRoot + dirname;
84
+ linkUrl = requestUrl;
85
+ } else {
86
+ // normal html builders
87
+ requestUrl = contentRoot + docName + docFileSuffix;
88
+ linkUrl = docName + docLinkSuffix;
89
+ }
90
+ let linkEl = listItem.appendChild(document.createElement("a"));
91
+ linkEl.href = linkUrl + anchor;
92
+ linkEl.dataset.score = score;
93
+ linkEl.innerHTML = title;
94
+ if (descr) {
95
+ listItem.appendChild(document.createElement("span")).innerHTML =
96
+ " (" + descr + ")";
97
+ // highlight search terms in the description
98
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
99
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
100
+ }
101
+ else if (showSearchSummary)
102
+ fetch(requestUrl)
103
+ .then((responseData) => responseData.text())
104
+ .then((data) => {
105
+ if (data)
106
+ listItem.appendChild(
107
+ Search.makeSearchSummary(data, searchTerms, anchor)
108
+ );
109
+ // highlight search terms in the summary
110
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
111
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
112
+ });
113
+ Search.output.appendChild(listItem);
114
+ };
115
+ const _finishSearch = (resultCount) => {
116
+ Search.stopPulse();
117
+ Search.title.innerText = _("Search Results");
118
+ if (!resultCount)
119
+ Search.status.innerText = Documentation.gettext(
120
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
121
+ );
122
+ else
123
+ Search.status.innerText = Documentation.ngettext(
124
+ "Search finished, found one page matching the search query.",
125
+ "Search finished, found ${resultCount} pages matching the search query.",
126
+ resultCount,
127
+ ).replace('${resultCount}', resultCount);
128
+ };
129
+ const _displayNextItem = (
130
+ results,
131
+ resultCount,
132
+ searchTerms,
133
+ highlightTerms,
134
+ ) => {
135
+ // results left, load the summary and display it
136
+ // this is intended to be dynamic (don't sub resultsCount)
137
+ if (results.length) {
138
+ _displayItem(results.pop(), searchTerms, highlightTerms);
139
+ setTimeout(
140
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
141
+ 5
142
+ );
143
+ }
144
+ // search finished, update title and status message
145
+ else _finishSearch(resultCount);
146
+ };
147
+ // Helper function used by query() to order search results.
148
+ // Each input is an array of [docname, title, anchor, descr, score, filename, kind].
149
+ // Order the results by score (in opposite order of appearance, since the
150
+ // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
151
+ const _orderResultsByScoreThenName = (a, b) => {
152
+ const leftScore = a[4];
153
+ const rightScore = b[4];
154
+ if (leftScore === rightScore) {
155
+ // same score: sort alphabetically
156
+ const leftTitle = a[1].toLowerCase();
157
+ const rightTitle = b[1].toLowerCase();
158
+ if (leftTitle === rightTitle) return 0;
159
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
160
+ }
161
+ return leftScore > rightScore ? 1 : -1;
162
+ };
163
+
164
+ /**
165
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
166
+ * custom function per language.
167
+ *
168
+ * The regular expression works by splitting the string on consecutive characters
169
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
170
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
171
+ */
172
+ if (typeof splitQuery === "undefined") {
173
+ var splitQuery = (query) => query
174
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
175
+ .filter(term => term) // remove remaining empty strings
176
+ }
177
+
178
+ /**
179
+ * Search Module
180
+ */
181
+ const Search = {
182
+ _index: null,
183
+ _queued_query: null,
184
+ _pulse_status: -1,
185
+
186
+ htmlToText: (htmlString, anchor) => {
187
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
188
+ for (const removalQuery of [".headerlink", "script", "style"]) {
189
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
190
+ }
191
+ if (anchor) {
192
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
193
+ if (anchorContent) return anchorContent.textContent;
194
+
195
+ console.warn(
196
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
197
+ );
198
+ }
199
+
200
+ // if anchor not specified or not found, fall back to main content
201
+ const docContent = htmlElement.querySelector('[role="main"]');
202
+ if (docContent) return docContent.textContent;
203
+
204
+ console.warn(
205
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
206
+ );
207
+ return "";
208
+ },
209
+
210
+ init: () => {
211
+ const query = new URLSearchParams(window.location.search).get("q");
212
+ document
213
+ .querySelectorAll('input[name="q"]')
214
+ .forEach((el) => (el.value = query));
215
+ if (query) Search.performSearch(query);
216
+ },
217
+
218
+ loadIndex: (url) =>
219
+ (document.body.appendChild(document.createElement("script")).src = url),
220
+
221
+ setIndex: (index) => {
222
+ Search._index = index;
223
+ if (Search._queued_query !== null) {
224
+ const query = Search._queued_query;
225
+ Search._queued_query = null;
226
+ Search.query(query);
227
+ }
228
+ },
229
+
230
+ hasIndex: () => Search._index !== null,
231
+
232
+ deferQuery: (query) => (Search._queued_query = query),
233
+
234
+ stopPulse: () => (Search._pulse_status = -1),
235
+
236
+ startPulse: () => {
237
+ if (Search._pulse_status >= 0) return;
238
+
239
+ const pulse = () => {
240
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
241
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
242
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
243
+ };
244
+ pulse();
245
+ },
246
+
247
+ /**
248
+ * perform a search for something (or wait until index is loaded)
249
+ */
250
+ performSearch: (query) => {
251
+ // create the required interface elements
252
+ const searchText = document.createElement("h2");
253
+ searchText.textContent = _("Searching");
254
+ const searchSummary = document.createElement("p");
255
+ searchSummary.classList.add("search-summary");
256
+ searchSummary.innerText = "";
257
+ const searchList = document.createElement("ul");
258
+ searchList.setAttribute("role", "list");
259
+ searchList.classList.add("search");
260
+
261
+ const out = document.getElementById("search-results");
262
+ Search.title = out.appendChild(searchText);
263
+ Search.dots = Search.title.appendChild(document.createElement("span"));
264
+ Search.status = out.appendChild(searchSummary);
265
+ Search.output = out.appendChild(searchList);
266
+
267
+ const searchProgress = document.getElementById("search-progress");
268
+ // Some themes don't use the search progress node
269
+ if (searchProgress) {
270
+ searchProgress.innerText = _("Preparing search...");
271
+ }
272
+ Search.startPulse();
273
+
274
+ // index already loaded, the browser was quick!
275
+ if (Search.hasIndex()) Search.query(query);
276
+ else Search.deferQuery(query);
277
+ },
278
+
279
+ _parseQuery: (query) => {
280
+ // stem the search terms and add them to the correct list
281
+ const stemmer = new Stemmer();
282
+ const searchTerms = new Set();
283
+ const excludedTerms = new Set();
284
+ const highlightTerms = new Set();
285
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
286
+ splitQuery(query.trim()).forEach((queryTerm) => {
287
+ const queryTermLower = queryTerm.toLowerCase();
288
+
289
+ // maybe skip this "word"
290
+ // stopwords array is from language_data.js
291
+ if (
292
+ stopwords.indexOf(queryTermLower) !== -1 ||
293
+ queryTerm.match(/^\d+$/)
294
+ )
295
+ return;
296
+
297
+ // stem the word
298
+ let word = stemmer.stemWord(queryTermLower);
299
+ // select the correct list
300
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
301
+ else {
302
+ searchTerms.add(word);
303
+ highlightTerms.add(queryTermLower);
304
+ }
305
+ });
306
+
307
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
308
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
309
+ }
310
+
311
+ // console.debug("SEARCH: searching for:");
312
+ // console.info("required: ", [...searchTerms]);
313
+ // console.info("excluded: ", [...excludedTerms]);
314
+
315
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
316
+ },
317
+
318
+ /**
319
+ * execute search (requires search index to be loaded)
320
+ */
321
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
322
+ const filenames = Search._index.filenames;
323
+ const docNames = Search._index.docnames;
324
+ const titles = Search._index.titles;
325
+ const allTitles = Search._index.alltitles;
326
+ const indexEntries = Search._index.indexentries;
327
+
328
+ // Collect multiple result groups to be sorted separately and then ordered.
329
+ // Each is an array of [docname, title, anchor, descr, score, filename, kind].
330
+ const normalResults = [];
331
+ const nonMainIndexResults = [];
332
+
333
+ _removeChildren(document.getElementById("search-progress"));
334
+
335
+ const queryLower = query.toLowerCase().trim();
336
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
337
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
338
+ for (const [file, id] of foundTitles) {
339
+ const score = Math.round(Scorer.title * queryLower.length / title.length);
340
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
341
+ normalResults.push([
342
+ docNames[file],
343
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
344
+ id !== null ? "#" + id : "",
345
+ null,
346
+ score + boost,
347
+ filenames[file],
348
+ SearchResultKind.title,
349
+ ]);
350
+ }
351
+ }
352
+ }
353
+
354
+ // search for explicit entries in index directives
355
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
356
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
357
+ for (const [file, id, isMain] of foundEntries) {
358
+ const score = Math.round(100 * queryLower.length / entry.length);
359
+ const result = [
360
+ docNames[file],
361
+ titles[file],
362
+ id ? "#" + id : "",
363
+ null,
364
+ score,
365
+ filenames[file],
366
+ SearchResultKind.index,
367
+ ];
368
+ if (isMain) {
369
+ normalResults.push(result);
370
+ } else {
371
+ nonMainIndexResults.push(result);
372
+ }
373
+ }
374
+ }
375
+ }
376
+
377
+ // lookup as object
378
+ objectTerms.forEach((term) =>
379
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
380
+ );
381
+
382
+ // lookup as search terms in fulltext
383
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
384
+
385
+ // let the scorer override scores with a custom scoring function
386
+ if (Scorer.score) {
387
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
388
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
389
+ }
390
+
391
+ // Sort each group of results by score and then alphabetically by name.
392
+ normalResults.sort(_orderResultsByScoreThenName);
393
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
394
+
395
+ // Combine the result groups in (reverse) order.
396
+ // Non-main index entries are typically arbitrary cross-references,
397
+ // so display them after other results.
398
+ let results = [...nonMainIndexResults, ...normalResults];
399
+
400
+ // remove duplicate search results
401
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
402
+ let seen = new Set();
403
+ results = results.reverse().reduce((acc, result) => {
404
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
405
+ if (!seen.has(resultStr)) {
406
+ acc.push(result);
407
+ seen.add(resultStr);
408
+ }
409
+ return acc;
410
+ }, []);
411
+
412
+ return results.reverse();
413
+ },
414
+
415
+ query: (query) => {
416
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
417
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
418
+
419
+ // for debugging
420
+ //Search.lastresults = results.slice(); // a copy
421
+ // console.info("search results:", Search.lastresults);
422
+
423
+ // print the results
424
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
425
+ },
426
+
427
+ /**
428
+ * search for object names
429
+ */
430
+ performObjectSearch: (object, objectTerms) => {
431
+ const filenames = Search._index.filenames;
432
+ const docNames = Search._index.docnames;
433
+ const objects = Search._index.objects;
434
+ const objNames = Search._index.objnames;
435
+ const titles = Search._index.titles;
436
+
437
+ const results = [];
438
+
439
+ const objectSearchCallback = (prefix, match) => {
440
+ const name = match[4]
441
+ const fullname = (prefix ? prefix + "." : "") + name;
442
+ const fullnameLower = fullname.toLowerCase();
443
+ if (fullnameLower.indexOf(object) < 0) return;
444
+
445
+ let score = 0;
446
+ const parts = fullnameLower.split(".");
447
+
448
+ // check for different match types: exact matches of full name or
449
+ // "last name" (i.e. last dotted part)
450
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
451
+ score += Scorer.objNameMatch;
452
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
453
+ score += Scorer.objPartialMatch; // matches in last name
454
+
455
+ const objName = objNames[match[1]][2];
456
+ const title = titles[match[0]];
457
+
458
+ // If more than one term searched for, we require other words to be
459
+ // found in the name/title/description
460
+ const otherTerms = new Set(objectTerms);
461
+ otherTerms.delete(object);
462
+ if (otherTerms.size > 0) {
463
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
464
+ if (
465
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
466
+ )
467
+ return;
468
+ }
469
+
470
+ let anchor = match[3];
471
+ if (anchor === "") anchor = fullname;
472
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
473
+
474
+ const descr = objName + _(", in ") + title;
475
+
476
+ // add custom score for some objects according to scorer
477
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
478
+ score += Scorer.objPrio[match[2]];
479
+ else score += Scorer.objPrioDefault;
480
+
481
+ results.push([
482
+ docNames[match[0]],
483
+ fullname,
484
+ "#" + anchor,
485
+ descr,
486
+ score,
487
+ filenames[match[0]],
488
+ SearchResultKind.object,
489
+ ]);
490
+ };
491
+ Object.keys(objects).forEach((prefix) =>
492
+ objects[prefix].forEach((array) =>
493
+ objectSearchCallback(prefix, array)
494
+ )
495
+ );
496
+ return results;
497
+ },
498
+
499
+ /**
500
+ * search for full-text terms in the index
501
+ */
502
+ performTermsSearch: (searchTerms, excludedTerms) => {
503
+ // prepare search
504
+ const terms = Search._index.terms;
505
+ const titleTerms = Search._index.titleterms;
506
+ const filenames = Search._index.filenames;
507
+ const docNames = Search._index.docnames;
508
+ const titles = Search._index.titles;
509
+
510
+ const scoreMap = new Map();
511
+ const fileMap = new Map();
512
+
513
+ // perform the search on the required terms
514
+ searchTerms.forEach((word) => {
515
+ const files = [];
516
+ const arr = [
517
+ { files: terms[word], score: Scorer.term },
518
+ { files: titleTerms[word], score: Scorer.title },
519
+ ];
520
+ // add support for partial matches
521
+ if (word.length > 2) {
522
+ const escapedWord = _escapeRegExp(word);
523
+ if (!terms.hasOwnProperty(word)) {
524
+ Object.keys(terms).forEach((term) => {
525
+ if (term.match(escapedWord))
526
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
527
+ });
528
+ }
529
+ if (!titleTerms.hasOwnProperty(word)) {
530
+ Object.keys(titleTerms).forEach((term) => {
531
+ if (term.match(escapedWord))
532
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
533
+ });
534
+ }
535
+ }
536
+
537
+ // no match but word was a required one
538
+ if (arr.every((record) => record.files === undefined)) return;
539
+
540
+ // found search word in contents
541
+ arr.forEach((record) => {
542
+ if (record.files === undefined) return;
543
+
544
+ let recordFiles = record.files;
545
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
546
+ files.push(...recordFiles);
547
+
548
+ // set score for the word in each file
549
+ recordFiles.forEach((file) => {
550
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
551
+ scoreMap.get(file)[word] = record.score;
552
+ });
553
+ });
554
+
555
+ // create the mapping
556
+ files.forEach((file) => {
557
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
558
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
559
+ });
560
+ });
561
+
562
+ // now check if the files don't contain excluded terms
563
+ const results = [];
564
+ for (const [file, wordList] of fileMap) {
565
+ // check if all requirements are matched
566
+
567
+ // as search terms with length < 3 are discarded
568
+ const filteredTermCount = [...searchTerms].filter(
569
+ (term) => term.length > 2
570
+ ).length;
571
+ if (
572
+ wordList.length !== searchTerms.size &&
573
+ wordList.length !== filteredTermCount
574
+ )
575
+ continue;
576
+
577
+ // ensure that none of the excluded terms is in the search result
578
+ if (
579
+ [...excludedTerms].some(
580
+ (term) =>
581
+ terms[term] === file ||
582
+ titleTerms[term] === file ||
583
+ (terms[term] || []).includes(file) ||
584
+ (titleTerms[term] || []).includes(file)
585
+ )
586
+ )
587
+ break;
588
+
589
+ // select one (max) score for the file.
590
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
591
+ // add result to the result list
592
+ results.push([
593
+ docNames[file],
594
+ titles[file],
595
+ "",
596
+ null,
597
+ score,
598
+ filenames[file],
599
+ SearchResultKind.text,
600
+ ]);
601
+ }
602
+ return results;
603
+ },
604
+
605
+ /**
606
+ * helper function to return a node containing the
607
+ * search summary for a given text. keywords is a list
608
+ * of stemmed words.
609
+ */
610
+ makeSearchSummary: (htmlText, keywords, anchor) => {
611
+ const text = Search.htmlToText(htmlText, anchor);
612
+ if (text === "") return null;
613
+
614
+ const textLower = text.toLowerCase();
615
+ const actualStartPosition = [...keywords]
616
+ .map((k) => textLower.indexOf(k.toLowerCase()))
617
+ .filter((i) => i > -1)
618
+ .slice(-1)[0];
619
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
620
+
621
+ const top = startWithContext === 0 ? "" : "...";
622
+ const tail = startWithContext + 240 < text.length ? "..." : "";
623
+
624
+ let summary = document.createElement("p");
625
+ summary.classList.add("context");
626
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
627
+
628
+ return summary;
629
+ },
630
+ };
631
+
632
+ _ready(Search.init);
docs/build/html/_static/sphinx_highlight.js ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Highlighting utilities for Sphinx HTML documentation. */
2
+ "use strict";
3
+
4
+ const SPHINX_HIGHLIGHT_ENABLED = true
5
+
6
+ /**
7
+ * highlight a given string on a node by wrapping it in
8
+ * span elements with the given class name.
9
+ */
10
+ const _highlight = (node, addItems, text, className) => {
11
+ if (node.nodeType === Node.TEXT_NODE) {
12
+ const val = node.nodeValue;
13
+ const parent = node.parentNode;
14
+ const pos = val.toLowerCase().indexOf(text);
15
+ if (
16
+ pos >= 0 &&
17
+ !parent.classList.contains(className) &&
18
+ !parent.classList.contains("nohighlight")
19
+ ) {
20
+ let span;
21
+
22
+ const closestNode = parent.closest("body, svg, foreignObject");
23
+ const isInSVG = closestNode && closestNode.matches("svg");
24
+ if (isInSVG) {
25
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
26
+ } else {
27
+ span = document.createElement("span");
28
+ span.classList.add(className);
29
+ }
30
+
31
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
32
+ const rest = document.createTextNode(val.substr(pos + text.length));
33
+ parent.insertBefore(
34
+ span,
35
+ parent.insertBefore(
36
+ rest,
37
+ node.nextSibling
38
+ )
39
+ );
40
+ node.nodeValue = val.substr(0, pos);
41
+ /* There may be more occurrences of search term in this node. So call this
42
+ * function recursively on the remaining fragment.
43
+ */
44
+ _highlight(rest, addItems, text, className);
45
+
46
+ if (isInSVG) {
47
+ const rect = document.createElementNS(
48
+ "http://www.w3.org/2000/svg",
49
+ "rect"
50
+ );
51
+ const bbox = parent.getBBox();
52
+ rect.x.baseVal.value = bbox.x;
53
+ rect.y.baseVal.value = bbox.y;
54
+ rect.width.baseVal.value = bbox.width;
55
+ rect.height.baseVal.value = bbox.height;
56
+ rect.setAttribute("class", className);
57
+ addItems.push({ parent: parent, target: rect });
58
+ }
59
+ }
60
+ } else if (node.matches && !node.matches("button, select, textarea")) {
61
+ node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
62
+ }
63
+ };
64
+ const _highlightText = (thisNode, text, className) => {
65
+ let addItems = [];
66
+ _highlight(thisNode, addItems, text, className);
67
+ addItems.forEach((obj) =>
68
+ obj.parent.insertAdjacentElement("beforebegin", obj.target)
69
+ );
70
+ };
71
+
72
+ /**
73
+ * Small JavaScript module for the documentation.
74
+ */
75
+ const SphinxHighlight = {
76
+
77
+ /**
78
+ * highlight the search words provided in localstorage in the text
79
+ */
80
+ highlightSearchWords: () => {
81
+ if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
82
+
83
+ // get and clear terms from localstorage
84
+ const url = new URL(window.location);
85
+ const highlight =
86
+ localStorage.getItem("sphinx_highlight_terms")
87
+ || url.searchParams.get("highlight")
88
+ || "";
89
+ localStorage.removeItem("sphinx_highlight_terms")
90
+ url.searchParams.delete("highlight");
91
+ window.history.replaceState({}, "", url);
92
+
93
+ // get individual terms from highlight string
94
+ const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
95
+ if (terms.length === 0) return; // nothing to do
96
+
97
+ // There should never be more than one element matching "div.body"
98
+ const divBody = document.querySelectorAll("div.body");
99
+ const body = divBody.length ? divBody[0] : document.querySelector("body");
100
+ window.setTimeout(() => {
101
+ terms.forEach((term) => _highlightText(body, term, "highlighted"));
102
+ }, 10);
103
+
104
+ const searchBox = document.getElementById("searchbox");
105
+ if (searchBox === null) return;
106
+ searchBox.appendChild(
107
+ document
108
+ .createRange()
109
+ .createContextualFragment(
110
+ '<p class="highlight-link">' +
111
+ '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
112
+ _("Hide Search Matches") +
113
+ "</a></p>"
114
+ )
115
+ );
116
+ },
117
+
118
+ /**
119
+ * helper function to hide the search marks again
120
+ */
121
+ hideSearchWords: () => {
122
+ document
123
+ .querySelectorAll("#searchbox .highlight-link")
124
+ .forEach((el) => el.remove());
125
+ document
126
+ .querySelectorAll("span.highlighted")
127
+ .forEach((el) => el.classList.remove("highlighted"));
128
+ localStorage.removeItem("sphinx_highlight_terms")
129
+ },
130
+
131
+ initEscapeListener: () => {
132
+ // only install a listener if it is really needed
133
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
134
+
135
+ document.addEventListener("keydown", (event) => {
136
+ // bail for input elements
137
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
138
+ // bail with special keys
139
+ if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
140
+ if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
141
+ SphinxHighlight.hideSearchWords();
142
+ event.preventDefault();
143
+ }
144
+ });
145
+ },
146
+ };
147
+
148
+ _ready(() => {
149
+ /* Do not call highlightSearchWords() when we are on the search page.
150
+ * It will highlight words from the *previous* search query.
151
+ */
152
+ if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
153
+ SphinxHighlight.initEscapeListener();
154
+ });
docs/build/html/_static/tabs.css ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .sphinx-tabs {
2
+ margin-bottom: 1rem;
3
+ }
4
+
5
+ [role="tablist"] {
6
+ border-bottom: 1px solid #a0b3bf;
7
+ }
8
+
9
+ .sphinx-tabs-tab {
10
+ position: relative;
11
+ font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;
12
+ color: #1D5C87;
13
+ line-height: 24px;
14
+ margin: 0;
15
+ font-size: 16px;
16
+ font-weight: 400;
17
+ background-color: rgba(255, 255, 255, 0);
18
+ border-radius: 5px 5px 0 0;
19
+ border: 0;
20
+ padding: 1rem 1.5rem;
21
+ margin-bottom: 0;
22
+ }
23
+
24
+ .sphinx-tabs-tab[aria-selected="true"] {
25
+ font-weight: 700;
26
+ border: 1px solid #a0b3bf;
27
+ border-bottom: 1px solid white;
28
+ margin: -1px;
29
+ background-color: white;
30
+ }
31
+
32
+ .sphinx-tabs-tab:focus {
33
+ z-index: 1;
34
+ outline-offset: 1px;
35
+ }
36
+
37
+ .sphinx-tabs-panel {
38
+ position: relative;
39
+ padding: 1rem;
40
+ border: 1px solid #a0b3bf;
41
+ margin: 0px -1px -1px -1px;
42
+ border-radius: 0 0 5px 5px;
43
+ border-top: 0;
44
+ background: white;
45
+ }
46
+
47
+ .sphinx-tabs-panel.code-tab {
48
+ padding: 0.4rem;
49
+ }
50
+
51
+ .sphinx-tab img {
52
+ margin-bottom: 24 px;
53
+ }
54
+
55
+ /* Dark theme preference styling */
56
+
57
+ @media (prefers-color-scheme: dark) {
58
+ body[data-theme="auto"] .sphinx-tabs-panel {
59
+ color: white;
60
+ background-color: rgb(50, 50, 50);
61
+ }
62
+
63
+ body[data-theme="auto"] .sphinx-tabs-tab {
64
+ color: white;
65
+ background-color: rgba(255, 255, 255, 0.05);
66
+ }
67
+
68
+ body[data-theme="auto"] .sphinx-tabs-tab[aria-selected="true"] {
69
+ border-bottom: 1px solid rgb(50, 50, 50);
70
+ background-color: rgb(50, 50, 50);
71
+ }
72
+ }
73
+
74
+ /* Explicit dark theme styling */
75
+
76
+ body[data-theme="dark"] .sphinx-tabs-panel {
77
+ color: white;
78
+ background-color: rgb(50, 50, 50);
79
+ }
80
+
81
+ body[data-theme="dark"] .sphinx-tabs-tab {
82
+ color: white;
83
+ background-color: rgba(255, 255, 255, 0.05);
84
+ }
85
+
86
+ body[data-theme="dark"] .sphinx-tabs-tab[aria-selected="true"] {
87
+ border-bottom: 2px solid rgb(50, 50, 50);
88
+ background-color: rgb(50, 50, 50);
89
+ }
docs/build/html/_static/tabs.js ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ try {
2
+ var session = window.sessionStorage || {};
3
+ } catch (e) {
4
+ var session = {};
5
+ }
6
+
7
+ window.addEventListener("DOMContentLoaded", () => {
8
+ const allTabs = document.querySelectorAll('.sphinx-tabs-tab');
9
+ const tabLists = document.querySelectorAll('[role="tablist"]');
10
+
11
+ allTabs.forEach(tab => {
12
+ tab.addEventListener("click", changeTabs);
13
+ });
14
+
15
+ tabLists.forEach(tabList => {
16
+ tabList.addEventListener("keydown", keyTabs);
17
+ });
18
+
19
+ // Restore group tab selection from session
20
+ const lastSelected = session.getItem('sphinx-tabs-last-selected');
21
+ if (lastSelected != null) selectNamedTabs(lastSelected);
22
+ });
23
+
24
+ /**
25
+ * Key focus left and right between sibling elements using arrows
26
+ * @param {Node} e the element in focus when key was pressed
27
+ */
28
+ function keyTabs(e) {
29
+ const tab = e.target;
30
+ let nextTab = null;
31
+ if (e.keyCode === 39 || e.keyCode === 37) {
32
+ tab.setAttribute("tabindex", -1);
33
+ // Move right
34
+ if (e.keyCode === 39) {
35
+ nextTab = tab.nextElementSibling;
36
+ if (nextTab === null) {
37
+ nextTab = tab.parentNode.firstElementChild;
38
+ }
39
+ // Move left
40
+ } else if (e.keyCode === 37) {
41
+ nextTab = tab.previousElementSibling;
42
+ if (nextTab === null) {
43
+ nextTab = tab.parentNode.lastElementChild;
44
+ }
45
+ }
46
+ }
47
+
48
+ if (nextTab !== null) {
49
+ nextTab.setAttribute("tabindex", 0);
50
+ nextTab.focus();
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Select or deselect clicked tab. If a group tab
56
+ * is selected, also select tab in other tabLists.
57
+ * @param {Node} e the element that was clicked
58
+ */
59
+ function changeTabs(e) {
60
+ // Use this instead of the element that was clicked, in case it's a child
61
+ const notSelected = this.getAttribute("aria-selected") === "false";
62
+ const positionBefore = this.parentNode.getBoundingClientRect().top;
63
+ const notClosable = !this.parentNode.classList.contains("closeable");
64
+
65
+ deselectTabList(this);
66
+
67
+ if (notSelected || notClosable) {
68
+ selectTab(this);
69
+ const name = this.getAttribute("name");
70
+ selectNamedTabs(name, this.id);
71
+
72
+ if (this.classList.contains("group-tab")) {
73
+ // Persist during session
74
+ session.setItem('sphinx-tabs-last-selected', name);
75
+ }
76
+ }
77
+
78
+ const positionAfter = this.parentNode.getBoundingClientRect().top;
79
+ const positionDelta = positionAfter - positionBefore;
80
+ // Scroll to offset content resizing
81
+ window.scrollTo(0, window.scrollY + positionDelta);
82
+ }
83
+
84
+ /**
85
+ * Select tab and show associated panel.
86
+ * @param {Node} tab tab to select
87
+ */
88
+ function selectTab(tab) {
89
+ tab.setAttribute("aria-selected", true);
90
+
91
+ // Show the associated panel
92
+ document
93
+ .getElementById(tab.getAttribute("aria-controls"))
94
+ .removeAttribute("hidden");
95
+ }
96
+
97
+ /**
98
+ * Hide the panels associated with all tabs within the
99
+ * tablist containing this tab.
100
+ * @param {Node} tab a tab within the tablist to deselect
101
+ */
102
+ function deselectTabList(tab) {
103
+ const parent = tab.parentNode;
104
+ const grandparent = parent.parentNode;
105
+
106
+ Array.from(parent.children)
107
+ .forEach(t => t.setAttribute("aria-selected", false));
108
+
109
+ Array.from(grandparent.children)
110
+ .slice(1) // Skip tablist
111
+ .forEach(panel => panel.setAttribute("hidden", true));
112
+ }
113
+
114
+ /**
115
+ * Select grouped tabs with the same name, but no the tab
116
+ * with the given id.
117
+ * @param {Node} name name of grouped tab to be selected
118
+ * @param {Node} clickedId id of clicked tab
119
+ */
120
+ function selectNamedTabs(name, clickedId=null) {
121
+ const groupedTabs = document.querySelectorAll(`.sphinx-tabs-tab[name="${name}"]`);
122
+ const tabLists = Array.from(groupedTabs).map(tab => tab.parentNode);
123
+
124
+ tabLists
125
+ .forEach(tabList => {
126
+ // Don't want to change the tabList containing the clicked tab
127
+ const clickedTab = tabList.querySelector(`[id="${clickedId}"]`);
128
+ if (clickedTab === null ) {
129
+ // Select first tab with matching name
130
+ const tab = tabList.querySelector(`.sphinx-tabs-tab[name="${name}"]`);
131
+ deselectTabList(tab);
132
+ selectTab(tab);
133
+ }
134
+ })
135
+ }
136
+
137
+ if (typeof exports === 'undefined') {
138
+ exports = {};
139
+ }
140
+
141
+ exports.keyTabs = keyTabs;
142
+ exports.changeTabs = changeTabs;
143
+ exports.selectTab = selectTab;
144
+ exports.deselectTabList = deselectTabList;
145
+ exports.selectNamedTabs = selectNamedTabs;
docs/build/html/genindex.html ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Index &#8212; AIM-CU 1.0.0 documentation</title>
8
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
9
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
10
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
11
+ <script src="_static/documentation_options.js?v=8d563738"></script>
12
+ <script src="_static/doctools.js?v=9bcbadda"></script>
13
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
14
+ <link rel="index" title="Index" href="#" />
15
+ <link rel="search" title="Search" href="search.html" />
16
+
17
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
18
+
19
+
20
+
21
+
22
+
23
+ </head><body>
24
+
25
+
26
+ <div class="document">
27
+ <div class="documentwrapper">
28
+ <div class="bodywrapper">
29
+
30
+
31
+ <div class="body" role="main">
32
+
33
+
34
+ <h1 id="index">Index</h1>
35
+
36
+ <div class="genindex-jumpbox">
37
+ <a href="#C"><strong>C</strong></a>
38
+ | <a href="#G"><strong>G</strong></a>
39
+ | <a href="#I"><strong>I</strong></a>
40
+ | <a href="#M"><strong>M</strong></a>
41
+ | <a href="#P"><strong>P</strong></a>
42
+ | <a href="#S"><strong>S</strong></a>
43
+
44
+ </div>
45
+ <h2 id="C">C</h2>
46
+ <table style="width: 100%" class="indextable genindextable"><tr>
47
+ <td style="width: 33%; vertical-align: top;"><ul>
48
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.change_detection">change_detection() (package.cusum.CUSUM method)</a>
49
+ </li>
50
+ </ul></td>
51
+ <td style="width: 33%; vertical-align: top;"><ul>
52
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.compute_cusum">compute_cusum() (package.cusum.CUSUM method)</a>
53
+ </li>
54
+ <li><a href="ref_cusum.html#package.cusum.CUSUM">CUSUM (class in package.cusum)</a>
55
+ </li>
56
+ </ul></td>
57
+ </tr></table>
58
+
59
+ <h2 id="G">G</h2>
60
+ <table style="width: 100%" class="indextable genindextable"><tr>
61
+ <td style="width: 33%; vertical-align: top;"><ul>
62
+ <li><a href="ref_theoretical.html#package.ARLTheoretical.get_ARL_1">get_ARL_1() (in module package.ARLTheoretical)</a>
63
+ </li>
64
+ <li><a href="ref_theoretical.html#package.ARLTheoretical.get_ARL_1_h_mu1_k">get_ARL_1_h_mu1_k() (in module package.ARLTheoretical)</a>
65
+ </li>
66
+ </ul></td>
67
+ <td style="width: 33%; vertical-align: top;"><ul>
68
+ <li><a href="ref_utils.html#package.utils.get_greattable_as_html">get_greattable_as_html() (in module package.utils)</a>
69
+ </li>
70
+ <li><a href="ref_theoretical.html#package.ARLTheoretical.get_ref_value">get_ref_value() (in module package.ARLTheoretical)</a>
71
+ </li>
72
+ <li><a href="ref_theoretical.html#package.ARLTheoretical.get_ref_value_k">get_ref_value_k() (in module package.ARLTheoretical)</a>
73
+ </li>
74
+ </ul></td>
75
+ </tr></table>
76
+
77
+ <h2 id="I">I</h2>
78
+ <table style="width: 100%" class="indextable genindextable"><tr>
79
+ <td style="width: 33%; vertical-align: top;"><ul>
80
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.initialize">initialize() (package.cusum.CUSUM method)</a>
81
+ </li>
82
+ </ul></td>
83
+ </tr></table>
84
+
85
+ <h2 id="M">M</h2>
86
+ <table style="width: 100%" class="indextable genindextable"><tr>
87
+ <td style="width: 33%; vertical-align: top;"><ul>
88
+ <li>
89
+ module
90
+
91
+ <ul>
92
+ <li><a href="ref_theoretical.html#module-package.ARLTheoretical">package.ARLTheoretical</a>
93
+ </li>
94
+ <li><a href="ref_cusum.html#module-package.cusum">package.cusum</a>
95
+ </li>
96
+ <li><a href="ref_utils.html#module-package.utils">package.utils</a>
97
+ </li>
98
+ </ul></li>
99
+ </ul></td>
100
+ </tr></table>
101
+
102
+ <h2 id="P">P</h2>
103
+ <table style="width: 100%" class="indextable genindextable"><tr>
104
+ <td style="width: 33%; vertical-align: top;"><ul>
105
+ <li>
106
+ package.ARLTheoretical
107
+
108
+ <ul>
109
+ <li><a href="ref_theoretical.html#module-package.ARLTheoretical">module</a>
110
+ </li>
111
+ </ul></li>
112
+ <li>
113
+ package.cusum
114
+
115
+ <ul>
116
+ <li><a href="ref_cusum.html#module-package.cusum">module</a>
117
+ </li>
118
+ </ul></li>
119
+ <li>
120
+ package.utils
121
+
122
+ <ul>
123
+ <li><a href="ref_utils.html#module-package.utils">module</a>
124
+ </li>
125
+ </ul></li>
126
+ </ul></td>
127
+ <td style="width: 33%; vertical-align: top;"><ul>
128
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.plot_cusum_plotly">plot_cusum_plotly() (package.cusum.CUSUM method)</a>
129
+ </li>
130
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.plot_input_metric_plotly">plot_input_metric_plotly() (package.cusum.CUSUM method)</a>
131
+ </li>
132
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.plot_input_metric_plotly_raw">plot_input_metric_plotly_raw() (package.cusum.CUSUM method)</a>
133
+ </li>
134
+ <li><a href="ref_utils.html#package.utils.populate_summary_table_ARL0_k">populate_summary_table_ARL0_k() (in module package.utils)</a>
135
+ </li>
136
+ <li><a href="ref_utils.html#package.utils.populate_summary_table_ARL1_k">populate_summary_table_ARL1_k() (in module package.utils)</a>
137
+ </li>
138
+ </ul></td>
139
+ </tr></table>
140
+
141
+ <h2 id="S">S</h2>
142
+ <table style="width: 100%" class="indextable genindextable"><tr>
143
+ <td style="width: 33%; vertical-align: top;"><ul>
144
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.set_df_metric_csv">set_df_metric_csv() (package.cusum.CUSUM method)</a>
145
+ </li>
146
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.set_df_metric_default">set_df_metric_default() (package.cusum.CUSUM method)</a>
147
+ </li>
148
+ </ul></td>
149
+ <td style="width: 33%; vertical-align: top;"><ul>
150
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.set_init_stats">set_init_stats() (package.cusum.CUSUM method)</a>
151
+ </li>
152
+ <li><a href="ref_cusum.html#package.cusum.CUSUM.set_timeline">set_timeline() (package.cusum.CUSUM method)</a>
153
+ </li>
154
+ </ul></td>
155
+ </tr></table>
156
+
157
+
158
+
159
+ </div>
160
+
161
+ </div>
162
+ </div>
163
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
164
+ <div class="sphinxsidebarwrapper">
165
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
166
+
167
+
168
+
169
+
170
+
171
+
172
+ <p>
173
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
174
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
175
+ </p>
176
+
177
+
178
+
179
+
180
+
181
+
182
+ <search id="searchbox" style="display: none" role="search">
183
+ <div class="searchformwrapper">
184
+ <form class="search" action="search.html" method="get">
185
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
186
+ <input type="submit" value="Go" />
187
+ </form>
188
+ </div>
189
+ </search>
190
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
191
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
192
+ <ul>
193
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
194
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
195
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
196
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
197
+ </ul>
198
+
199
+ <div class="relations">
200
+ <h3>Related Topics</h3>
201
+ <ul>
202
+ <li><a href="index.html">Documentation overview</a><ul>
203
+ </ul></li>
204
+ </ul>
205
+ </div>
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+ </div>
215
+ </div>
216
+ <div class="clearer"></div>
217
+ </div>
218
+ <div class="footer">
219
+
220
+
221
+
222
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
223
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
224
+
225
+ </div>
226
+
227
+
228
+
229
+
230
+ </body>
231
+ </html>
docs/build/html/index.html ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <title>AIM-CU documentation &#8212; AIM-CU 1.0.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
10
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
11
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
12
+ <script src="_static/documentation_options.js?v=8d563738"></script>
13
+ <script src="_static/doctools.js?v=9bcbadda"></script>
14
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
15
+ <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
16
+ <link rel="index" title="Index" href="genindex.html" />
17
+ <link rel="search" title="Search" href="search.html" />
18
+ <link rel="next" title="Methods" href="ref_method.html" />
19
+
20
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
21
+
22
+
23
+
24
+
25
+
26
+ </head><body>
27
+
28
+
29
+ <div class="document">
30
+ <div class="documentwrapper">
31
+ <div class="bodywrapper">
32
+
33
+
34
+ <div class="body" role="main">
35
+
36
+ <section id="aim-cu-documentation">
37
+ <h1>AIM-CU documentation<a class="headerlink" href="#aim-cu-documentation" title="Link to this heading">¶</a></h1>
38
+ <p>A CUSUM-based tool for AI Monitoring</p>
39
+ <p>AIM-CU is a statistical tool for AI monitoring using cumulative sum (AIM-CU). AIM-CU computes:</p>
40
+ <ul class="simple">
41
+ <li><p>The parameter choices for change-point detection based on an acceptable false alarm rate</p></li>
42
+ <li><p>Detection delay estimates for a given displacement of the performance metric from the target for those parameter choices.</p></li>
43
+ </ul>
44
+ <section id="code-execution">
45
+ <h2>Code execution<a class="headerlink" href="#code-execution" title="Link to this heading">¶</a></h2>
46
+ <p>Clone AIM-CU repository.</p>
47
+ <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/DIDSR/AIM-CU.git
48
+ </pre></div>
49
+ </div>
50
+ <p>Run the following commands to install required dependencies (Python = 3.10 is used).</p>
51
+ <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>apt-get<span class="w"> </span>-y<span class="w"> </span>install<span class="w"> </span>python3
52
+ apt-get<span class="w"> </span>-y<span class="w"> </span>install<span class="w"> </span>pip
53
+ <span class="nb">cd</span><span class="w"> </span>AIM-CU
54
+ pip<span class="w"> </span>install<span class="w"> </span>-r<span class="w"> </span>requirements.txt
55
+ </pre></div>
56
+ </div>
57
+ <p>Run AIM-CU.</p>
58
+ <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>python3<span class="w"> </span>app.py
59
+ </pre></div>
60
+ </div>
61
+ <p>Open the URL <a class="reference external" href="http://0.0.0.0:7860">http://0.0.0.0:7860</a> that is running the AIM-CU locally.</p>
62
+ </section>
63
+ <section id="demo">
64
+ <h2>Demo<a class="headerlink" href="#demo" title="Link to this heading">¶</a></h2>
65
+ <p>AIM-CU can also be run through the demo available at <a class="reference external" href="https://huggingface.co/spaces/didsr/AIM-CU">https://huggingface.co/spaces/didsr/AIM-CU</a>. If Space is paused, click on Restart button.</p>
66
+ <div class="toctree-wrapper compound">
67
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
68
+ <ul>
69
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a><ul>
70
+ <li class="toctree-l2"><a class="reference internal" href="ref_method.html#cusum-parameters">CUSUM parameters</a></li>
71
+ <li class="toctree-l2"><a class="reference internal" href="ref_method.html#cusum-chart">CUSUM chart</a></li>
72
+ </ul>
73
+ </li>
74
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a><ul>
75
+ <li class="toctree-l2"><a class="reference internal" href="ref_cusum.html#package.cusum.CUSUM"><code class="docutils literal notranslate"><span class="pre">CUSUM</span></code></a></li>
76
+ </ul>
77
+ </li>
78
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a><ul>
79
+ <li class="toctree-l2"><a class="reference internal" href="ref_theoretical.html#package.ARLTheoretical.get_ARL_1"><code class="docutils literal notranslate"><span class="pre">get_ARL_1()</span></code></a></li>
80
+ <li class="toctree-l2"><a class="reference internal" href="ref_theoretical.html#package.ARLTheoretical.get_ARL_1_h_mu1_k"><code class="docutils literal notranslate"><span class="pre">get_ARL_1_h_mu1_k()</span></code></a></li>
81
+ <li class="toctree-l2"><a class="reference internal" href="ref_theoretical.html#package.ARLTheoretical.get_ref_value"><code class="docutils literal notranslate"><span class="pre">get_ref_value()</span></code></a></li>
82
+ <li class="toctree-l2"><a class="reference internal" href="ref_theoretical.html#package.ARLTheoretical.get_ref_value_k"><code class="docutils literal notranslate"><span class="pre">get_ref_value_k()</span></code></a></li>
83
+ </ul>
84
+ </li>
85
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a><ul>
86
+ <li class="toctree-l2"><a class="reference internal" href="ref_utils.html#package.utils.get_greattable_as_html"><code class="docutils literal notranslate"><span class="pre">get_greattable_as_html()</span></code></a></li>
87
+ <li class="toctree-l2"><a class="reference internal" href="ref_utils.html#package.utils.populate_summary_table_ARL0_k"><code class="docutils literal notranslate"><span class="pre">populate_summary_table_ARL0_k()</span></code></a></li>
88
+ <li class="toctree-l2"><a class="reference internal" href="ref_utils.html#package.utils.populate_summary_table_ARL1_k"><code class="docutils literal notranslate"><span class="pre">populate_summary_table_ARL1_k()</span></code></a></li>
89
+ </ul>
90
+ </li>
91
+ </ul>
92
+ </div>
93
+ </section>
94
+ </section>
95
+
96
+
97
+ </div>
98
+
99
+ </div>
100
+ </div>
101
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
102
+ <div class="sphinxsidebarwrapper">
103
+ <h1 class="logo"><a href="#">AIM-CU</a></h1>
104
+
105
+
106
+
107
+
108
+
109
+
110
+ <p>
111
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
112
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
113
+ </p>
114
+
115
+
116
+
117
+
118
+
119
+
120
+ <search id="searchbox" style="display: none" role="search">
121
+ <div class="searchformwrapper">
122
+ <form class="search" action="search.html" method="get">
123
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
124
+ <input type="submit" value="Go" />
125
+ </form>
126
+ </div>
127
+ </search>
128
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
129
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
130
+ <ul>
131
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
132
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
133
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
134
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
135
+ </ul>
136
+
137
+ <div class="relations">
138
+ <h3>Related Topics</h3>
139
+ <ul>
140
+ <li><a href="#">Documentation overview</a><ul>
141
+ <li>Next: <a href="ref_method.html" title="next chapter">Methods</a></li>
142
+ </ul></li>
143
+ </ul>
144
+ </div>
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+ </div>
154
+ </div>
155
+ <div class="clearer"></div>
156
+ </div>
157
+ <div class="footer">
158
+
159
+
160
+
161
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
162
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
163
+
164
+ |
165
+ <a href="_sources/index.rst.txt"
166
+ rel="nofollow">Page source</a>
167
+ </div>
168
+
169
+
170
+
171
+
172
+ </body>
173
+ </html>
docs/build/html/objects.inv ADDED
Binary file (551 Bytes). View file
 
docs/build/html/py-modindex.html ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Python Module Index &#8212; AIM-CU 1.0.0 documentation</title>
8
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
9
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
10
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
11
+ <script src="_static/documentation_options.js?v=8d563738"></script>
12
+ <script src="_static/doctools.js?v=9bcbadda"></script>
13
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
14
+ <link rel="index" title="Index" href="genindex.html" />
15
+ <link rel="search" title="Search" href="search.html" />
16
+
17
+
18
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+ </head><body>
27
+
28
+
29
+ <div class="document">
30
+ <div class="documentwrapper">
31
+ <div class="bodywrapper">
32
+
33
+
34
+ <div class="body" role="main">
35
+
36
+
37
+ <h1>Python Module Index</h1>
38
+
39
+ <div class="modindex-jumpbox">
40
+ <a href="#cap-p"><strong>p</strong></a>
41
+ </div>
42
+
43
+ <table class="indextable modindextable">
44
+ <tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
45
+ <tr class="cap" id="cap-p"><td></td><td>
46
+ <strong>p</strong></td><td></td></tr>
47
+ <tr>
48
+ <td><img src="_static/minus.png" class="toggler"
49
+ id="toggle-1" style="display: none" alt="-" /></td>
50
+ <td>
51
+ <code class="xref">package</code></td><td>
52
+ <em></em></td></tr>
53
+ <tr class="cg-1">
54
+ <td></td>
55
+ <td>&#160;&#160;&#160;
56
+ <a href="ref_theoretical.html#module-package.ARLTheoretical"><code class="xref">package.ARLTheoretical</code></a></td><td>
57
+ <em></em></td></tr>
58
+ <tr class="cg-1">
59
+ <td></td>
60
+ <td>&#160;&#160;&#160;
61
+ <a href="ref_cusum.html#module-package.cusum"><code class="xref">package.cusum</code></a></td><td>
62
+ <em></em></td></tr>
63
+ <tr class="cg-1">
64
+ <td></td>
65
+ <td>&#160;&#160;&#160;
66
+ <a href="ref_utils.html#module-package.utils"><code class="xref">package.utils</code></a></td><td>
67
+ <em></em></td></tr>
68
+ </table>
69
+
70
+
71
+ </div>
72
+
73
+ </div>
74
+ </div>
75
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
76
+ <div class="sphinxsidebarwrapper">
77
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
78
+
79
+
80
+
81
+
82
+
83
+
84
+ <p>
85
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
86
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
87
+ </p>
88
+
89
+
90
+
91
+
92
+
93
+
94
+ <search id="searchbox" style="display: none" role="search">
95
+ <div class="searchformwrapper">
96
+ <form class="search" action="search.html" method="get">
97
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
98
+ <input type="submit" value="Go" />
99
+ </form>
100
+ </div>
101
+ </search>
102
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
103
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
104
+ <ul>
105
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
106
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
107
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
108
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
109
+ </ul>
110
+
111
+ <div class="relations">
112
+ <h3>Related Topics</h3>
113
+ <ul>
114
+ <li><a href="index.html">Documentation overview</a><ul>
115
+ </ul></li>
116
+ </ul>
117
+ </div>
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+ </div>
127
+ </div>
128
+ <div class="clearer"></div>
129
+ </div>
130
+ <div class="footer">
131
+
132
+
133
+
134
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
135
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
136
+
137
+ </div>
138
+
139
+
140
+
141
+
142
+ </body>
143
+ </html>
docs/build/html/ref_cusum.html ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <title>CUSUM &#8212; AIM-CU 1.0.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
10
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
11
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
12
+ <script src="_static/documentation_options.js?v=8d563738"></script>
13
+ <script src="_static/doctools.js?v=9bcbadda"></script>
14
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
15
+ <link rel="index" title="Index" href="genindex.html" />
16
+ <link rel="search" title="Search" href="search.html" />
17
+ <link rel="next" title="ARLTheoretical" href="ref_theoretical.html" />
18
+ <link rel="prev" title="Methods" href="ref_method.html" />
19
+
20
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
21
+
22
+
23
+
24
+
25
+
26
+ </head><body>
27
+
28
+
29
+ <div class="document">
30
+ <div class="documentwrapper">
31
+ <div class="bodywrapper">
32
+
33
+
34
+ <div class="body" role="main">
35
+
36
+ <section id="module-package.cusum">
37
+ <span id="cusum"></span><h1>CUSUM<a class="headerlink" href="#module-package.cusum" title="Link to this heading">¶</a></h1>
38
+ <p>Cumulative Sum (CUSUM)</p>
39
+ <p>&#64;author: smriti.prathapan</p>
40
+ <dl class="py class">
41
+ <dt class="sig sig-object py" id="package.cusum.CUSUM">
42
+ <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">package.cusum.</span></span><span class="sig-name descname"><span class="pre">CUSUM</span></span><a class="headerlink" href="#package.cusum.CUSUM" title="Link to this definition">¶</a></dt>
43
+ <dd><p>CUSUM class and its functionalities.</p>
44
+ <dl class="py method">
45
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.change_detection">
46
+ <span class="sig-name descname"><span class="pre">change_detection</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">normalized_ref_value</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">0.5</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">normalized_threshold</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">4</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.change_detection" title="Link to this definition">¶</a></dt>
47
+ <dd><p>Detects a change in the process.</p>
48
+ <dl class="field-list simple">
49
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
50
+ <dd class="field-odd"><ul class="simple">
51
+ <li><p><strong>pre_change_days</strong> (<em>int</em>) – Number of days for in-control phase.</p></li>
52
+ <li><p><strong>normalized_ref_value</strong> (<em>float</em><em>, </em><em>optional</em>) – Normalized reference value for detecting a unit standard deviation change in mean of the process. Defaults to 0.5.</p></li>
53
+ <li><p><strong>normalized_threshold</strong> (<em>float</em><em>, </em><em>optional</em>) – Normalized threshold. Defaults to 4.</p></li>
54
+ </ul>
55
+ </dd>
56
+ </dl>
57
+ </dd></dl>
58
+
59
+ <dl class="py method">
60
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.compute_cusum">
61
+ <span class="sig-name descname"><span class="pre">compute_cusum</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mu_0</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#package.cusum.CUSUM.compute_cusum" title="Link to this definition">¶</a></dt>
62
+ <dd><p>Compute CUSUM for the observations in x</p>
63
+ <dl class="field-list simple">
64
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
65
+ <dd class="field-odd"><ul class="simple">
66
+ <li><p><strong>x</strong> (<em>list</em><em>[</em><em>float</em><em>]</em>) – Performance metric to be monitored</p></li>
67
+ <li><p><strong>mu_0</strong> (<em>float</em>) – In-control mean of the observations/performance metric</p></li>
68
+ <li><p><strong>k</strong> (<em>float</em>) – Reference value related to the magnitude of change that one is interested in detecting</p></li>
69
+ </ul>
70
+ </dd>
71
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
72
+ <dd class="field-even"><p>Positive cumulative sum, negative cumulative sum, and CUSUM</p>
73
+ </dd>
74
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
75
+ <dd class="field-odd"><p>tuple[list[float], list[float], list[float]]</p>
76
+ </dd>
77
+ </dl>
78
+ </dd></dl>
79
+
80
+ <dl class="py method">
81
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.initialize">
82
+ <span class="sig-name descname"><span class="pre">initialize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.initialize" title="Link to this definition">¶</a></dt>
83
+ <dd><p>Initialize with the configuration file.</p>
84
+ </dd></dl>
85
+
86
+ <dl class="py method">
87
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.plot_cusum_plotly">
88
+ <span class="sig-name descname"><span class="pre">plot_cusum_plotly</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Figure</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.plot_cusum_plotly" title="Link to this definition">¶</a></dt>
89
+ <dd><p>Plot CUSUM value using Plotly</p>
90
+ <dl class="field-list simple">
91
+ <dt class="field-odd">Returns<span class="colon">:</span></dt>
92
+ <dd class="field-odd"><p>CUSUM plot using Plotly graph object.</p>
93
+ </dd>
94
+ <dt class="field-even">Return type<span class="colon">:</span></dt>
95
+ <dd class="field-even"><p>go.Figure</p>
96
+ </dd>
97
+ </dl>
98
+ </dd></dl>
99
+
100
+ <dl class="py method">
101
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.plot_input_metric_plotly">
102
+ <span class="sig-name descname"><span class="pre">plot_input_metric_plotly</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Figure</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.plot_input_metric_plotly" title="Link to this definition">¶</a></dt>
103
+ <dd><p>Plot the input metric using Plotly.</p>
104
+ <dl class="field-list simple">
105
+ <dt class="field-odd">Returns<span class="colon">:</span></dt>
106
+ <dd class="field-odd"><p>Scatter plot as Plotly graph object.</p>
107
+ </dd>
108
+ <dt class="field-even">Return type<span class="colon">:</span></dt>
109
+ <dd class="field-even"><p>go.Figure</p>
110
+ </dd>
111
+ </dl>
112
+ </dd></dl>
113
+
114
+ <dl class="py method">
115
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.plot_input_metric_plotly_raw">
116
+ <span class="sig-name descname"><span class="pre">plot_input_metric_plotly_raw</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">Figure</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.plot_input_metric_plotly_raw" title="Link to this definition">¶</a></dt>
117
+ <dd><p>Plot AI output using Plotly.</p>
118
+ <dl class="field-list simple">
119
+ <dt class="field-odd">Returns<span class="colon">:</span></dt>
120
+ <dd class="field-odd"><p>Scatter plot as Plotly graph object.</p>
121
+ </dd>
122
+ <dt class="field-even">Return type<span class="colon">:</span></dt>
123
+ <dd class="field-even"><p>go.Figure</p>
124
+ </dd>
125
+ </dl>
126
+ </dd></dl>
127
+
128
+ <dl class="py method">
129
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.set_df_metric_csv">
130
+ <span class="sig-name descname"><span class="pre">set_df_metric_csv</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data_csv</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DataFrame</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.set_df_metric_csv" title="Link to this definition">¶</a></dt>
131
+ <dd><p>Assign the performance metric data to be used for CUSUM.</p>
132
+ <dl class="field-list simple">
133
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
134
+ <dd class="field-odd"><p><strong>data_csv</strong> (<em>DataFrame</em><em> or </em><em>TextFileReader</em>) – A comma-separated values (csv) file is returned as two-dimensional data structure with labeled axes.</p>
135
+ </dd>
136
+ </dl>
137
+ </dd></dl>
138
+
139
+ <dl class="py method">
140
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.set_df_metric_default">
141
+ <span class="sig-name descname"><span class="pre">set_df_metric_default</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.set_df_metric_default" title="Link to this definition">¶</a></dt>
142
+ <dd><p>Read the provided performance metric data to be used for CUSUM for an example.</p>
143
+ </dd></dl>
144
+
145
+ <dl class="py method">
146
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.set_init_stats">
147
+ <span class="sig-name descname"><span class="pre">set_init_stats</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">init_days</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.set_init_stats" title="Link to this definition">¶</a></dt>
148
+ <dd><p>Use initial days to calculate in-control mean and standard deviation.</p>
149
+ <dl class="field-list simple">
150
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
151
+ <dd class="field-odd"><p><strong>init_days</strong> (<em>int</em><em>, </em><em>optional</em>) – Initial days when observations are considered stable. Defaults to 30.</p>
152
+ </dd>
153
+ </dl>
154
+ </dd></dl>
155
+
156
+ <dl class="py method">
157
+ <dt class="sig sig-object py" id="package.cusum.CUSUM.set_timeline">
158
+ <span class="sig-name descname"><span class="pre">set_timeline</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">ndarray</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#package.cusum.CUSUM.set_timeline" title="Link to this definition">¶</a></dt>
159
+ <dd><p>Set the timeline of observations.</p>
160
+ <dl class="field-list simple">
161
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
162
+ <dd class="field-odd"><p><strong>data</strong> (<em>np.ndarray</em>) – Data of the metric values across the observations.</p>
163
+ </dd>
164
+ </dl>
165
+ </dd></dl>
166
+
167
+ </dd></dl>
168
+
169
+ </section>
170
+
171
+
172
+ </div>
173
+
174
+ </div>
175
+ </div>
176
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
177
+ <div class="sphinxsidebarwrapper">
178
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
179
+
180
+
181
+
182
+
183
+
184
+
185
+ <p>
186
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
187
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
188
+ </p>
189
+
190
+
191
+
192
+
193
+
194
+
195
+ <search id="searchbox" style="display: none" role="search">
196
+ <div class="searchformwrapper">
197
+ <form class="search" action="search.html" method="get">
198
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
199
+ <input type="submit" value="Go" />
200
+ </form>
201
+ </div>
202
+ </search>
203
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
204
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
205
+ <ul class="current">
206
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
207
+ <li class="toctree-l1 current"><a class="current reference internal" href="#">CUSUM</a><ul>
208
+ <li class="toctree-l2"><a class="reference internal" href="#package.cusum.CUSUM"><code class="docutils literal notranslate"><span class="pre">CUSUM</span></code></a></li>
209
+ </ul>
210
+ </li>
211
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
212
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
213
+ </ul>
214
+
215
+ <div class="relations">
216
+ <h3>Related Topics</h3>
217
+ <ul>
218
+ <li><a href="index.html">Documentation overview</a><ul>
219
+ <li>Previous: <a href="ref_method.html" title="previous chapter">Methods</a></li>
220
+ <li>Next: <a href="ref_theoretical.html" title="next chapter">ARLTheoretical</a></li>
221
+ </ul></li>
222
+ </ul>
223
+ </div>
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ </div>
233
+ </div>
234
+ <div class="clearer"></div>
235
+ </div>
236
+ <div class="footer">
237
+
238
+
239
+
240
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
241
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
242
+
243
+ |
244
+ <a href="_sources/ref_cusum.rst.txt"
245
+ rel="nofollow">Page source</a>
246
+ </div>
247
+
248
+
249
+
250
+
251
+ </body>
252
+ </html>
docs/build/html/ref_method.html ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <title>Methods &#8212; AIM-CU 1.0.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
10
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
11
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
12
+ <script src="_static/documentation_options.js?v=8d563738"></script>
13
+ <script src="_static/doctools.js?v=9bcbadda"></script>
14
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
15
+ <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
16
+ <link rel="index" title="Index" href="genindex.html" />
17
+ <link rel="search" title="Search" href="search.html" />
18
+ <link rel="next" title="CUSUM" href="ref_cusum.html" />
19
+ <link rel="prev" title="AIM-CU documentation" href="index.html" />
20
+
21
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
22
+
23
+
24
+
25
+
26
+
27
+ </head><body>
28
+
29
+
30
+ <div class="document">
31
+ <div class="documentwrapper">
32
+ <div class="bodywrapper">
33
+
34
+
35
+ <div class="body" role="main">
36
+
37
+ <section id="methods">
38
+ <h1>Methods<a class="headerlink" href="#methods" title="Link to this heading">¶</a></h1>
39
+ <section id="cusum-parameters">
40
+ <h2>CUSUM parameters<a class="headerlink" href="#cusum-parameters" title="Link to this heading">¶</a></h2>
41
+ <table class="docutils align-default" id="id1">
42
+ <caption><span class="caption-text">CUSUM parameters</span><a class="headerlink" href="#id1" title="Link to this table">¶</a></caption>
43
+ <thead>
44
+ <tr class="row-odd"><th class="head"><p>Parameter</p></th>
45
+ <th class="head"><p>Description</p></th>
46
+ </tr>
47
+ </thead>
48
+ <tbody>
49
+ <tr class="row-even"><td><p>μ_in</p></td>
50
+ <td><p>The mean of the performance metric when the process is in-control, i.e., when there is no performance drift</p></td>
51
+ </tr>
52
+ <tr class="row-odd"><td><p>ARL_0</p></td>
53
+ <td><p>Number of observations before the control chart signals a false detection</p></td>
54
+ </tr>
55
+ <tr class="row-even"><td><p>σ_in</p></td>
56
+ <td><p>The in-control standard deviation of the metric</p></td>
57
+ </tr>
58
+ <tr class="row-odd"><td><p>ARL_1</p></td>
59
+ <td><p>Number of observations before the control chart signals a true detection</p></td>
60
+ </tr>
61
+ <tr class="row-even"><td><p>k</p></td>
62
+ <td><p>The normalized reference value, which is related to the magnitude of change that one is interested in detecting. k = 0.5 is the default choice for detecting a unit standard deviation change</p></td>
63
+ </tr>
64
+ <tr class="row-odd"><td><p>S_hi</p></td>
65
+ <td><p>Cumulative sum of positive changes in the metric</p></td>
66
+ </tr>
67
+ <tr class="row-even"><td><p>h</p></td>
68
+ <td><p>The normalized threshold or control limit (default =4). This threshold determines when the control chart signals a detection</p></td>
69
+ </tr>
70
+ <tr class="row-odd"><td><p>S_lo</p></td>
71
+ <td><p>Cumulative sum of negative changes in the metric</p></td>
72
+ </tr>
73
+ </tbody>
74
+ </table>
75
+ </section>
76
+ <section id="cusum-chart">
77
+ <h2>CUSUM chart<a class="headerlink" href="#cusum-chart" title="Link to this heading">¶</a></h2>
78
+ <p>A two-sided CUSUM control chart computes the cumulative differences or
79
+ deviations of individual observations from the target mean (or
80
+ in-control mean, <span class="math notranslate nohighlight">\(\mu_{in}\)</span>). The positive and negative cumulative
81
+ sums are calculated:</p>
82
+ <div class="math notranslate nohighlight">
83
+ \[\begin{split}\\ S_{hi}(d) = max(0, S_{hi}(d-1) + x_d - \hat{\mu}_{in} - K)
84
+ \\ S_{lo}(d) = max(0, S_{lo}(d-1) - x_d + \hat{\mu}_{in} - K)\end{split}\]</div>
85
+ <p>where <em>d</em> denotes a unit of time, <span class="math notranslate nohighlight">\(x_d\)</span> is the value of quantity
86
+ being monitored at time <span class="math notranslate nohighlight">\(d\)</span>, <span class="math notranslate nohighlight">\(\hat{\mu}_{in}\)</span> is the
87
+ in-control mean of <span class="math notranslate nohighlight">\(x_d\)</span>, and <span class="math notranslate nohighlight">\(K\)</span> is a “reference value”
88
+ related to the magnitude of change that one is interested in detecting.
89
+ <span class="math notranslate nohighlight">\(S_{hi}\)</span> and <span class="math notranslate nohighlight">\(S_{lo}\)</span> are the cumulative sum of positive and
90
+ negative changes. To detect a change in the observed values from the
91
+ in-control mean, the CUSUM scheme accumulates deviations that are
92
+ <span class="math notranslate nohighlight">\(K\)</span> units away from the in-control mean. Let <span class="math notranslate nohighlight">\(\sigma_{in}\)</span>
93
+ denote the in-control standard deviation of <span class="math notranslate nohighlight">\(x_d\)</span>.</p>
94
+ </section>
95
+ </section>
96
+
97
+
98
+ </div>
99
+
100
+ </div>
101
+ </div>
102
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
103
+ <div class="sphinxsidebarwrapper">
104
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
105
+
106
+
107
+
108
+
109
+
110
+
111
+ <p>
112
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
113
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
114
+ </p>
115
+
116
+
117
+
118
+
119
+
120
+
121
+ <search id="searchbox" style="display: none" role="search">
122
+ <div class="searchformwrapper">
123
+ <form class="search" action="search.html" method="get">
124
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
125
+ <input type="submit" value="Go" />
126
+ </form>
127
+ </div>
128
+ </search>
129
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
130
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
131
+ <ul class="current">
132
+ <li class="toctree-l1 current"><a class="current reference internal" href="#">Methods</a><ul>
133
+ <li class="toctree-l2"><a class="reference internal" href="#cusum-parameters">CUSUM parameters</a></li>
134
+ <li class="toctree-l2"><a class="reference internal" href="#cusum-chart">CUSUM chart</a></li>
135
+ </ul>
136
+ </li>
137
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
138
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
139
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
140
+ </ul>
141
+
142
+ <div class="relations">
143
+ <h3>Related Topics</h3>
144
+ <ul>
145
+ <li><a href="index.html">Documentation overview</a><ul>
146
+ <li>Previous: <a href="index.html" title="previous chapter">AIM-CU documentation</a></li>
147
+ <li>Next: <a href="ref_cusum.html" title="next chapter">CUSUM</a></li>
148
+ </ul></li>
149
+ </ul>
150
+ </div>
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+ </div>
160
+ </div>
161
+ <div class="clearer"></div>
162
+ </div>
163
+ <div class="footer">
164
+
165
+
166
+
167
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
168
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
169
+
170
+ |
171
+ <a href="_sources/ref_method.rst.txt"
172
+ rel="nofollow">Page source</a>
173
+ </div>
174
+
175
+
176
+
177
+
178
+ </body>
179
+ </html>
docs/build/html/ref_theoretical.html ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <title>ARLTheoretical &#8212; AIM-CU 1.0.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
10
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
11
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
12
+ <script src="_static/documentation_options.js?v=8d563738"></script>
13
+ <script src="_static/doctools.js?v=9bcbadda"></script>
14
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
15
+ <link rel="index" title="Index" href="genindex.html" />
16
+ <link rel="search" title="Search" href="search.html" />
17
+ <link rel="next" title="Utils" href="ref_utils.html" />
18
+ <link rel="prev" title="CUSUM" href="ref_cusum.html" />
19
+
20
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
21
+
22
+
23
+
24
+
25
+
26
+ </head><body>
27
+
28
+
29
+ <div class="document">
30
+ <div class="documentwrapper">
31
+ <div class="bodywrapper">
32
+
33
+
34
+ <div class="body" role="main">
35
+
36
+ <section id="module-package.ARLTheoretical">
37
+ <span id="arltheoretical"></span><h1>ARLTheoretical<a class="headerlink" href="#module-package.ARLTheoretical" title="Link to this heading">¶</a></h1>
38
+ <p>ARLTheoretical</p>
39
+ <p>&#64;author: smriti.prathapan</p>
40
+ <dl class="py function">
41
+ <dt class="sig sig-object py" id="package.ARLTheoretical.get_ARL_1">
42
+ <span class="sig-prename descclassname"><span class="pre">package.ARLTheoretical.</span></span><span class="sig-name descname"><span class="pre">get_ARL_1</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">shift_in_mean</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dict_ARL0_k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">OrderedDict</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">DataFrame</span></span></span><a class="headerlink" href="#package.ARLTheoretical.get_ARL_1" title="Link to this definition">¶</a></dt>
43
+ <dd><p>Get the ARL1 along with k values.</p>
44
+ <dl class="field-list simple">
45
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
46
+ <dd class="field-odd"><ul class="simple">
47
+ <li><p><strong>h</strong> (<em>float</em>) – Normalized threshold.</p></li>
48
+ <li><p><strong>shift_in_mean</strong> (<em>list</em><em>[</em><em>float</em><em>]</em>) – List of the values of shift in mean.</p></li>
49
+ <li><p><strong>dict_ARL0_k</strong> (<em>OrderedDict</em>) – Data dictionary of ARL0 and k</p></li>
50
+ </ul>
51
+ </dd>
52
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
53
+ <dd class="field-even"><p>Table for ARL1 and k values.</p>
54
+ </dd>
55
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
56
+ <dd class="field-odd"><p>pd.DataFrame</p>
57
+ </dd>
58
+ </dl>
59
+ </dd></dl>
60
+
61
+ <dl class="py function">
62
+ <dt class="sig sig-object py" id="package.ARLTheoretical.get_ARL_1_h_mu1_k">
63
+ <span class="sig-prename descclassname"><span class="pre">package.ARLTheoretical.</span></span><span class="sig-name descname"><span class="pre">get_ARL_1_h_mu1_k</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mu1</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">float</span></span></span><a class="headerlink" href="#package.ARLTheoretical.get_ARL_1_h_mu1_k" title="Link to this definition">¶</a></dt>
64
+ <dd><p>Calculate ARL_1 with given Shift in Mean (mu1) and k.</p>
65
+ <dl class="field-list simple">
66
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
67
+ <dd class="field-odd"><ul class="simple">
68
+ <li><p><strong>h</strong> (<em>float</em>) – Normalized threshold.</p></li>
69
+ <li><p><strong>k</strong> (<em>float</em>) – Normalized reference value.</p></li>
70
+ <li><p><strong>mu1</strong> (<em>float</em>) – Intended shift in mean.</p></li>
71
+ </ul>
72
+ </dd>
73
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
74
+ <dd class="field-even"><p>Detection delay (ARL1).</p>
75
+ </dd>
76
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
77
+ <dd class="field-odd"><p>float</p>
78
+ </dd>
79
+ </dl>
80
+ </dd></dl>
81
+
82
+ <dl class="py function">
83
+ <dt class="sig sig-object py" id="package.ARLTheoretical.get_ref_value">
84
+ <span class="sig-prename descclassname"><span class="pre">package.ARLTheoretical.</span></span><span class="sig-name descname"><span class="pre">get_ref_value</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">list_ARL_0</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">list</span><span class="p"><span class="pre">[</span></span><span class="pre">float</span><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">tuple</span><span class="p"><span class="pre">[</span></span><span class="pre">DataFrame</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">OrderedDict</span><span class="p"><span class="pre">]</span></span></span></span><a class="headerlink" href="#package.ARLTheoretical.get_ref_value" title="Link to this definition">¶</a></dt>
85
+ <dd><p>provides normalized reference values k for provided list of ARL0, given the value of normalized threshold h.</p>
86
+ <dl class="field-list simple">
87
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
88
+ <dd class="field-odd"><ul class="simple">
89
+ <li><p><strong>h</strong> (<em>float</em>) – Normalized threshold.</p></li>
90
+ <li><p><strong>list_ARL_0</strong> (<em>list</em>) – List of ARL0 values.</p></li>
91
+ </ul>
92
+ </dd>
93
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
94
+ <dd class="field-even"><p>Dataframe of ARL0 and k, Data dictionary of ARL0 and k; where k is normalized reference value.</p>
95
+ </dd>
96
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
97
+ <dd class="field-odd"><p>tuple[pd.Dataframe, OrderedDict]</p>
98
+ </dd>
99
+ </dl>
100
+ </dd></dl>
101
+
102
+ <dl class="py function">
103
+ <dt class="sig sig-object py" id="package.ARLTheoretical.get_ref_value_k">
104
+ <span class="sig-prename descclassname"><span class="pre">package.ARLTheoretical.</span></span><span class="sig-name descname"><span class="pre">get_ref_value_k</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">h</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ARL_0</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">float</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">float</span></span></span><a class="headerlink" href="#package.ARLTheoretical.get_ref_value_k" title="Link to this definition">¶</a></dt>
105
+ <dd><p>Calculation for the reference value for given h and ARL_0.</p>
106
+ <dl class="field-list simple">
107
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
108
+ <dd class="field-odd"><ul class="simple">
109
+ <li><p><strong>h</strong> (<em>float</em>) – Normalized threshold.</p></li>
110
+ <li><p><strong>ARL_0</strong> (<em>float</em>) – ARL0 value.</p></li>
111
+ </ul>
112
+ </dd>
113
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
114
+ <dd class="field-even"><p>Normalized reference value k.</p>
115
+ </dd>
116
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
117
+ <dd class="field-odd"><p>float</p>
118
+ </dd>
119
+ </dl>
120
+ </dd></dl>
121
+
122
+ </section>
123
+
124
+
125
+ </div>
126
+
127
+ </div>
128
+ </div>
129
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
130
+ <div class="sphinxsidebarwrapper">
131
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
132
+
133
+
134
+
135
+
136
+
137
+
138
+ <p>
139
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
140
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
141
+ </p>
142
+
143
+
144
+
145
+
146
+
147
+
148
+ <search id="searchbox" style="display: none" role="search">
149
+ <div class="searchformwrapper">
150
+ <form class="search" action="search.html" method="get">
151
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
152
+ <input type="submit" value="Go" />
153
+ </form>
154
+ </div>
155
+ </search>
156
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
157
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
158
+ <ul class="current">
159
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
160
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
161
+ <li class="toctree-l1 current"><a class="current reference internal" href="#">ARLTheoretical</a><ul>
162
+ <li class="toctree-l2"><a class="reference internal" href="#package.ARLTheoretical.get_ARL_1"><code class="docutils literal notranslate"><span class="pre">get_ARL_1()</span></code></a></li>
163
+ <li class="toctree-l2"><a class="reference internal" href="#package.ARLTheoretical.get_ARL_1_h_mu1_k"><code class="docutils literal notranslate"><span class="pre">get_ARL_1_h_mu1_k()</span></code></a></li>
164
+ <li class="toctree-l2"><a class="reference internal" href="#package.ARLTheoretical.get_ref_value"><code class="docutils literal notranslate"><span class="pre">get_ref_value()</span></code></a></li>
165
+ <li class="toctree-l2"><a class="reference internal" href="#package.ARLTheoretical.get_ref_value_k"><code class="docutils literal notranslate"><span class="pre">get_ref_value_k()</span></code></a></li>
166
+ </ul>
167
+ </li>
168
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
169
+ </ul>
170
+
171
+ <div class="relations">
172
+ <h3>Related Topics</h3>
173
+ <ul>
174
+ <li><a href="index.html">Documentation overview</a><ul>
175
+ <li>Previous: <a href="ref_cusum.html" title="previous chapter">CUSUM</a></li>
176
+ <li>Next: <a href="ref_utils.html" title="next chapter">Utils</a></li>
177
+ </ul></li>
178
+ </ul>
179
+ </div>
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+ </div>
189
+ </div>
190
+ <div class="clearer"></div>
191
+ </div>
192
+ <div class="footer">
193
+
194
+
195
+
196
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
197
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
198
+
199
+ |
200
+ <a href="_sources/ref_theoretical.rst.txt"
201
+ rel="nofollow">Page source</a>
202
+ </div>
203
+
204
+
205
+
206
+
207
+ </body>
208
+ </html>
docs/build/html/ref_utils.html ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
7
+
8
+ <title>Utils &#8212; AIM-CU 1.0.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
10
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
11
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
12
+ <script src="_static/documentation_options.js?v=8d563738"></script>
13
+ <script src="_static/doctools.js?v=9bcbadda"></script>
14
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
15
+ <link rel="index" title="Index" href="genindex.html" />
16
+ <link rel="search" title="Search" href="search.html" />
17
+ <link rel="prev" title="ARLTheoretical" href="ref_theoretical.html" />
18
+
19
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
20
+
21
+
22
+
23
+
24
+
25
+ </head><body>
26
+
27
+
28
+ <div class="document">
29
+ <div class="documentwrapper">
30
+ <div class="bodywrapper">
31
+
32
+
33
+ <div class="body" role="main">
34
+
35
+ <section id="module-package.utils">
36
+ <span id="utils"></span><h1>Utils<a class="headerlink" href="#module-package.utils" title="Link to this heading">¶</a></h1>
37
+ <p>Utilities to handle different operations</p>
38
+ <dl class="py function">
39
+ <dt class="sig sig-object py" id="package.utils.get_greattable_as_html">
40
+ <span class="sig-prename descclassname"><span class="pre">package.utils.</span></span><span class="sig-name descname"><span class="pre">get_greattable_as_html</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">df</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DataFrame</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">GT</span></span></span><a class="headerlink" href="#package.utils.get_greattable_as_html" title="Link to this definition">¶</a></dt>
41
+ <dd><p>Get the great_table as HTML from Pandas dataframe.</p>
42
+ <dl class="field-list simple">
43
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
44
+ <dd class="field-odd"><p><strong>df</strong> (<em>pd.DataFrame</em>) – Dataframe to rendera as a table.</p>
45
+ </dd>
46
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
47
+ <dd class="field-even"><p>Table in HTML format.</p>
48
+ </dd>
49
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
50
+ <dd class="field-odd"><p>gt.GT</p>
51
+ </dd>
52
+ </dl>
53
+ </dd></dl>
54
+
55
+ <dl class="py function">
56
+ <dt class="sig sig-object py" id="package.utils.populate_summary_table_ARL0_k">
57
+ <span class="sig-prename descclassname"><span class="pre">package.utils.</span></span><span class="sig-name descname"><span class="pre">populate_summary_table_ARL0_k</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">summary_table_df_ARL0_k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DataFrame</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">h</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">GT</span></span></span><a class="headerlink" href="#package.utils.populate_summary_table_ARL0_k" title="Link to this definition">¶</a></dt>
58
+ <dd><p>Populate ARLTheoretical.summary_table_df_ARL0_k.</p>
59
+ <dl class="field-list simple">
60
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
61
+ <dd class="field-odd"><ul class="simple">
62
+ <li><p><strong>summary_table_df_ARL0_k</strong> (<em>pd.DataFrame</em>) – Dataframe of ARL0 and its respective values of k.</p></li>
63
+ <li><p><strong>h</strong> (<em>float</em>) – Normalized threshold.</p></li>
64
+ </ul>
65
+ </dd>
66
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
67
+ <dd class="field-even"><p>Table of ARL0 and k in HTML format.</p>
68
+ </dd>
69
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
70
+ <dd class="field-odd"><p>gt.GT</p>
71
+ </dd>
72
+ </dl>
73
+ </dd></dl>
74
+
75
+ <dl class="py function">
76
+ <dt class="sig sig-object py" id="package.utils.populate_summary_table_ARL1_k">
77
+ <span class="sig-prename descclassname"><span class="pre">package.utils.</span></span><span class="sig-name descname"><span class="pre">populate_summary_table_ARL1_k</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">summary_table_df_ARL1_k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">DataFrame</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dict_ARL0_k</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">OrderedDict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">h</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">GT</span></span></span><a class="headerlink" href="#package.utils.populate_summary_table_ARL1_k" title="Link to this definition">¶</a></dt>
78
+ <dd><p>Populate Multiindex table specific for ARLTheoretical.summary_table_df_ARL1_k</p>
79
+ <dl class="field-list simple">
80
+ <dt class="field-odd">Parameters<span class="colon">:</span></dt>
81
+ <dd class="field-odd"><ul class="simple">
82
+ <li><p><strong>summary_table_df_ARL1_k</strong> (<em>pd.DataFrame</em>) – Dataframe with ARL1 and k values.</p></li>
83
+ <li><p><strong>dict_ARL0_k</strong> (<em>OrderedDict</em>) – Data Dictionary with the mapping between ARL0 and k.</p></li>
84
+ <li><p><strong>h</strong> (<em>float</em>) – Normalized threshold.</p></li>
85
+ </ul>
86
+ </dd>
87
+ <dt class="field-even">Returns<span class="colon">:</span></dt>
88
+ <dd class="field-even"><p>Table for ARL1 and k in HTML format.</p>
89
+ </dd>
90
+ <dt class="field-odd">Return type<span class="colon">:</span></dt>
91
+ <dd class="field-odd"><p>gt.GT</p>
92
+ </dd>
93
+ </dl>
94
+ </dd></dl>
95
+
96
+ </section>
97
+
98
+
99
+ </div>
100
+
101
+ </div>
102
+ </div>
103
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
104
+ <div class="sphinxsidebarwrapper">
105
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
106
+
107
+
108
+
109
+
110
+
111
+
112
+ <p>
113
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
114
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
115
+ </p>
116
+
117
+
118
+
119
+
120
+
121
+
122
+ <search id="searchbox" style="display: none" role="search">
123
+ <div class="searchformwrapper">
124
+ <form class="search" action="search.html" method="get">
125
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
126
+ <input type="submit" value="Go" />
127
+ </form>
128
+ </div>
129
+ </search>
130
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
131
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
132
+ <ul class="current">
133
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
134
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
135
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
136
+ <li class="toctree-l1 current"><a class="current reference internal" href="#">Utils</a><ul>
137
+ <li class="toctree-l2"><a class="reference internal" href="#package.utils.get_greattable_as_html"><code class="docutils literal notranslate"><span class="pre">get_greattable_as_html()</span></code></a></li>
138
+ <li class="toctree-l2"><a class="reference internal" href="#package.utils.populate_summary_table_ARL0_k"><code class="docutils literal notranslate"><span class="pre">populate_summary_table_ARL0_k()</span></code></a></li>
139
+ <li class="toctree-l2"><a class="reference internal" href="#package.utils.populate_summary_table_ARL1_k"><code class="docutils literal notranslate"><span class="pre">populate_summary_table_ARL1_k()</span></code></a></li>
140
+ </ul>
141
+ </li>
142
+ </ul>
143
+
144
+ <div class="relations">
145
+ <h3>Related Topics</h3>
146
+ <ul>
147
+ <li><a href="index.html">Documentation overview</a><ul>
148
+ <li>Previous: <a href="ref_theoretical.html" title="previous chapter">ARLTheoretical</a></li>
149
+ </ul></li>
150
+ </ul>
151
+ </div>
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+ </div>
161
+ </div>
162
+ <div class="clearer"></div>
163
+ </div>
164
+ <div class="footer">
165
+
166
+
167
+
168
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
169
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
170
+
171
+ |
172
+ <a href="_sources/ref_utils.rst.txt"
173
+ rel="nofollow">Page source</a>
174
+ </div>
175
+
176
+
177
+
178
+
179
+ </body>
180
+ </html>
docs/build/html/search.html ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en" data-content_root="./">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Search &#8212; AIM-CU 1.0.0 documentation</title>
8
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
9
+ <link rel="stylesheet" type="text/css" href="_static/basic.css?v=d35aba6c" />
10
+ <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=0ca6144b" />
11
+
12
+ <script src="_static/documentation_options.js?v=8d563738"></script>
13
+ <script src="_static/doctools.js?v=9bcbadda"></script>
14
+ <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
15
+ <script src="_static/searchtools.js"></script>
16
+ <script src="_static/language_data.js"></script>
17
+ <link rel="index" title="Index" href="genindex.html" />
18
+ <link rel="search" title="Search" href="#" />
19
+ <script src="searchindex.js" defer="defer"></script>
20
+ <meta name="robots" content="noindex" />
21
+
22
+
23
+ <link rel="stylesheet" href="_static/custom.css" type="text/css" />
24
+
25
+
26
+
27
+
28
+
29
+
30
+ </head><body>
31
+
32
+
33
+ <div class="document">
34
+ <div class="documentwrapper">
35
+ <div class="bodywrapper">
36
+
37
+
38
+ <div class="body" role="main">
39
+
40
+ <h1 id="search-documentation">Search</h1>
41
+
42
+ <noscript>
43
+ <div class="admonition warning">
44
+ <p>
45
+ Please activate JavaScript to enable the search
46
+ functionality.
47
+ </p>
48
+ </div>
49
+ </noscript>
50
+
51
+
52
+ <p>
53
+ Searching for multiple words only shows matches that contain
54
+ all words.
55
+ </p>
56
+
57
+
58
+ <form action="" method="get">
59
+ <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
60
+ <input type="submit" value="search" />
61
+ <span id="search-progress" style="padding-left: 10px"></span>
62
+ </form>
63
+
64
+
65
+ <div id="search-results"></div>
66
+
67
+
68
+ </div>
69
+
70
+ </div>
71
+ </div>
72
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
73
+ <div class="sphinxsidebarwrapper">
74
+ <h1 class="logo"><a href="index.html">AIM-CU</a></h1>
75
+
76
+
77
+
78
+
79
+
80
+
81
+ <p>
82
+ <iframe src="https://ghbtns.com/github-btn.html?user=DIDSR&repo=AIM-CU&type=watch&count=true&size=large&v=2"
83
+ allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
84
+ </p>
85
+
86
+
87
+
88
+
89
+
90
+ <h3>Navigation</h3>
91
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
92
+ <ul>
93
+ <li class="toctree-l1"><a class="reference internal" href="ref_method.html">Methods</a></li>
94
+ <li class="toctree-l1"><a class="reference internal" href="ref_cusum.html">CUSUM</a></li>
95
+ <li class="toctree-l1"><a class="reference internal" href="ref_theoretical.html">ARLTheoretical</a></li>
96
+ <li class="toctree-l1"><a class="reference internal" href="ref_utils.html">Utils</a></li>
97
+ </ul>
98
+
99
+ <div class="relations">
100
+ <h3>Related Topics</h3>
101
+ <ul>
102
+ <li><a href="index.html">Documentation overview</a><ul>
103
+ </ul></li>
104
+ </ul>
105
+ </div>
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+ </div>
115
+ </div>
116
+ <div class="clearer"></div>
117
+ </div>
118
+ <div class="footer">
119
+
120
+
121
+
122
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
123
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
124
+
125
+ </div>
126
+
127
+
128
+
129
+
130
+ </body>
131
+ </html>
docs/build/html/searchindex.js ADDED
@@ -0,0 +1 @@
 
 
1
+ Search.setIndex({"alltitles": {"AIM-CU documentation": [[0, null]], "ARLTheoretical": [[3, null]], "CUSUM": [[1, null]], "CUSUM chart": [[2, "cusum-chart"]], "CUSUM parameters": [[2, "cusum-parameters"], [2, "id1"]], "Code execution": [[0, "code-execution"]], "Contents:": [[0, null]], "Demo": [[0, "demo"]], "Methods": [[2, null]], "Utils": [[4, null]]}, "docnames": ["index", "ref_cusum", "ref_method", "ref_theoretical", "ref_utils"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["index.rst", "ref_cusum.rst", "ref_method.rst", "ref_theoretical.rst", "ref_utils.rst"], "indexentries": {"change_detection() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.change_detection", false]], "compute_cusum() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.compute_cusum", false]], "cusum (class in package.cusum)": [[1, "package.cusum.CUSUM", false]], "initialize() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.initialize", false]], "module": [[1, "module-package.cusum", false]], "package.cusum": [[1, "module-package.cusum", false]], "plot_cusum_plotly() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.plot_cusum_plotly", false]], "plot_input_metric_plotly() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.plot_input_metric_plotly", false]], "plot_input_metric_plotly_raw() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.plot_input_metric_plotly_raw", false]], "set_df_metric_csv() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.set_df_metric_csv", false]], "set_df_metric_default() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.set_df_metric_default", false]], "set_init_stats() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.set_init_stats", false]], "set_timeline() (package.cusum.cusum method)": [[1, "package.cusum.CUSUM.set_timeline", false]]}, "objects": {"package": [[3, 0, 0, "-", "ARLTheoretical"], [1, 0, 0, "-", "cusum"], [4, 0, 0, "-", "utils"]], "package.ARLTheoretical": [[3, 1, 1, "", "get_ARL_1"], [3, 1, 1, "", "get_ARL_1_h_mu1_k"], [3, 1, 1, "", "get_ref_value"], [3, 1, 1, "", "get_ref_value_k"]], "package.cusum": [[1, 2, 1, "", "CUSUM"]], "package.cusum.CUSUM": [[1, 3, 1, "", "change_detection"], [1, 3, 1, "", "compute_cusum"], [1, 3, 1, "", "initialize"], [1, 3, 1, "", "plot_cusum_plotly"], [1, 3, 1, "", "plot_input_metric_plotly"], [1, 3, 1, "", "plot_input_metric_plotly_raw"], [1, 3, 1, "", "set_df_metric_csv"], [1, 3, 1, "", "set_df_metric_default"], [1, 3, 1, "", "set_init_stats"], [1, 3, 1, "", "set_timeline"]], "package.utils": [[4, 1, 1, "", "get_greattable_as_html"], [4, 1, 1, "", "populate_summary_table_ARL0_k"], [4, 1, 1, "", "populate_summary_table_ARL1_k"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method"}, "terms": {"0": [0, 1, 2], "1": 2, "10": 0, "3": 0, "30": 1, "4": [1, 2], "5": [1, 2], "7860": 0, "A": [0, 1, 2], "If": 0, "In": 1, "The": [0, 2], "To": 2, "_": 2, "accept": 0, "accumul": 2, "across": 1, "ai": [0, 1], "alarm": 0, "along": 3, "also": 0, "an": [0, 1], "app": 0, "apt": 0, "ar": [1, 2], "arl0": [3, 4], "arl1": [3, 4], "arl_0": [2, 3], "arl_1": [2, 3], "arltheoret": [0, 4], "assign": 1, "author": [1, 3], "avail": 0, "awai": 2, "ax": 1, "base": 0, "befor": 2, "being": 2, "between": 4, "button": 0, "calcul": [1, 2, 3], "can": 0, "cd": 0, "chang": [0, 1, 2], "change_detect": 1, "chart": 0, "choic": [0, 2], "class": 1, "click": 0, "clone": 0, "co": 0, "com": 0, "comma": 1, "command": 0, "comput": [0, 1, 2], "compute_cusum": 1, "configur": 1, "consid": 1, "control": [1, 2], "csv": 1, "cumul": [0, 1, 2], "cusum": 0, "d": 2, "dai": 1, "data": [1, 3, 4], "data_csv": 1, "datafram": [1, 3, 4], "default": [1, 2], "delai": [0, 3], "denot": 2, "depend": 0, "descript": 2, "detect": [0, 1, 2, 3], "determin": 2, "deviat": [1, 2], "df": 4, "dict_arl0_k": [3, 4], "dictionari": [3, 4], "didsr": 0, "differ": [2, 4], "dimension": 1, "displac": 0, "drift": 2, "e": 2, "estim": 0, "exampl": 1, "fals": [0, 2], "figur": 1, "file": 1, "float": [1, 3, 4], "follow": 0, "format": 4, "from": [0, 2, 4], "function": 1, "get": [0, 3, 4], "get_arl_1": [0, 3], "get_arl_1_h_mu1_k": [0, 3], "get_greattable_as_html": [0, 4], "get_ref_valu": [0, 3], "get_ref_value_k": [0, 3], "git": 0, "github": 0, "given": [0, 3], "go": 1, "graph": 1, "great_tabl": 4, "gt": 4, "h": [2, 3, 4], "handl": 4, "hat": 2, "hi": 2, "html": 4, "http": 0, "huggingfac": 0, "i": [0, 1, 2, 3], "individu": 2, "init_dai": 1, "initi": 1, "input": 1, "instal": 0, "int": 1, "intend": 3, "interest": [1, 2], "its": [1, 4], "k": [1, 2, 3, 4], "label": 1, "let": 2, "limit": 2, "list": [1, 3], "list_arl_0": 3, "lo": 2, "local": 0, "magnitud": [1, 2], "map": 4, "max": 2, "mean": [1, 2, 3], "method": 0, "metric": [0, 1, 2], "monitor": [0, 1, 2], "mu": 2, "mu1": 3, "mu_": 2, "mu_0": 1, "multiindex": 4, "ndarrai": 1, "neg": [1, 2], "none": 1, "normal": [1, 2, 3, 4], "normalized_ref_valu": 1, "normalized_threshold": 1, "np": 1, "number": [1, 2], "object": 1, "observ": [1, 2], "one": [1, 2], "open": 0, "oper": 4, "option": 1, "ordereddict": [3, 4], "output": 1, "packag": [1, 3, 4], "panda": 4, "paramet": [0, 1, 3, 4], "paus": 0, "pd": [3, 4], "perform": [0, 1, 2], "phase": 1, "pip": 0, "plot": 1, "plot_cusum_plotli": 1, "plot_input_metric_plotli": 1, "plot_input_metric_plotly_raw": 1, "plotli": 1, "point": 0, "popul": 4, "populate_summary_table_arl0_k": [0, 4], "populate_summary_table_arl1_k": [0, 4], "posit": [1, 2], "prathapan": [1, 3], "pre_change_dai": 1, "process": [1, 2], "provid": [1, 3], "py": 0, "python": 0, "python3": 0, "quantiti": 2, "r": 0, "rate": 0, "read": 1, "refer": [1, 2, 3], "relat": [1, 2], "rendera": 4, "repositori": 0, "requir": 0, "respect": 4, "restart": 0, "return": [1, 3, 4], "run": 0, "s_": 2, "s_hi": 2, "s_lo": 2, "scatter": 1, "scheme": 2, "separ": 1, "set": 1, "set_df_metric_csv": 1, "set_df_metric_default": 1, "set_init_stat": 1, "set_timelin": 1, "shift": 3, "shift_in_mean": 3, "side": 2, "sigma_": 2, "signal": 2, "smriti": [1, 3], "space": 0, "specif": 4, "stabl": 1, "standard": [1, 2], "statist": 0, "structur": 1, "sum": [0, 1, 2], "summary_table_df_arl0_k": 4, "summary_table_df_arl1_k": 4, "tabl": [3, 4], "target": [0, 2], "textfileread": 1, "thi": 2, "those": 0, "threshold": [1, 2, 3, 4], "through": 0, "time": 2, "timelin": 1, "tool": 0, "true": 2, "tupl": [1, 3], "two": [1, 2], "txt": 0, "type": [1, 3, 4], "unit": [1, 2], "url": 0, "us": [0, 1], "util": 0, "valu": [1, 2, 3, 4], "when": [1, 2], "where": [2, 3], "which": 2, "x": 1, "x_d": 2, "y": 0, "\u03bc_in": 2, "\u03c3_in": 2}, "titles": ["AIM-CU documentation", "CUSUM", "Methods", "ARLTheoretical", "Utils"], "titleterms": {"aim": 0, "arltheoret": 3, "chart": 2, "code": 0, "content": 0, "cu": 0, "cusum": [1, 2], "demo": 0, "document": 0, "execut": 0, "method": 2, "paramet": 2, "util": 4}})
docs/build/latex/LICRcyr2utf8.xdy ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ;; -*- coding: utf-8; mode: Lisp; -*-
2
+ ;; style file for xindy
3
+ ;; filename: LICRcyr2utf8.xdy
4
+ ;; description: style file for xindy which maps back LaTeX Internal
5
+ ;; Character Representation of Cyrillic to utf-8
6
+ ;; usage: for use with pdflatex produced .idx files.
7
+ ;; Contributed by the Sphinx team, July 2018.
8
+ (merge-rule "\IeC {\'\CYRG }" "Ѓ" :string)
9
+ (merge-rule "\IeC {\'\CYRK }" "Ќ" :string)
10
+ (merge-rule "\IeC {\'\cyrg }" "ѓ" :string)
11
+ (merge-rule "\IeC {\'\cyrk }" "ќ" :string)
12
+ (merge-rule "\IeC {\CYRA }" "А" :string)
13
+ (merge-rule "\IeC {\CYRB }" "Б" :string)
14
+ (merge-rule "\IeC {\CYRC }" "Ц" :string)
15
+ (merge-rule "\IeC {\CYRCH }" "Ч" :string)
16
+ (merge-rule "\IeC {\CYRD }" "Д" :string)
17
+ (merge-rule "\IeC {\CYRDJE }" "Ђ" :string)
18
+ (merge-rule "\IeC {\CYRDZE }" "Ѕ" :string)
19
+ (merge-rule "\IeC {\CYRDZHE }" "Џ" :string)
20
+ (merge-rule "\IeC {\CYRE }" "Е" :string)
21
+ (merge-rule "\IeC {\CYREREV }" "Э" :string)
22
+ (merge-rule "\IeC {\CYRERY }" "Ы" :string)
23
+ (merge-rule "\IeC {\CYRF }" "Ф" :string)
24
+ (merge-rule "\IeC {\CYRG }" "Г" :string)
25
+ (merge-rule "\IeC {\CYRGUP }" "Ґ" :string)
26
+ (merge-rule "\IeC {\CYRH }" "Х" :string)
27
+ (merge-rule "\IeC {\CYRHRDSN }" "Ъ" :string)
28
+ (merge-rule "\IeC {\CYRI }" "И" :string)
29
+ (merge-rule "\IeC {\CYRIE }" "Є" :string)
30
+ (merge-rule "\IeC {\CYRII }" "І" :string)
31
+ (merge-rule "\IeC {\CYRISHRT }" "Й" :string)
32
+ (merge-rule "\IeC {\CYRJE }" "Ј" :string)
33
+ (merge-rule "\IeC {\CYRK }" "К" :string)
34
+ (merge-rule "\IeC {\CYRL }" "Л" :string)
35
+ (merge-rule "\IeC {\CYRLJE }" "Љ" :string)
36
+ (merge-rule "\IeC {\CYRM }" "М" :string)
37
+ (merge-rule "\IeC {\CYRN }" "Н" :string)
38
+ (merge-rule "\IeC {\CYRNJE }" "Њ" :string)
39
+ (merge-rule "\IeC {\CYRO }" "О" :string)
40
+ (merge-rule "\IeC {\CYRP }" "П" :string)
41
+ (merge-rule "\IeC {\CYRR }" "Р" :string)
42
+ (merge-rule "\IeC {\CYRS }" "С" :string)
43
+ (merge-rule "\IeC {\CYRSFTSN }" "Ь" :string)
44
+ (merge-rule "\IeC {\CYRSH }" "Ш" :string)
45
+ (merge-rule "\IeC {\CYRSHCH }" "Щ" :string)
46
+ (merge-rule "\IeC {\CYRT }" "Т" :string)
47
+ (merge-rule "\IeC {\CYRTSHE }" "Ћ" :string)
48
+ (merge-rule "\IeC {\CYRU }" "У" :string)
49
+ (merge-rule "\IeC {\CYRUSHRT }" "Ў" :string)
50
+ (merge-rule "\IeC {\CYRV }" "В" :string)
51
+ (merge-rule "\IeC {\CYRYA }" "Я" :string)
52
+ (merge-rule "\IeC {\CYRYI }" "Ї" :string)
53
+ (merge-rule "\IeC {\CYRYO }" "Ё" :string)
54
+ (merge-rule "\IeC {\CYRYU }" "Ю" :string)
55
+ (merge-rule "\IeC {\CYRZ }" "З" :string)
56
+ (merge-rule "\IeC {\CYRZH }" "Ж" :string)
57
+ (merge-rule "\IeC {\cyra }" "а" :string)
58
+ (merge-rule "\IeC {\cyrb }" "б" :string)
59
+ (merge-rule "\IeC {\cyrc }" "ц" :string)
60
+ (merge-rule "\IeC {\cyrch }" "ч" :string)
61
+ (merge-rule "\IeC {\cyrd }" "д" :string)
62
+ (merge-rule "\IeC {\cyrdje }" "ђ" :string)
63
+ (merge-rule "\IeC {\cyrdze }" "ѕ" :string)
64
+ (merge-rule "\IeC {\cyrdzhe }" "џ" :string)
65
+ (merge-rule "\IeC {\cyre }" "е" :string)
66
+ (merge-rule "\IeC {\cyrerev }" "э" :string)
67
+ (merge-rule "\IeC {\cyrery }" "ы" :string)
68
+ (merge-rule "\IeC {\cyrf }" "ф" :string)
69
+ (merge-rule "\IeC {\cyrg }" "г" :string)
70
+ (merge-rule "\IeC {\cyrgup }" "ґ" :string)
71
+ (merge-rule "\IeC {\cyrh }" "х" :string)
72
+ (merge-rule "\IeC {\cyrhrdsn }" "ъ" :string)
73
+ (merge-rule "\IeC {\cyri }" "и" :string)
74
+ (merge-rule "\IeC {\cyrie }" "є" :string)
75
+ (merge-rule "\IeC {\cyrii }" "і" :string)
76
+ (merge-rule "\IeC {\cyrishrt }" "й" :string)
77
+ (merge-rule "\IeC {\cyrje }" "ј" :string)
78
+ (merge-rule "\IeC {\cyrk }" "к" :string)
79
+ (merge-rule "\IeC {\cyrl }" "л" :string)
80
+ (merge-rule "\IeC {\cyrlje }" "љ" :string)
81
+ (merge-rule "\IeC {\cyrm }" "м" :string)
82
+ (merge-rule "\IeC {\cyrn }" "н" :string)
83
+ (merge-rule "\IeC {\cyrnje }" "њ" :string)
84
+ (merge-rule "\IeC {\cyro }" "о" :string)
85
+ (merge-rule "\IeC {\cyrp }" "п" :string)
86
+ (merge-rule "\IeC {\cyrr }" "р" :string)
87
+ (merge-rule "\IeC {\cyrs }" "с" :string)
88
+ (merge-rule "\IeC {\cyrsftsn }" "ь" :string)
89
+ (merge-rule "\IeC {\cyrsh }" "ш" :string)
90
+ (merge-rule "\IeC {\cyrshch }" "щ" :string)
91
+ (merge-rule "\IeC {\cyrt }" "т" :string)
92
+ (merge-rule "\IeC {\cyrtshe }" "ћ" :string)
93
+ (merge-rule "\IeC {\cyru }" "у" :string)
94
+ (merge-rule "\IeC {\cyrushrt }" "ў" :string)
95
+ (merge-rule "\IeC {\cyrv }" "в" :string)
96
+ (merge-rule "\IeC {\cyrya }" "я" :string)
97
+ (merge-rule "\IeC {\cyryi }" "ї" :string)
98
+ (merge-rule "\IeC {\cyryo }" "ё" :string)
99
+ (merge-rule "\IeC {\cyryu }" "ю" :string)
100
+ (merge-rule "\IeC {\cyrz }" "з" :string)
101
+ (merge-rule "\IeC {\cyrzh }" "ж" :string)
docs/build/latex/LICRlatin2utf8.xdy ADDED
@@ -0,0 +1,239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ;; style file for xindy
2
+ ;; filename: LICRlatin2utf8.xdy
3
+ ;; description: style file for xindy which maps back LaTeX Internal
4
+ ;; Character Representation of letters (as arising in .idx index
5
+ ;; file) to UTF-8 encoding for correct sorting by xindy.
6
+ ;; usage: for use with the pdflatex engine,
7
+ ;; *not* for use with xelatex or lualatex.
8
+ ;;
9
+ ;; This is based upon xindy's distributed file tex/inputenc/utf8.xdy.
10
+ ;; The modifications include:
11
+ ;;
12
+ ;; - Updates for compatibility with current LaTeX macro encoding.
13
+ ;;
14
+ ;; - Systematic usage of the \IeC {...} mark-up, because mark-up in
15
+ ;; tex/inputenc/utf8.xdy was using it on seemingly random basis, and
16
+ ;; Sphinx coercing of xindy usability for both Latin and Cyrillic scripts
17
+ ;; with pdflatex requires its systematic presence here.
18
+ ;;
19
+ ;; - Support for some extra letters: Ÿ, Ŋ, ŋ, Œ, œ, IJ, ij, ȷ and ẞ.
20
+ ;;
21
+ ;; Indeed Sphinx needs to support for pdflatex engine all Unicode letters
22
+ ;; available in TeX T1 font encoding. The above letters are found in
23
+ ;; that encoding but not in the Latin1, 2, 3 charsets which are those
24
+ ;; covered by original tex/inputenc/utf8.xdy.
25
+ ;;
26
+ ;; - There is a problem that ȷ is not supported out-of-the box by LaTeX
27
+ ;; with inputenc, one must add explicitly
28
+ ;; \DeclareUnicodeCharacter{0237}{\j}
29
+ ;; to preamble of LaTeX document. However this character is not supported
30
+ ;; by the TeX "times" font used by default by Sphinx for pdflatex engine.
31
+ ;;
32
+ ;; **Update**: since LaTeX 2018/12/01, the \j as well as \SS, \k{} and
33
+ ;; \.{} need no extra user declaration anymore.
34
+ ;;
35
+ ;; - ẞ needs \DeclareUnicodeCharacter{1E9E}{\SS} (but ß needs no extra set-up).
36
+ ;;
37
+ ;; - U+02DB (˛) and U+02D9 (˙) are also not supported by inputenc
38
+ ;; out of the box and require
39
+ ;; \DeclareUnicodeCharacter{02DB}{\k{}}
40
+ ;; \DeclareUnicodeCharacter{02D9}{\.{}}
41
+ ;; to be added to preamble.
42
+ ;;
43
+ ;; - U+0127 ħ and U+0126 Ħ are absent from TeX T1+TS1 font encodings.
44
+ ;;
45
+ ;; - Characters Ŋ and ŋ are not supported by TeX font "times" used by
46
+ ;; default by Sphinx for pdflatex engine but they are supported by
47
+ ;; some TeX fonts, in particular by the default LaTeX font for T1
48
+ ;; encoding.
49
+ ;;
50
+ ;; - " and ~ must be escaped as ~" and resp. ~~ in xindy merge rules.
51
+ ;;
52
+ ;; Contributed by the Sphinx team, July 2018.
53
+ ;;
54
+ ;; See sphinx.xdy for superior figures, as they are escaped by LaTeX writer.
55
+ (merge-rule "\IeC {\textonesuperior }" "¹" :string)
56
+ (merge-rule "\IeC {\texttwosuperior }" "²" :string)
57
+ (merge-rule "\IeC {\textthreesuperior }" "³" :string)
58
+ (merge-rule "\IeC {\'a}" "á" :string)
59
+ (merge-rule "\IeC {\'A}" "Á" :string)
60
+ (merge-rule "\IeC {\`a}" "à" :string)
61
+ (merge-rule "\IeC {\`A}" "À" :string)
62
+ (merge-rule "\IeC {\^a}" "â" :string)
63
+ (merge-rule "\IeC {\^A}" "Â" :string)
64
+ (merge-rule "\IeC {\~"a}" "ä" :string)
65
+ (merge-rule "\IeC {\~"A}" "Ä" :string)
66
+ (merge-rule "\IeC {\~~a}" "ã" :string)
67
+ (merge-rule "\IeC {\~~A}" "Ã" :string)
68
+ (merge-rule "\IeC {\c c}" "ç" :string)
69
+ (merge-rule "\IeC {\c C}" "Ç" :string)
70
+ (merge-rule "\IeC {\'c}" "ć" :string)
71
+ (merge-rule "\IeC {\'C}" "Ć" :string)
72
+ (merge-rule "\IeC {\^c}" "ĉ" :string)
73
+ (merge-rule "\IeC {\^C}" "Ĉ" :string)
74
+ (merge-rule "\IeC {\.c}" "ċ" :string)
75
+ (merge-rule "\IeC {\.C}" "Ċ" :string)
76
+ (merge-rule "\IeC {\c s}" "ş" :string)
77
+ (merge-rule "\IeC {\c S}" "Ş" :string)
78
+ (merge-rule "\IeC {\c t}" "ţ" :string)
79
+ (merge-rule "\IeC {\c T}" "Ţ" :string)
80
+ (merge-rule "\IeC {\-}" "­" :string); soft hyphen
81
+ (merge-rule "\IeC {\textdiv }" "÷" :string)
82
+ (merge-rule "\IeC {\'e}" "é" :string)
83
+ (merge-rule "\IeC {\'E}" "É" :string)
84
+ (merge-rule "\IeC {\`e}" "è" :string)
85
+ (merge-rule "\IeC {\`E}" "È" :string)
86
+ (merge-rule "\IeC {\^e}" "ê" :string)
87
+ (merge-rule "\IeC {\^E}" "Ê" :string)
88
+ (merge-rule "\IeC {\~"e}" "ë" :string)
89
+ (merge-rule "\IeC {\~"E}" "Ë" :string)
90
+ (merge-rule "\IeC {\^g}" "ĝ" :string)
91
+ (merge-rule "\IeC {\^G}" "Ĝ" :string)
92
+ (merge-rule "\IeC {\.g}" "ġ" :string)
93
+ (merge-rule "\IeC {\.G}" "Ġ" :string)
94
+ (merge-rule "\IeC {\^h}" "ĥ" :string)
95
+ (merge-rule "\IeC {\^H}" "Ĥ" :string)
96
+ (merge-rule "\IeC {\H o}" "ő" :string)
97
+ (merge-rule "\IeC {\H O}" "Ő" :string)
98
+ (merge-rule "\IeC {\textacutedbl }" "˝" :string)
99
+ (merge-rule "\IeC {\H u}" "ű" :string)
100
+ (merge-rule "\IeC {\H U}" "Ű" :string)
101
+ (merge-rule "\IeC {\ae }" "æ" :string)
102
+ (merge-rule "\IeC {\AE }" "Æ" :string)
103
+ (merge-rule "\IeC {\textcopyright }" "©" :string)
104
+ (merge-rule "\IeC {\c \ }" "¸" :string)
105
+ (merge-rule "\IeC {\dh }" "ð" :string)
106
+ (merge-rule "\IeC {\DH }" "Ð" :string)
107
+ (merge-rule "\IeC {\dj }" "đ" :string)
108
+ (merge-rule "\IeC {\DJ }" "Đ" :string)
109
+ (merge-rule "\IeC {\guillemotleft }" "«" :string)
110
+ (merge-rule "\IeC {\guillemotright }" "»" :string)
111
+ (merge-rule "\IeC {\'\i }" "í" :string)
112
+ (merge-rule "\IeC {\`\i }" "ì" :string)
113
+ (merge-rule "\IeC {\^\i }" "î" :string)
114
+ (merge-rule "\IeC {\~"\i }" "ï" :string)
115
+ (merge-rule "\IeC {\i }" "ı" :string)
116
+ (merge-rule "\IeC {\^\j }" "ĵ" :string)
117
+ (merge-rule "\IeC {\k {}}" "˛" :string)
118
+ (merge-rule "\IeC {\l }" "ł" :string)
119
+ (merge-rule "\IeC {\L }" "Ł" :string)
120
+ (merge-rule "\IeC {\nobreakspace }" " " :string)
121
+ (merge-rule "\IeC {\o }" "ø" :string)
122
+ (merge-rule "\IeC {\O }" "Ø" :string)
123
+ (merge-rule "\IeC {\textsterling }" "£" :string)
124
+ (merge-rule "\IeC {\textparagraph }" "¶" :string)
125
+ (merge-rule "\IeC {\ss }" "ß" :string)
126
+ (merge-rule "\IeC {\textsection }" "§" :string)
127
+ (merge-rule "\IeC {\textbrokenbar }" "¦" :string)
128
+ (merge-rule "\IeC {\textcent }" "¢" :string)
129
+ (merge-rule "\IeC {\textcurrency }" "¤" :string)
130
+ (merge-rule "\IeC {\textdegree }" "°" :string)
131
+ (merge-rule "\IeC {\textexclamdown }" "¡" :string)
132
+ (merge-rule "\IeC {\texthbar }" "ħ" :string)
133
+ (merge-rule "\IeC {\textHbar }" "Ħ" :string)
134
+ (merge-rule "\IeC {\textonehalf }" "½" :string)
135
+ (merge-rule "\IeC {\textonequarter }" "¼" :string)
136
+ (merge-rule "\IeC {\textordfeminine }" "ª" :string)
137
+ (merge-rule "\IeC {\textordmasculine }" "º" :string)
138
+ (merge-rule "\IeC {\textperiodcentered }" "·" :string)
139
+ (merge-rule "\IeC {\textquestiondown }" "¿" :string)
140
+ (merge-rule "\IeC {\textregistered }" "®" :string)
141
+ (merge-rule "\IeC {\textthreequarters }" "¾" :string)
142
+ (merge-rule "\IeC {\textyen }" "¥" :string)
143
+ (merge-rule "\IeC {\th }" "þ" :string)
144
+ (merge-rule "\IeC {\TH }" "Þ" :string)
145
+ (merge-rule "\IeC {\'I}" "Í" :string)
146
+ (merge-rule "\IeC {\`I}" "Ì" :string)
147
+ (merge-rule "\IeC {\^I}" "Î" :string)
148
+ (merge-rule "\IeC {\~"I}" "Ï" :string)
149
+ (merge-rule "\IeC {\.I}" "İ" :string)
150
+ (merge-rule "\IeC {\^J}" "Ĵ" :string)
151
+ (merge-rule "\IeC {\k a}" "ą" :string)
152
+ (merge-rule "\IeC {\k A}" "Ą" :string)
153
+ (merge-rule "\IeC {\k e}" "ę" :string)
154
+ (merge-rule "\IeC {\k E}" "Ę" :string)
155
+ (merge-rule "\IeC {\'l}" "ĺ" :string)
156
+ (merge-rule "\IeC {\'L}" "Ĺ" :string)
157
+ (merge-rule "\IeC {\textlnot }" "¬" :string)
158
+ (merge-rule "\IeC {\textmu }" "µ" :string)
159
+ (merge-rule "\IeC {\'n}" "ń" :string)
160
+ (merge-rule "\IeC {\'N}" "Ń" :string)
161
+ (merge-rule "\IeC {\~~n}" "ñ" :string)
162
+ (merge-rule "\IeC {\~~N}" "Ñ" :string)
163
+ (merge-rule "\IeC {\'o}" "ó" :string)
164
+ (merge-rule "\IeC {\'O}" "Ó" :string)
165
+ (merge-rule "\IeC {\`o}" "ò" :string)
166
+ (merge-rule "\IeC {\`O}" "Ò" :string)
167
+ (merge-rule "\IeC {\^o}" "ô" :string)
168
+ (merge-rule "\IeC {\^O}" "Ô" :string)
169
+ (merge-rule "\IeC {\~"o}" "ö" :string)
170
+ (merge-rule "\IeC {\~"O}" "Ö" :string)
171
+ (merge-rule "\IeC {\~~o}" "õ" :string)
172
+ (merge-rule "\IeC {\~~O}" "Õ" :string)
173
+ (merge-rule "\IeC {\textpm }" "±" :string)
174
+ (merge-rule "\IeC {\r a}" "å" :string)
175
+ (merge-rule "\IeC {\r A}" "Å" :string)
176
+ (merge-rule "\IeC {\'r}" "ŕ" :string)
177
+ (merge-rule "\IeC {\'R}" "Ŕ" :string)
178
+ (merge-rule "\IeC {\r u}" "ů" :string)
179
+ (merge-rule "\IeC {\r U}" "Ů" :string)
180
+ (merge-rule "\IeC {\'s}" "ś" :string)
181
+ (merge-rule "\IeC {\'S}" "Ś" :string)
182
+ (merge-rule "\IeC {\^s}" "ŝ" :string)
183
+ (merge-rule "\IeC {\^S}" "Ŝ" :string)
184
+ (merge-rule "\IeC {\textasciidieresis }" "¨" :string)
185
+ (merge-rule "\IeC {\textasciimacron }" "¯" :string)
186
+ (merge-rule "\IeC {\.{}}" "˙" :string)
187
+ (merge-rule "\IeC {\textasciiacute }" "´" :string)
188
+ (merge-rule "\IeC {\texttimes }" "×" :string)
189
+ (merge-rule "\IeC {\u a}" "ă" :string)
190
+ (merge-rule "\IeC {\u A}" "Ă" :string)
191
+ (merge-rule "\IeC {\u g}" "ğ" :string)
192
+ (merge-rule "\IeC {\u G}" "Ğ" :string)
193
+ (merge-rule "\IeC {\textasciibreve }" "˘" :string)
194
+ (merge-rule "\IeC {\'u}" "ú" :string)
195
+ (merge-rule "\IeC {\'U}" "Ú" :string)
196
+ (merge-rule "\IeC {\`u}" "ù" :string)
197
+ (merge-rule "\IeC {\`U}" "Ù" :string)
198
+ (merge-rule "\IeC {\^u}" "û" :string)
199
+ (merge-rule "\IeC {\^U}" "Û" :string)
200
+ (merge-rule "\IeC {\~"u}" "ü" :string)
201
+ (merge-rule "\IeC {\~"U}" "Ü" :string)
202
+ (merge-rule "\IeC {\u u}" "ŭ" :string)
203
+ (merge-rule "\IeC {\u U}" "Ŭ" :string)
204
+ (merge-rule "\IeC {\v c}" "č" :string)
205
+ (merge-rule "\IeC {\v C}" "Č" :string)
206
+ (merge-rule "\IeC {\v d}" "ď" :string)
207
+ (merge-rule "\IeC {\v D}" "Ď" :string)
208
+ (merge-rule "\IeC {\v e}" "ě" :string)
209
+ (merge-rule "\IeC {\v E}" "Ě" :string)
210
+ (merge-rule "\IeC {\v l}" "ľ" :string)
211
+ (merge-rule "\IeC {\v L}" "Ľ" :string)
212
+ (merge-rule "\IeC {\v n}" "ň" :string)
213
+ (merge-rule "\IeC {\v N}" "Ň" :string)
214
+ (merge-rule "\IeC {\v r}" "ř" :string)
215
+ (merge-rule "\IeC {\v R}" "Ř" :string)
216
+ (merge-rule "\IeC {\v s}" "š" :string)
217
+ (merge-rule "\IeC {\v S}" "Š" :string)
218
+ (merge-rule "\IeC {\textasciicaron }" "ˇ" :string)
219
+ (merge-rule "\IeC {\v t}" "ť" :string)
220
+ (merge-rule "\IeC {\v T}" "Ť" :string)
221
+ (merge-rule "\IeC {\v z}" "ž" :string)
222
+ (merge-rule "\IeC {\v Z}" "Ž" :string)
223
+ (merge-rule "\IeC {\'y}" "ý" :string)
224
+ (merge-rule "\IeC {\'Y}" "Ý" :string)
225
+ (merge-rule "\IeC {\~"y}" "ÿ" :string)
226
+ (merge-rule "\IeC {\'z}" "ź" :string)
227
+ (merge-rule "\IeC {\'Z}" "Ź" :string)
228
+ (merge-rule "\IeC {\.z}" "ż" :string)
229
+ (merge-rule "\IeC {\.Z}" "Ż" :string)
230
+ ;; letters not in Latin1, 2, 3 but available in TeX T1 font encoding
231
+ (merge-rule "\IeC {\~"Y}" "Ÿ" :string)
232
+ (merge-rule "\IeC {\NG }" "Ŋ" :string)
233
+ (merge-rule "\IeC {\ng }" "ŋ" :string)
234
+ (merge-rule "\IeC {\OE }" "Œ" :string)
235
+ (merge-rule "\IeC {\oe }" "œ" :string)
236
+ (merge-rule "\IeC {\IJ }" "IJ" :string)
237
+ (merge-rule "\IeC {\ij }" "ij" :string)
238
+ (merge-rule "\IeC {\j }" "ȷ" :string)
239
+ (merge-rule "\IeC {\SS }" "ẞ" :string)