Index
+ +A
+B
++ | + |
C
+D
+E
++ | + |
F
++ | + |
G
+H
++ | + |
I
++ | + |
K
++ | + |
L
++ | + |
M
+N
+O
++ |
P
+R
+S
++ | + |
T
++ |
U
++ | + |
W
+X
++ |
Y
++ |
diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/doctrees/environment.pickle b/doctrees/environment.pickle new file mode 100644 index 0000000..80899a9 Binary files /dev/null and b/doctrees/environment.pickle differ diff --git a/doctrees/index.doctree b/doctrees/index.doctree new file mode 100644 index 0000000..df680e4 Binary files /dev/null and b/doctrees/index.doctree differ diff --git a/doctrees/modules.doctree b/doctrees/modules.doctree new file mode 100644 index 0000000..714d721 Binary files /dev/null and b/doctrees/modules.doctree differ diff --git a/html/.buildinfo b/html/.buildinfo new file mode 100644 index 0000000..177eb37 --- /dev/null +++ b/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 987db7e5e56ae2985710637a5b131577 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/html/_sources/index.rst.txt b/html/_sources/index.rst.txt new file mode 100644 index 0000000..bc1f4e4 --- /dev/null +++ b/html/_sources/index.rst.txt @@ -0,0 +1,22 @@ +.. GameTime documentation master file, created by + sphinx-quickstart on Mon Apr 29 22:42:36 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to GameTime's documentation! +==================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + modules + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/html/_sources/modules.rst.txt b/html/_sources/modules.rst.txt new file mode 100644 index 0000000..b7170bf --- /dev/null +++ b/html/_sources/modules.rst.txt @@ -0,0 +1,187 @@ +GameTime src Documentation +========================== + +This document provides comprehensive documentation for all the modules in the GameTime framework. + +Main Package Module +------------------- + +.. automodule:: gametime.src + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.analyzer + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.analyzer_project + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.clang_helper + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.defaults + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.file_helper + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.gametime_configuration + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.gametime_error + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.histogram + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.interval + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.logging_helper + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.nx_helper + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.path_analyzer + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.path_generator + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.path + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.project_configuration_parser + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.project_configuration + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.pulp_helper + :members: + :undoc-members: + :show-inheritance: + +Backend Modules +--------------- + +Backend Base Module +^^^^^^^^^^^^^^^^^^^ + +.. automodule:: gametime.src.backend + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.backend.backend + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.generate_executable + :members: + :undoc-members: + :show-inheritance: + + +ARM Backend Module +^^^^^^^^^^^^^^^^^^ + +.. automodule:: gametime.src.backend.arm_backend + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.backend.arm_backend.arm_backend + :members: + :undoc-members: + :show-inheritance: + +FlexPRET Backend Module +^^^^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: gametime.src.backend.flexpret_backend + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.backend.flexpret_backend.flexpret_backend + :members: + :undoc-members: + :show-inheritance: + + +x86 Backend Module +^^^^^^^^^^^^^^^^^^ + +.. automodule:: gametime.src.backend.x86_backend + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.backend.x86_backend.x86_backend + :members: + :undoc-members: + :show-inheritance: + +SMT Solver Module +----------------- + +.. automodule:: gametime.src.smt_solver + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.extract_klee_input + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.extract_labels + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.smt + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: gametime.src.to_klee_format + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/html/_static/alabaster.css b/html/_static/alabaster.css new file mode 100644 index 0000000..e3174bf --- /dev/null +++ b/html/_static/alabaster.css @@ -0,0 +1,708 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 160px; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/html/_static/basic.css b/html/_static/basic.css new file mode 100644 index 0000000..e5179b7 --- /dev/null +++ b/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: inherit; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/html/_static/custom.css b/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/html/_static/doctools.js b/html/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/html/_static/documentation_options.js b/html/_static/documentation_options.js new file mode 100644 index 0000000..d1f2291 --- /dev/null +++ b/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.0.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/html/_static/file.png b/html/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/html/_static/file.png differ diff --git a/html/_static/language_data.js b/html/_static/language_data.js new file mode 100644 index 0000000..367b8ed --- /dev/null +++ b/html/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +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"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/html/_static/minus.png b/html/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/html/_static/minus.png differ diff --git a/html/_static/plus.png b/html/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/html/_static/plus.png differ diff --git a/html/_static/pygments.css b/html/_static/pygments.css new file mode 100644 index 0000000..04a4174 --- /dev/null +++ b/html/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/html/_static/searchtools.js b/html/_static/searchtools.js new file mode 100644 index 0000000..92da3f8 --- /dev/null +++ b/html/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/html/_static/sphinx_highlight.js b/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '
' + + '' + + _("Hide Search Matches") + + "
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/html/genindex.html b/html/genindex.html new file mode 100644 index 0000000..cb27947 --- /dev/null +++ b/html/genindex.html @@ -0,0 +1,950 @@ + + + + + + ++ | + |
+ | + |
+ | + |
+ | + |
+ | + |
+ | + |
+ | + |
+ |
+ | + |
+ |
+ | + |
+ |
+ |
This document provides comprehensive documentation for all the modules in the GameTime framework.
+Bases: object
Contains methods and variables that allow a user to import +GameTime as a module.
+Methods
+
|
+
|
+
project_config – object that represents the configuration of a GameTime project.
+configuration provided.
+Bases: object
Maintains information about the code being analyzed, such as +the name of the file that contains the code being analyzed +and the basis paths of the code.
+project_config – Object that represents the configuration of a GameTime project.
+Methods
+
|
+Adds the edges provided to the list of path-bundled constraints, if not already present. |
+
+ | Adds the edges provided to the list of path-exclusive constraints, if not already present. |
+
+ | Creates the DAG corresponding to the code being analyzed and dumps the DAG, in DOT format, to a temporary file for further analysis. |
+
+ | Estimates the weights on the edges of the DAG, using the values of the basis "Path" objects. |
+
+ | Generates a list of "Path" objects, each of which represents a basis path of the code being analyzed. |
+
+ | Generates an overcomplete basis so that each feasible path can be |
+
+ | Generates overcomplete basis such the lenth of the longest |
+
|
+Loads the DAG that corresponds to the code being analyzed from a DOT file. |
+
+ | Measure all generated BASIS_PATHS again |
+
|
+Measure the Path if never measured before. |
+
|
+Measure the list of PATHS. |
+
+ | Resets the path-bundled constraints. |
+
+ | Resets the path-exclusive constraints. |
+
generate_paths |
++ |
Adds the edges provided to the list of path-bundled +constraints, if not already present. These edges must +be taken together if at least one of them is taken along +a path through the DAG.
+edges (List[Tuple[str, str]] :) – List of edges to add to the list of path-bundled constraints.
+Adds the edges provided to the list of path-exclusive +constraints, if not already present. These edges must not +be taken together along any path through the DAG.
+edges (List[Tuple[str, str]] :) – List of edges to add to the list of path-exclusive constraints.
+Basis matrix.
+Creates the DAG corresponding to the code being analyzed +and dumps the DAG, in DOT format, to a temporary file for further +analysis. This method also stores a local copy in a data +structure that represents the DAG.
+Estimates the weights on the edges of the DAG, using the values +of the basis “Path” objects. The result is stored in the instance +variable “edgeWeights”.
+Precondition: The basis paths have been generated and have values.
+Generates a list of “Path” objects, each of which represents +a basis path of the code being analyzed. The basis “Path” objects +are regenerated each time this method is called.
+List of basis paths of the code being analyzed, each
represented by an object of the “Path” class.
written as a liner combination of the paths in the basis so that the +L1 norm is at most ‘k’. This method is for testing purposes +only as it exhaustively generates all_temp_files paths in the graph!. Use the +function below for a scalable version.
+k (int :) – Maximum value of L1 norm.
+feasible path is at most ‘k’. The basis is computed by iteratively +extending the basis with the longest path. Parameter ‘initial_paths’ +specifies the set of paths the iterative algorithm begins with. This +can be any set of paths, in practice we use the paths generated by +the standard algorithm.
+initial_paths (List[List[Tuple[str, str]]] :) – A list of initial paths to begin with.
k (int :) – Maximum value of L1 norm.
The set of basis paths.
+Loads the DAG that corresponds to the code being analyzed from a DOT file.
+location (str :) – Location of the file.
+Measure all generated BASIS_PATHS again
+Measure the Path if never measured before. If no name was set, the parameter output_name is used.
+path (Path :) – The path object
output_name (str :) – Name for this path.
Measured cycle count for PATH.
+Measure the list of PATHS. Using prefix and index as name if none is given.
+paths (list[Path] :) – List of paths to measure.
output_name_prefix (str :) – Prefix to use for the name of each path
List of measured values for the paths.
+List whose elements are lists of edges that must be taken together, +if at least one is taken along a path through the DAG. For example, +the element [e1, e2] means “if you take e1, then you take e2”.
+Dimension of the vector representing each path.
+Set whose elements are lists of edges that must not be taken +together along any path through the DAG. For example, the element +[e1, e2] means “if you take e1, you cannot take e2” and +“if you take e2, you cannot take e1”.
+ProjectConfiguration
object
+that represents the configuration of a GameTime project.
Resets the path-bundled constraints.
+Resets the path-exclusive constraints.
+Functions to help interacting with clang on the command +line. Allows creation of dags
+Compile the LLVM bitcode program into executable in OUTPUT_FILE_FOLDER.
+bc_filepath (str :) – Path to the input bitcode program.
output_folder (str :) – Storage folder for generated file.
output_name (str :) – Name for generated executable.
extra_libs (List[str] :) – Extra libraries needed for compilation. (Default value = [])
extra_flags (List[str] :) – Extra flags needed for compilation. (Default value = [])
The path to executable.
+str
+Compile the C program into bitcode in OUTPUT_FILE_FOLDER using -O0 option to preserve maximum structure.
+c_filepath (str :) – Path to the input C program.
output_file_folder (str :) – Storage folder for generated file.
output_name (str :) – Name for generated bc.
extra_libs (List[str] :) – Extra libraries needed for compilation. (Default value = [])
extra_flags (List[str] :) – Extra flags needed for compilation. (Default value = [])
readable (bool :) – If set to true, also generate readable LL file. (Default value = False)
The path to bc.
+str
+Compile the C program into bitcode in OUTPUT_FILE_FOLDER.
+c_filepath (str :) – Path to the input C program. Main function should be defined.
output_file_folder (str :) – Storage folder for generated file.
output_name (str :) – Name for generated bc.
extra_libs (List[str] :) – Extra libraries needed for compilation. (Default value = [])
extra_flags (List[str] :) – Extra flags needed for compilation. (Default value = [])
readable (bool :) – If set to true, also generate readable LL file. (Default value = False)
The path to bc.
+str
+Dump the .o file to OUTPUT_NAME.dmp
+object_filepath (str :) – The name of the .o file to dump
output_folder (str :) – The folder path where .dmp files will be stored
output_name (str :) – Name for dumped .dmp files.
Path of the output OUTPUT_NAME.dmp file
+str
+Create dag from .bc file using opt through executing shell commands
+bc_filename (str :) – location of the compiled llvm .bc file
bc_file_folder (str :) – the folder path where .bc files is stored and where .main.dot file will be stored
output_name (str :) – Name of the generated dot file (Default value = “main”)
Path of the output .dot file
+str
+Unrolls the provided input file and output the unrolled version in +the output file using llvm’s opt utility. Could be unreliable if input_file +is not compiled with compile_to_llvm_for_analysis function. If that is the case, the +user might want to generate their own unrolled .bc/.ll file rather than +relying on this built-in function.
+bc_filepath (str :) – Input .bc/.ll function to loop unroll
output_file_folder (str :) – folder to write unrolled .bc file. Outputs in a +human-readable form already.
output_name (str :) – file to write unrolled .bc file. Outputs in a +human-readable form already.
Path of the output .bc file
+str
+Removes the temporary files created by CIL during its analysis.
+project_config – ProjectConfiguration this helper is calling from.
all_temp_files – True if all files in temperary directory should be removed.
Unrolls the provided input file and output the unrolled version in +the output file using llvm’s opt utility. Could be unreliable if input_file +is not compiled with compile_to_llvm_for_analysis function. If that is the case, the +user might want to generate their own unrolled .bc/.ll file rather than +relying on this built-in function.
+input_file (str :) – Input .bc/.ll function to loop unroll
output_file_folder (str :) – folder to write unrolled .bc file. Outputs in a +human-readable form already.
output_name (str :) – file to write unrolled .bc file. Outputs in a +human-readable form already.
project_config (ProjectConfiguration :) – ProjectConfiguration this helper is calling from.
Path of the output .bc file
+str
+Initializes the various variables, used in different +submodules of GameTime, with default values.
+Default GametimeConfiguration
object
+that represents the configuration of GameTime.
Default configuration YAML file.
+Default directory that contains the GameTime GUI.
+Default directory that contains the source files of GameTime.
+Exposes miscellaneous functions to perform operations +on files and directories, such as creation, removal and movement.
+Creates the leaf directory in the path specified, along with any
+intermediate-level directories needed to contain the directory.
+This is a wrapper around the makedirs()
function of
+the os
module, but does not raise an exception if
+the directory is already present,
location (str :) – Location of the directory to be created
+Moves the files, whose names match any of the patterns in the list +provided, from the source directory whose location is provided to +the destination directory whose location is provided. If a file in +the destination directory has the same name as a file that is being moved +from the source directory, the former is overwritten if overwrite is +set to True; otherwise, the latter will not be moved.
+patterns (List[str] :) – List of patterns to match filenames against
source_dir (str :) – Location of the source directory
dest_dir (str :) – Location of the destination directory
overwrite (bool :) – Whether to overwrite a file in the destination directory that has the same name as a file that is being moved from the source directory. (Default value = True)
Removes all_temp_files of the files and directories from the directory whose +location is provided, except for those files whose names match any +of the patterns in the list provided.
+patterns (List[str] :) – List of patterns to match filenames against
dir_location (str :) – Location of the directory to remove files from
Removes the file at the provided location. This is a wrapper around
+the remove()
function of the os
module, but does not
location (str :) – Location of the file to be removed
+Removes the files from the directory whose location is provided, +whose names match any of the patterns in the list provided.
+patterns (List[str] :) – List of patterns to match filenames against
dir_location (str :) – Location of the directory to remove files from
Bases: object
This class represents the endianness of the target machine.
+Bases: object
Stores information necessary to configure GameTime.
+Creates GametimeConfiguration from yaml files
+yaml_config_path (str :) – path of the yaml config file that contains
+GametimeConfiguration object that contains information from YAML file at yaml_config_path
+Defines the error that GameTime can throw.
+Bases: Exception
Error that GameTime can throw.
+Bases: Warning
Warning that GameTime can throw.
+Exposes functions to create, and interact with, a histogram +computed from the values of feasible paths generated by GameTime.
+Computes a histogram from the values of a list of
+feasible paths generated by GameTime. This function is
+a wrapper around the function histogram()
from
+the module numpy
. Refer to the documentation of this
+function for more information about the computed histogram.
paths (list[Path] :) – List of feasible paths generated by GameTime, each represented by a ~gametime.src.path.Path object.
bins – Same purpose as the same-named argument of the function numpy.histogram()
.
path_value_range – Same purpose as the range argument of the function numpy.histogram()
. (Default value = None)
measured – True if, and only if, the values that will be used for the histogram are the measured values of the feasible paths. (Default value = False)
Tuple, whose first element is an array of the values of the histogram, and whose second element is an array of the left edges of the bins.
+Tuple
+Create a histogram and write it to location.
+location – The stored folder for histogram file
paths (list[Path] :) – List of feasible paths generated by GameTime, each represented by a ~gametime.src.path.Path object.
bins – Same purpose as the same-named argument of the function numpy.histogram()
.
path_value_range – Same purpose as the range argument of the function numpy.histogram()
. (Default value = None)
measured – True if, and only if, the values that will be used for the histogram are the measured values of the feasible paths. (Default value = False)
Defines a class that maintains a representation of, +and information about, an interval of values.
+Bases: object
Maintains a representation of, and information about, +an interval of values.
+lower_bound
Returns ——- Lower bound of the interval represented by this object, or None if the interval has no finite lower bound.
+upper_bound
Returns ——- Upper bound of the interval represented by this object, or None if the interval has no finite upper bound.
+Methods
++ |
|
+
+ |
|
+
True if, and only if, the represented interval has a finite lower bound.
+True if, and only if, the represented interval has a finite upper bound.
+rtype: Lower bound of the interval represented by this object, or None if the interval has no finite lower bound.
+rtype: Upper bound of the interval represented by this object, or None if the interval has no finite upper bound.
+Exposes functions to interact with, and modify an object of,
+the logging
Python class.
Initializes the logger provided with +~logging.Formatter and ~logging.StreamHandler +objects appropriate for GameTime.
+logger (logging.Logger :) – Logger to initialize
+Exposes classes and functions to supplement those provided by +the NetworkX graph package.
+Bases: DiGraph
Maintains information about the directed acyclic graph (DAG) +of the code being analyzed. It is a subclass of +the ~networkx.DiGraph class of the NetworkX graph package, +and stores additional information relevant to the GameTime analysis, +such as the special ‘default’ edges in the DAG.
+Graph adjacency object holding the neighbors of each node.
+This object is a read-only dict-like structure with node keys +and neighbor-dict values. The neighbor-dict is keyed by neighbor +to the edge-data-dict. So G.adj[3][2][‘color’] = ‘blue’ sets +the color of the edge (3, 2) to “blue”.
+Iterating over G.adj behaves like a dict. Useful idioms include +for nbr, datadict in G.adj[n].items():.
+The neighbor information is also provided by subscripting the graph. +So for nbr, foovalue in G[node].data(‘foo’, default=1): works.
+For directed graphs, G.adj holds outgoing (successor) info.
+A DegreeView for the Graph as G.degree or G.degree().
+The node degree is the number of edges adjacent to the node. +The weighted node degree is the sum of the edge weights for +edges incident to that node.
+This object provides an iterator for (node, degree) as well as +lookup for the degree for a single node.
+The view will only report edges incident to these nodes.
+The name of an edge attribute that holds the numerical value used +as a weight. If None, then each edge has weight 1. +The degree is the sum of the edge weights adjacent to the node.
+If multiple nodes are requested (the default), returns a DiDegreeView +mapping nodes to their degree. +If a single node is requested, returns the degree of the node as an integer.
+in_degree, out_degree
+>>> G = nx.DiGraph() # or MultiDiGraph
+>>> nx.add_path(G, [0, 1, 2, 3])
+>>> G.degree(0) # node 0 with degree 1
+1
+>>> list(G.degree([0, 1, 2]))
+[(0, 1), (1, 2), (2, 2)]
+
An OutEdgeView of the DiGraph as G.edges or G.edges().
+edges(self, nbunch=None, data=False, default=None)
+The OutEdgeView provides set-like operations on the edge-tuples +as well as edge attribute lookup. When called, it also provides +an EdgeDataView object which allows control of access to edge +attributes (but does not provide set-like operations). +Hence, G.edges[u, v][‘color’] provides the value of the color +attribute for edge (u, v) while +for (u, v, c) in G.edges.data(‘color’, default=’red’): +iterates through all the edges yielding the color attribute +with default ‘red’ if no color attribute exists.
+The view will only report edges from these nodes.
+The edge attribute returned in 3-tuple (u, v, ddict[data]). +If True, return edge attribute dict in 3-tuple (u, v, ddict). +If False, return 2-tuple (u, v).
+Value used for edges that don’t have the requested attribute. +Only relevant if data is not True or False.
+A view of edge attributes, usually it iterates over (u, v) +or (u, v, d) tuples of edges, but can also be used for +attribute lookup as edges[u, v][‘foo’].
+in_edges, out_edges
+Nodes in nbunch that are not in the graph will be (quietly) ignored. +For directed graphs this returns the out-edges.
+>>> G = nx.DiGraph() # or MultiDiGraph, etc
+>>> nx.add_path(G, [0, 1, 2])
+>>> G.add_edge(2, 3, weight=5)
+>>> [e for e in G.edges]
+[(0, 1), (1, 2), (2, 3)]
+>>> G.edges.data() # default data is {} (empty dict)
+OutEdgeDataView([(0, 1, {}), (1, 2, {}), (2, 3, {'weight': 5})])
+>>> G.edges.data("weight", default=1)
+OutEdgeDataView([(0, 1, 1), (1, 2, 1), (2, 3, 5)])
+>>> G.edges([0, 2]) # only edges originating from these nodes
+OutEdgeDataView([(0, 1), (2, 3)])
+>>> G.edges(0) # only edges from node 0
+OutEdgeDataView([(0, 1)])
+
An InDegreeView for (node, in_degree) or in_degree for single node.
+The node in_degree is the number of edges pointing to the node. +The weighted node degree is the sum of the edge weights for +edges incident to that node.
+This object provides an iteration over (node, in_degree) as well as +lookup for the degree for a single node.
+The view will only report edges incident to these nodes.
+The name of an edge attribute that holds the numerical value used +as a weight. If None, then each edge has weight 1. +The degree is the sum of the edge weights adjacent to the node.
+If a single node is requested +deg : int
+++In-degree of the node
+
OR if multiple nodes are requested +nd_iter : iterator
+++The iterator returns two-tuples of (node, in-degree).
+
degree, out_degree
+>>> G = nx.DiGraph()
+>>> nx.add_path(G, [0, 1, 2, 3])
+>>> G.in_degree(0) # node 0 with degree 0
+0
+>>> list(G.in_degree([0, 1, 2]))
+[(0, 0), (1, 1), (2, 1)]
+
A view of the in edges of the graph as G.in_edges or G.in_edges().
+in_edges(self, nbunch=None, data=False, default=None):
+The view will only report edges incident to these nodes.
+The edge attribute returned in 3-tuple (u, v, ddict[data]). +If True, return edge attribute dict in 3-tuple (u, v, ddict). +If False, return 2-tuple (u, v).
+Value used for edges that don’t have the requested attribute. +Only relevant if data is not True or False.
+A view of edge attributes, usually it iterates over (u, v) +or (u, v, d) tuples of edges, but can also be used for +attribute lookup as edges[u, v][‘foo’].
+>>> G = nx.DiGraph()
+>>> G.add_edge(1, 2, color='blue')
+>>> G.in_edges()
+InEdgeView([(1, 2)])
+>>> G.in_edges(nbunch=2)
+InEdgeDataView([(1, 2)])
+
edges
+name
String identifier of the graph.
+A NodeView of the Graph as G.nodes or G.nodes().
+Can be used as G.nodes for data lookup and for set-like operations. +Can also be used as G.nodes(data=’color’, default=None) to return a +NodeDataView which reports specific node data but no set operations. +It presents a dict-like interface as well with G.nodes.items() +iterating over (node, nodedata) 2-tuples and G.nodes[3][‘foo’] +providing the value of the foo attribute for node 3. In addition, +a view G.nodes.data(‘foo’) provides a dict-like interface to the +foo attribute of each node. G.nodes.data(‘foo’, default=1) +provides a default for nodes that do not have attribute foo.
+The node attribute returned in 2-tuple (n, ddict[data]). +If True, return entire node attribute dict as (n, ddict). +If False, return just the nodes n.
+Value used for nodes that don’t have the requested attribute. +Only relevant if data is not True or False.
+Allows set-like operations over the nodes as well as node +attribute dict lookup and calling to get a NodeDataView. +A NodeDataView iterates over (n, data) and has no set operations. +A NodeView iterates over n and includes set operations.
+When called, if data is False, an iterator over nodes. +Otherwise an iterator of 2-tuples (node, attribute value) +where the attribute is specified in data. +If data is True then the attribute becomes the +entire data dictionary.
+If your node data is not needed, it is simpler and equivalent
+to use the expression for n in G
, or list(G)
.
There are two simple ways of getting a list of all nodes in the graph:
+>>> G = nx.path_graph(3)
+>>> list(G.nodes)
+[0, 1, 2]
+>>> list(G)
+[0, 1, 2]
+
To get the node data along with the nodes:
+>>> G.add_node(1, time="5pm")
+>>> G.nodes[0]["foo"] = "bar"
+>>> list(G.nodes(data=True))
+[(0, {'foo': 'bar'}), (1, {'time': '5pm'}), (2, {})]
+>>> list(G.nodes.data())
+[(0, {'foo': 'bar'}), (1, {'time': '5pm'}), (2, {})]
+
>>> list(G.nodes(data="foo"))
+[(0, 'bar'), (1, None), (2, None)]
+>>> list(G.nodes.data("foo"))
+[(0, 'bar'), (1, None), (2, None)]
+
>>> list(G.nodes(data="time"))
+[(0, None), (1, '5pm'), (2, None)]
+>>> list(G.nodes.data("time"))
+[(0, None), (1, '5pm'), (2, None)]
+
>>> list(G.nodes(data="time", default="Not Available"))
+[(0, 'Not Available'), (1, '5pm'), (2, 'Not Available')]
+>>> list(G.nodes.data("time", default="Not Available"))
+[(0, 'Not Available'), (1, '5pm'), (2, 'Not Available')]
+
If some of your nodes have an attribute and the rest are assumed +to have a default attribute value you can create a dictionary +from node/attribute pairs using the default keyword argument +to guarantee the value is never None:
+>>> G = nx.Graph()
+>>> G.add_node(0)
+>>> G.add_node(1, weight=2)
+>>> G.add_node(2, weight=3)
+>>> dict(G.nodes(data="weight", default=1))
+{0: 1, 1: 2, 2: 3}
+
An OutDegreeView for (node, out_degree)
+The node out_degree is the number of edges pointing out of the node. +The weighted node degree is the sum of the edge weights for +edges incident to that node.
+This object provides an iterator over (node, out_degree) as well as +lookup for the degree for a single node.
+The view will only report edges incident to these nodes.
+The name of an edge attribute that holds the numerical value used +as a weight. If None, then each edge has weight 1. +The degree is the sum of the edge weights adjacent to the node.
+If a single node is requested +deg : int
+++Out-degree of the node
+
OR if multiple nodes are requested +nd_iter : iterator
+++The iterator returns two-tuples of (node, out-degree).
+
degree, in_degree
+>>> G = nx.DiGraph()
+>>> nx.add_path(G, [0, 1, 2, 3])
+>>> G.out_degree(0) # node 0 with degree 1
+1
+>>> list(G.out_degree([0, 1, 2]))
+[(0, 1), (1, 1), (2, 1)]
+
An OutEdgeView of the DiGraph as G.edges or G.edges().
+edges(self, nbunch=None, data=False, default=None)
+The OutEdgeView provides set-like operations on the edge-tuples +as well as edge attribute lookup. When called, it also provides +an EdgeDataView object which allows control of access to edge +attributes (but does not provide set-like operations). +Hence, G.edges[u, v][‘color’] provides the value of the color +attribute for edge (u, v) while +for (u, v, c) in G.edges.data(‘color’, default=’red’): +iterates through all the edges yielding the color attribute +with default ‘red’ if no color attribute exists.
+The view will only report edges from these nodes.
+The edge attribute returned in 3-tuple (u, v, ddict[data]). +If True, return edge attribute dict in 3-tuple (u, v, ddict). +If False, return 2-tuple (u, v).
+Value used for edges that don’t have the requested attribute. +Only relevant if data is not True or False.
+A view of edge attributes, usually it iterates over (u, v) +or (u, v, d) tuples of edges, but can also be used for +attribute lookup as edges[u, v][‘foo’].
+in_edges, out_edges
+Nodes in nbunch that are not in the graph will be (quietly) ignored. +For directed graphs this returns the out-edges.
+>>> G = nx.DiGraph() # or MultiDiGraph, etc
+>>> nx.add_path(G, [0, 1, 2])
+>>> G.add_edge(2, 3, weight=5)
+>>> [e for e in G.edges]
+[(0, 1), (1, 2), (2, 3)]
+>>> G.edges.data() # default data is {} (empty dict)
+OutEdgeDataView([(0, 1, {}), (1, 2, {}), (2, 3, {'weight': 5})])
+>>> G.edges.data("weight", default=1)
+OutEdgeDataView([(0, 1, 1), (1, 2, 1), (2, 3, 5)])
+>>> G.edges([0, 2]) # only edges originating from these nodes
+OutEdgeDataView([(0, 1), (2, 3)])
+>>> G.edges(0) # only edges from node 0
+OutEdgeDataView([(0, 1)])
+
Graph adjacency object holding the predecessors of each node.
+This object is a read-only dict-like structure with node keys +and neighbor-dict values. The neighbor-dict is keyed by neighbor +to the edge-data-dict. So G.pred[2][3][‘color’] = ‘blue’ sets +the color of the edge (3, 2) to “blue”.
+Iterating over G.pred behaves like a dict. Useful idioms include +for nbr, datadict in G.pred[n].items():. A data-view not provided +by dicts also exists: for nbr, foovalue in G.pred[node].data(‘foo’): +A default can be set via a default argument to the data method.
+Graph adjacency object holding the successors of each node.
+This object is a read-only dict-like structure with node keys +and neighbor-dict values. The neighbor-dict is keyed by neighbor +to the edge-data-dict. So G.succ[3][2][‘color’] = ‘blue’ sets +the color of the edge (3, 2) to “blue”.
+Iterating over G.succ behaves like a dict. Useful idioms include +for nbr, datadict in G.succ[n].items():. A data-view not provided +by dicts also exists: for nbr, foovalue in G.succ[node].data(‘foo’): +and a default can be set via a default argument to the data method.
+The neighbor information is also provided by subscripting the graph. +So for nbr, foovalue in G[node].data(‘foo’, default=1): works.
+For directed graphs, G.adj is identical to G.succ.
+Methods
+
|
+Add an edge between u and v. |
+
|
+Add all the edges in ebunch_to_add. |
+
|
+Add a single node node_for_adding and update node attributes. |
+
|
+Add multiple nodes. |
+
|
+Add weighted edges in ebunch_to_add with specified weight attr |
+
|
+Returns an iterator over (node, adjacency dict) tuples for all nodes. |
+
|
+alias of |
+
|
+alias of |
+
|
+Remove all nodes and edges from the graph. |
+
|
+Remove all edges from the graph without altering nodes. |
+
|
+Returns a copy of the graph. |
+
|
+alias of |
+
|
+Returns the subgraph induced by the specified edges. |
+
|
+Returns the attribute dictionary associated with edge (u, v). |
+
|
+
|
+
|
+gets node label from node ID |
+
|
+alias of |
+
|
+Returns True if the edge (u, v) is in the graph. |
+
|
+Returns True if the graph contains the node n. |
+
|
+Returns True if node u has predecessor v. |
+
|
+Returns True if node u has successor v. |
+
|
+Returns True if graph is directed, False otherwise. |
+
|
+Returns True if graph is a multigraph, False otherwise. |
+
+ | Loads the instance variables of this object with appropriate values. |
+
|
+Returns an iterator over nodes contained in nbunch that are also in the graph. |
+
|
+Returns an iterator over successor nodes of n. |
+
|
+alias of |
+
|
+alias of |
+
|
+Returns the number of edges between two nodes. |
+
|
+Returns the number of nodes in the graph. |
+
|
+Returns the number of nodes in the graph. |
+
|
+Returns an iterator over predecessor nodes of n. |
+
|
+Remove the edge between u and v. |
+
|
+Remove all edges specified in ebunch. |
+
|
+Remove node n. |
+
|
+Remove multiple nodes. |
+
+ | Resets the weights assigned to the edges of the DAG. |
+
|
+Returns the reverse of the graph. |
+
|
+Returns the number of edges or total of all edge weights. |
+
|
+Returns a SubGraph view of the subgraph induced on nodes. |
+
|
+Returns an iterator over successor nodes of n. |
+
|
+Returns a directed representation of the graph. |
+
|
+Returns the class to use for empty directed copies. |
+
|
+Returns an undirected representation of the digraph. |
+
|
+Returns the class to use for empty undirected copies. |
+
|
+Update the graph using nodes/edges/graphs as input. |
+
initialize_dictionaries |
++ |
List of edges in the DAG.
+List of nodes in the DAG.
+List of the weights assigned to the edges in the DAG, arranged +in the same order as the edges are in the list of all_temp_files edges.
+Dictionary that maps edges to their indices in the list of all_temp_files edges. +This is maintained for efficiency purposes.
+List of non-special edges in the DAG.
+Dictionary that maps non-special edges to their indices in the +list of all_temp_files edges. This is maintained for efficiency purposes.
+nodes (List[str] :) – Nodes of a path in the directed acyclic graph
+List of edges that lie along the path.
+gets node label from node ID
+node (int :) – ID of the node of interest
+label corresponding to the node. (code corresponding to the node in LLVM IR)
+Loads the instance variables of this object with appropriate +values. This method is useful when the DAG is loaded from a DOT file.
+List of nodes in the DAG that are not the sink. +We assume that there is only one sink. +This is maintained for efficiency purposes.
+Dictionary that maps nodes (except the sink) to their indices in +the list of all_temp_files nodes (except the sink). This is maintained for +efficiency purposes.
+List of nodes in the DAG that are neither the source nor the sink. +We assume that there is only one source and one sink. This is +maintained for efficiency purposes.
+Dictionary that maps nodes (except the source and the sink) to their +indices in the list of all_temp_files nodes (except the source and the sink). +This is maintained for efficiency purposes.
+Dictionary that maps nodes to their indices in the list of all_temp_files nodes. +This is maintained for efficiency purposes.
+Number of edges in the DAG.
+Number of nodes in the DAG.
+Number of paths in the DAG.
+Resets the weights assigned to the edges of the DAG.
+Sink of the DAG.
+Dictionary that maps nodes to the special (‘default’) edges.
+Constructs a ~gametime.nxHelper.Dag object to represent +the directed acyclic graph described in DOT format in the file provided.
+location (str :) – Path to the file describing a directed acyclic graph in DOT format
+Object that represents the directed acyclic graph.
+~gametime.src.nx_helper.Dag
+G – The graph to find root node in
+Root node of G or None if one doesn’t exist.
+Node
+dag (Dag :) – DAG represented by a ~gametime.src.nx_helper.Dag object.
source (str :) – source to start path with
sink (str :) – sink to end path with
Random path in the DAG provided from the input source node to +the input sink node, represented as a list of nodes arranged in +order of traversal from source to sink.
+List[str]
+dag (Dag :) – DAG represented by a dag
+True if, and only if, the DAG provided has cycles.
+bool
+dag – DAG represented by a ~gametime.src.nx_helper.Dag object.
source – Source node.
sink – Sink node.
Number of paths in the DAG provided. Note: Passed in DAG must be actually acyclic.
+int
+Remove all back edges from G to make it a DAG. Assuming G is connected and rooted at ROOT.
+G – The graph to remove root edges
root – The root node of G to start DFS with
DAG version of G with all back edges removed.
+Writes the directed acyclic graph provided to a file in DOT format.
+dag (Dag :) – Dag to save to dot
location (str :) – Location of the file.
dag_name (str :) – Name of the directed acyclic graph, as will be written to +the file. If this argument is not provided, the directed +acyclic graph will not have a name. (Default value = “”)
edges_to_labels (Dict[Tuple[str, str], str]:) – Dictionary that maps an edge to the label that will annotate +the edge when the DOT file is processed by a visualization tool. +If this argument is not provided, these annotations will not +be made. (Default value = None)
highlighted_edges (List[Tuple[str, str]]:) – List of edges that will be highlighted when the DOT file is +processed by a visualization tool. If this argument +is not provided, no edges will be highlighted. (Default value = None)
highlight_color (str:) – Color of the highlighted edges. This argument can be any value +that is legal in the DOT format. If the highlightedEdges argument +is not provided, this argument is ignored. (Default value = “red”)
Bases: object
Methods
+
|
+run the entire simulation on the given path |
+
Defines classes and methods to generate objects of the “Path” class +that represent different types of feasible paths in the code being analyzed, +such as those with the worst-case values.
+Bases: object
Exposes static methods to generate objects of the Path
class that
+represent different types of feasible paths in the code being analyzed.
This class is closely related to the Analyzer
class: except
+for the private helper methods, all of the static methods
+can also be accessed as instance methods of an Analyzer
object.
These methods are maintained in this class to keep the codebase cleaner +and more modular. Instances of this class should not need to be made.
+Methods
+
|
+Generates a list of feasible paths of the code being analyzed, each represented by an object of the |
+
Generates a list of feasible paths of the code being analyzed,
+each represented by an object of the Path
class.
The type of the generated paths is determined by the path_type
+argument, which is a class variable of the PathType
class.
+By default, this argument is PathType.WORST_CASE
. For
+a description of the types, refer to the documentation of
+the PathType
class.
The num_paths
argument is an upper bound on how many paths should
+be generated, which is 5 by default. This argument is ignored if
+this method is used to generate all of the feasible paths of the code
+being analyzed.
The interval
argument is an Interval
object that represents
+the interval of values that the generated paths can have. If
+no Interval
object is provided, the interval of values is
+considered to be all real numbers.
This method is idempotent: a second call to this method will produce
+the same list of Path
objects as the first call, assuming that
+nothing has changed between the two calls.
Precondition: The basis Path
objects of the input Analyzer
+object have values associated with them. Refer to either the method
+loadBasisValuesFromFile
or the method loadBasisValues
in
+the Analyzer
class.
analyzer – Analyzer
object that maintains information about
+the code being analyzed.
num_paths – Upper bound on the number of paths to generate.
path_type – Type of paths to generate, represented by a class variable of
+the PathType
class. The different types of paths are
+described in the documentation of the PathType
class.
interval – Interval
object that represents the interval of
+values that the generated paths can have. If no
+Interval
object is provided, the interval of values
+is considered to be all real numbers.
use_ob_extraction – Boolean value specifiying whether to use overcomplete +basis extraction algorithm
List of feasible paths of the code being analyzed, each
+represented by an object of the Path
class.
List[Path]
+Bases: object
Represents the type of paths that can be generated.
+Methods
+
|
+
|
+
All feasible paths, arranged in decreasing order of value.
+All feasible paths, arranged in increasing order of value.
+Best-case feasible paths, arranged in increasing order of value.
+Random feasible paths.
+Worst-case feasible paths, arranged in decreasing order of value.
+path_type – One of the predefined path types
+One-word description of the path type provided.
+Defines a class that maintains a representation of, and information about, +a single path in the code that is being analyzed.
+Bases: object
Maintains a representation of, and information about, +a single path in the code that is being analyzed.
+Methods
++ |
|
+
+ |
|
+
+ |
|
+
+ |
|
+
+ |
|
+
+ |
|
+
|
+
|
+
+ |
|
+
+ |
|
+
+ |
|
+
+ |
|
+
|
+Reads, from a file, information about the expressions associated with the temporary index variables of aggregate accesses along a path. |
+
|
+Reads information about the array accesses made in conditions along a path from a file. |
+
|
+Reads, from a file, the assignments to variables that would drive an execution of the code under analysis along a path. |
+
|
+Reads the numbers of the conditions along a path, and the edges that are associated with the conditions, from a file. |
+
|
+Reads the line numbers of the conditional points in the code being analyzed, along with their truth values along a path, from a file. |
+
|
+Reads the conditions along a path from a file. |
+
|
+Reads the line numbers of the source-level statements that lie along a path from a file. |
+
|
+Reads the measured value of a path from a file. |
+
|
+Reads the IDs of the nodes in a directed acyclic graph along a path from a file. |
+
|
+Reads the predicted value of a path from a file. |
+
|
+Sets the measured value (runtime, energy consumption, etc.) of this path. |
+
|
+Sets the predicted value (runtime, energy consumption, etc.) of this path. |
+
|
+Writes information about the expressions associated with the temporary index variables of aggregate accesses along this path to a file. |
+
|
+Writes information about the array accesses made in conditions along this path to a file. |
+
|
+Writes the assignments to variables that would drive an execution of the code under analysis along this path to a file. |
+
|
+Writes the numbers of the conditions along this path, and the edges that are associated with the conditions, to a file. |
+
|
+Writes the line numbers of the conditional points in the code being analyzed, along with their truth values, to a file. |
+
|
+Writes the conditions along this path to a file. |
+
|
+Writes, to an LP file, the integer linear programming problem that, when solved, produced this path. |
+
|
+Writes the line numbers of the source-level statements that lie along this path to a file. |
+
|
+Writes the measured value of this path to a file. |
+
|
+Writes the IDs of the nodes in a directed acyclic graph along this path to a file. |
+
|
+Writes the predicted value of this path to a file. |
+
Information about the expressions associated with the temporary
+index variables of aggregate accesses along this path, represented
+as a dictionary that maps the number of a temporary index variable
+to an IndexExpression
object.
Information about array accesses made in conditions along this path, +represented as a dictionary that maps the name of an array to a +list of tuples, each of which contains the numbers of the temporary +index variables in an array access.
+Dictionary of assignments to variables that would drive an execution +of the code along this path.
+Dictionary that associates the number of a condition with +the edge in the directed acyclic graph that is associated with +the condition. The edge is represented as a tuple.
+Dictionary that associates the line numbers of the conditional points +in the code being analyzed with their truth values.
+Conditions along this path, represented as a list of strings.
+String representation of the expressions associated +with the temporary index variables of aggregate accesses +along a path.
+str
+String representation of the array accesses made in +conditions along this path.
+str
+String representation of the assignments to variables +that would drive an execution of the code under analysis +along this path.
+str
+String representation of the numbers of the conditions along +this path, and the edges that are associated with the conditions.
+str
+String representation of the line numbers of the conditional points +in the code being analyzed, along with their truth values.
+str
+String representation of the conditions along this path.
+str
+condition_nums (List[int] :) – List of conditions
+List of the edges that are associated with the conditions +(along this path) whose numbers are provided. Each edge is +represented as a tuple, and appears only once in the list.
+List[Tuple[str]]
+String representation of the line numbers of +the source-level statements that lie along this path.
+str
+String representation of the measured value +(runtime, energy consumption, etc.) of this path.
+str
+String representation of the IDs of the nodes in +a directed acyclic graph along this path.
+str
+String representation of the predicted value +(runtime, energy consumption, etc.) of this path.
+str
+Integer linear programming problem that, when solved, produced
+this path, represented as an IlpProblem
object.
Line numbers of the source-level statements along this path, +represented as a list of positive integers.
+Measured value (runtime, energy consumption, etc.) +of this path, represented as a number (either +an integer or a floating-point number).
+IDs of the nodes in a directed acyclic graph along this path, +represented as a list of strings.
+Predicted value (runtime, energy consumption, etc.) +of this path, represented as a number (either +an integer or a floating-point number).
+Reads, from a file, information about the expressions associated with +the temporary index variables of aggregate accesses along a path.
+location (str :) – Location of the file
+Dictionary that maps the number of a temporary index
+variable to an IndexExpression
object.
Dict[int, IndexExpression]
+Reads information about the array accesses made in conditions +along a path from a file.
+location (str :) – Location of the file
+Dictionary that maps an array name to a list of tuples, each of +which contains the numbers of the temporary index variables +in an array access.
+Dict[str, List[Tuple[int, int]]]
+Reads, from a file, the assignments to variables that would +drive an execution of the code under analysis along a path.
+location (str :) – Location of the file
+Dictionary of assignments to variables that would +drive an execution of the code under analysis along a path.
+Dict[str, str]
+Reads the numbers of the conditions along a path, and +the edges that are associated with the conditions, from a file.
+location (str :) – Location of the file
+Dictionary that associates the number of a condition with +the edge in the directed acyclic graph that is associated with +the condition. The edge is represented as a tuple.
+Dict[int, Tuple[str]]
+Reads the line numbers of the conditional points in the code +being analyzed, along with their truth values along a path, +from a file.
+location (str :) – Location of the file
+Dictionary that associates the line numbers of +the conditional points in the code being analyzed with +their truth values.
+Dict[int, bool]
+Reads the conditions along a path from a file.
+location (str :) – Location of the file
+Conditions along a path, represented as a list of strings.
+List[str]
+Reads the line numbers of the source-level statements that +lie along a path from a file.
+location (str :) – Location of the file
+Line numbers of the source-level statements along this path, +represented as a list of positive integers.
+List[int]
+Reads the measured value of a path from a file.
+location (str :) – Location of the file
+Measured value of a path, represented as a number +(either an integer or a floating-point number).
+float
+Reads the IDs of the nodes in a directed acyclic graph +along a path from a file.
+location (str :) – Location of the file
+IDs of the nodes in a directed acyclic graph along a path, +represented as a list of strings.
+List[str]
+Reads the predicted value of a path from a file.
+location (str :) – Location of the file
+Predicted value of a path, represented as a number +(either an integer or a floating-point number).
+float
+Sets the measured value (runtime, energy consumption, etc.) +of this path.
+value (float :) – Value to set as the measured value of this path
+Sets the predicted value (runtime, energy consumption, etc.) +of this path.
+value (float :) – Value to set as the predicted value of this path
+Writes information about the expressions associated with the +temporary index variables of aggregate accesses along this path +to a file.
+location (str :) – Location of the file
+Writes information about the array accesses made in conditions +along this path to a file.
+location (str :) – Location of the file
+Writes the assignments to variables that would drive an execution +of the code under analysis along this path to a file.
+location (str :) – Location of the file
+Writes the numbers of the conditions along this path, and +the edges that are associated with the conditions, to a file.
+location (str :) – Location of the file
+Writes the line numbers of the conditional points in the code +being analyzed, along with their truth values, to a file.
+location (str :) – Location of the file
+Writes the conditions along this path to a file.
+location (str :) – Location of the file
+Writes, to an LP file, the integer linear programming problem that, +when solved, produced this path.
+location – Location of the file
+Writes the line numbers of the source-level statements that +lie along this path to a file.
+location (str:) – Location of the file
+Writes the measured value of this path to a file.
+location (str :) – Location of the file
+Writes the IDs of the nodes in a directed acyclic graph +along this path to a file.
+location (str :) – Location of the file
+Writes the predicted value of this path to a file.
+Location of the file
+Bases: object
Methods
+
|
+
|
+
configuration_file_path (str :) – Path to configuration file
+ProjectConfiguration object corresponding to file.
+Bases: ConfigurationParser
Methods
+
|
+
|
+
configuration_file_path (str :) – Path to configuration file
+ProjectConfiguration object corresponding to file.
+Gets a list of directory paths from the string provided, where +the directory paths are separated by whitespaces or commas.
+Directory to which the directory paths may be relative (Default value = None)
+Gets a list of file paths from the string provided, where the file +paths are separated by whitespaces or commas. The paths can also be +Unix-style globs.
+file_paths_str (str :) – String of file paths
dir_location (str :) – Directory to which the file paths may be relative (Default value = None)
List of file paths in the string.
+List[str]
+Bases: object
Stores debugging configuration information, which +determines the debugging information that is shown and +the temporary files that are dumped.
+Dump information about all_temp_files of the paths that have been traced +during analysis to a file.
+Dump information about all_temp_files of the SMT queries that +have been made during analysis to a file.
+Dump information produced when an IR-level instruction +is traced backward.
+Dump the Phoenix intermediate representation of the function +under analysis to a file.
+Dump information about the path being traced.
+Dump information produced when an SMT query is created.
+Keep the temporary files that CIL generates during its analysis.
+Keep debugging information and files produced by +the integer linear programming solver.
+Keep the debugging information and the temporary files +produced by the parser.
+Keep the temporary files produced by a simulator when +measuring the value of a path.
+Bases: object
Stores information necessary to configure a GameTime project.
+Methods
+
|
+Return path of file with name and extension. |
+
|
+Return path of temporary file with name and extension. |
+
|
+
|
+
Return path of file with name and extension. Extension should +be preceded by a period. For example, calling this function with extension +“.bc” should return something like “…. /main.bc”
+extension (str :) – extension of the file
name (str :) – name of the file (defaults to self.nameOrigNoExtension) (Default value = None)
path of the file in the original directory.
+str
+Return path of temporary file with name and extension. Extension should +be preceded by a period. For example, calling this function with extension +“.bc” should return something like “…. maingt/main.bc”
+extension (str :) – extension of the temporary file name
name (str :) – name of the temporary file (defaults to self.nameOrigNoExtension) (Default value = None)
path of the temporary file
+str
+ilp_solver_name (str:) – ILP solver name to use
+Exposes functions to interact with different +linear programming solvers through the PuLP package.
+Bases: object
Represents the extremum that needs to be determined.
+Find the longest path.
+Find the shortest path.
+Bases: LpProblem
Maintains information about an integer linear programming problem. +It is a subclass of the ~pulp.LpProblem class of the PuLP +package, and stores additional information relevant to the GameTime +analysis, such as the value of the objective function of the problem.
+Methods
+
|
+Adds a variable to the problem before a constraint is added |
+
|
+Adds variables to the problem before a constraint is added |
+
|
+Sets the status of the model after solving. |
+
|
+Checks if there are at least two variables with the same name :return: 1 :raises const.PulpError: if there ar duplicates |
+
|
+Checks if variables have names smaller than max_length :param int max_length: max size for variable name :return: :raises const.PulpError: if there is at least one variable that has a long name |
+
|
+Make a copy of self. |
+
|
+Make a copy of self. |
+
|
+extends an LpProblem by adding constraints either from a dictionary a tuple or another LpProblem object. |
+
|
+Takes a dictionary with all necessary information to build a model. |
+
|
+Creates a new Lp Problem from a json file with information |
+
|
+Takes a dictionary with all necessary information to build a model. |
+
|
+Creates a new Lp Problem from a json file with information |
+
|
+
|
+
|
+
|
+
|
+resolves an Problem using the same solver as previously |
+
|
+Rounds the lp variables |
+
|
+Solve the given Lp problem with several objective functions. |
+
|
+Sets the input variable as the objective function. |
+
|
+Sets the Solver for this problem useful if you are using resolve |
+
|
+Solve the given Lp problem. |
+
|
+initializes properties with the current time |
+
|
+updates time wall time and cpu time |
+
|
+creates a dictionary from the model with as much data as possible. |
+
|
+Creates a json file from the LpProblem information |
+
|
+creates a dictionary from the model with as much data as possible. |
+
|
+Creates a json file from the LpProblem information |
+
|
+Returns the problem variables |
+
|
+Write the given Lp problem to a .lp file. |
+
|
+Writes an mps files from the problem information |
+
add |
++ |
addConstraint |
++ |
assignConsPi |
++ |
assignConsSlack |
++ |
assignVarsDj |
++ |
assignVarsVals |
++ |
coefficients |
++ |
fixObjective |
++ |
fromMPS |
++ |
getSense |
++ |
get_dummyVar |
++ |
infeasibilityGap |
++ |
isMIP |
++ |
normalisedNames |
++ |
restoreObjective |
++ |
unusedConstraintName |
++ |
valid |
++ |
variablesDict |
++ |
Value of the objective function, stored for efficiency purposes.
+Determines either the longest or the shortest path through the DAG
+with the constraints stored in the Analyzer
object provided.
analyzer – Analyzer
object that maintains information about
+the code being analyzed.
extremum – Type of extreme path to calculate.
interval – Interval
object that represents the interval of values
+that the generated paths can have. If no Interval
object
+is provided, the interval of values is considered to be
+all_temp_files real numbers.
Tuple whose first element is the longest or the shortest path
through the DAG, as a list of nodes along the path (ordered
by traversal from source to sink), and whose second element is
the integer linear programming problem that was solved to obtain
the path, as an object of the IlpProblem
class.
If no such path is feasible, given the constraints stored in
the Analyzer
object and the Interval
object provided,
the first element of the tuple is an empty list, and the second
element of the tuple is an IlpProblem
object whose obj_al
instance variable is None.
pi = a_1 b_1 + … + a_n b_n
+of paths b_i from basis. This function returns the least number c +such that every path can be expressed as a linear combination of basis +paths b_i such that the sum of absolute value of coefficients is at +most c:
+++
analyzer – Analyzer
object that maintains information about
+the code being analyzed.
paths – List of paths that we want to find out how well can be +expressed as a linear combination of paths in basis
basis – List of paths that are used to express paths as a linear +combination of
The number c as described in the paragraph above.
+specified by ‘analyzer’, that is feasible with the given set of +measurements as specified by ‘paths’. The method does not take into +account which paths are feasible and which not; it considers all_temp_files the +paths in the graph.
+analyzer – Analyzer
object that maintains information about
+the code being analyzed.
paths – List of paths used in the measurements. Each path is a list of +edges in the order in which they are visited by the path
A floating point value—the least delta compatible with the +measurements
+float
+measured lengths of paths, as given in ‘paths’, such the actual +lengths are within ‘delta’ of the measured lengths
+analyzer – Analyzer
object that maintains information about
+the code being analyzed.
paths – List of paths used in the measurements. Each path is a list of +edges in the order in which they are visited by the path
delta – the maximal limit by which the length of a measured path is +allowed to differ from the measured value
extremum – Specifies whether we are calculating Extremum.LONGEST or +Extremum.SHORTEST
Pair consisting of the resulting path and the ILP problem used to
calculate the path
smallest set of ‘basis paths’ with the following property: Each path pi +in `paths’, can be expressed as a linear combination
+++pi = a_1 b_1 + … + a_n b_n
+
of paths b_i from basis. This function finds the set of basis paths +such that every path can be expressed as a linear combination of basis +paths b_i such that the sum of absolute value of coefficients is at +most ‘k’:
+++
analyzer – Analyzer
object that maintains information about
+the code being analyzed.
paths – List of paths that we want to find out how well can be +expressed as a linear combination of paths in basis
k – bound on how well the ‘paths’ can be expressed as a linear +combination of the calculated basis paths
List of paths satisfying the condition stated above
+assuming the lengths of all_temp_files measured paths are between -1 and 1.
+analyzer – Analyzer
object that maintains information about
+the code being analyzed.
paths – List of paths used in the measurements. Each path is a list of +edges in the order in which they are visited by the path
bound –
???
+Triple consisting of the length of the longsest path, the path itself
and the ILP solved to find the path.
This function actually constructs the ILP to find the longest path +in the graph specified by ‘analyzer’ using the set of measured paths given +by ‘paths’.
+analyzer – Analyzer
object that maintains information about
+the code being analyzed. Among others, contains the underlying
+DAG or the collection of infeasible paths.
paths – List of paths used in the measurements. Each path is a list of +edges in the order in which they are visited by the path
pathFunctionUpper – Function of type: path -> float that for a given path should +return the upper bound on the length of the given path. The +input ‘path’ is always from ‘paths’
pathFunctionLower – Function of type: path -> float that for a given path should +return the upper bound on the length of the given path. The +input ‘path’ is always from ‘paths’
weightsPositive – Boolean value specifying whether the individual edge weight are +required to be at least 0 (if set to True) or can be arbitrary +real value (if set to False)
printProblem – Boolean value used for debugging. If set to true, the generated +ILP is printed.
extremum – Specifies whether we are calculating Extremum.LONGEST or +Extremum.SHORTEST
Triple consisting of the length of the longest path found, the actual
path and the ILP problem generated.
ilp_solver_name (str :) – Name of the integer linear programming solver
project_config (ProjectConfiguration :) – ProjectConfiguration object that represents the configuration of a GameTime project
PuLP solver object that can interface with the integer
linear programming solver whose name is provided, or None, if
no such object can be found.
ilp_solver (pulp.LpSolver :) – Object of a PuLP solver class
+Name, as used by GameTime, of the integer linear programming +solver that the input PuLP solver object can interface with, +or None, if no such name can be found.
+str, Optional
+List of the names of the supported integer linear programming solvers.
+List[str]
+List of proper names of the supported integer linear programming +solvers, for display purposes.
+List[str]
+ilp_solver_name (str :) – Name of an integer linear programming solver used by GameTime
+Proper name of an integer linear programming solver, +for display purposes.
+str
+name (str :) – Possible name of an integer linear programming solver
+True if, and only if, the name provided is the name of a supported +integer linear programming solver.
+bool
+Compact means that if in the original graph, there is a simple +path without any branching between two nodes, then in the resulting +graph the entire simple path is replaced by only one edge
+dag – The graph that get compactified
+A mapping (vertex, vertex) -> edge_number so that the edge
(vertex, vertex) in the original graph ‘dag’ gets mapped to
the edge with number ‘edge_number’. All edges on a simple path
without branching get mapped to the same ‘edge_number’
Exposes classes and functions to maintain a representation of, and +to interact with, a backend, which will be used to measure values +that correspond to different paths in the code that is being analyzed.
+Bases: object
Maintains a representation of a backend, which will be used +to measure values that correspond to different paths in the code +that is being analyzed.
+Methods
+
|
+Perform measurement using the backend. |
+
Perform measurement using the backend.
+inputs (str:) – the inputs to drive down a PATH in a file
measure_folder (str :) – all generated files will be stored in MEASURE_FOLDER/{name of backend}
The measured value of path
+Name of the backend that this object represents.
+GameTime project configuration for the code that is being analyzed.
+Bases: Backend
Methods
+
|
+Modifies the input program to use INPUTS and generates the executable code. |
+
|
+Perform measurement using the backend. |
+
|
+Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program. |
+
Modifies the input program to use INPUTS and generates the executable code. Stored at MEASURE_FOLDER/driver
+filepath (str :) – Path to C file to modify with inputs.
func_name (str :) – Name of function being analyzed.
inputs (str :) – Path to the INPUTS file containing output of symbolic solver.
measure_folder (str :) – The folder to store generated executable.
Path to the executable code.
+Perform measurement using the backend.
+inputs (str:) – the inputs to drive down a PATH in a file
measure_folder (str :) – all generated files will be stored in MEASURE_FOLDER/{name of backend}
The measured value of path
+Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program. +Temperaries are stored in STORED_FOLDER.
+stored_folder (str :) – Folder to put all the generated tempraries.
executable_path (str :) – Path to executable.
Measured cycle count for EXECUTABLE_PATH.
+Bases: Backend
Methods
+
|
+Use same Make file mechanism as Flexpret to generate .mem file from .c |
+
|
+Modifies the input program to use INPUTS and returns path to modifed C program. |
+
|
+Perform measurement using the backend. |
+
|
+Run simulation on the .mem file generated. |
+
Use same Make file mechanism as Flexpret to generate .mem file from .c
+stored_folder (str :) – Folder to put all the generated tempraries.
file_name (str :) – Name of function being analyzed.
c_filepath (str :) – Path to C file being executed.
Measured cycle count for C_FILEPATH.
+Modifies the input program to use INPUTS and returns path to modifed C program.
+filepath (str :) – Path to C file to modify with inputs.
func_name (str :) – Name of function being analyzed.
inputs (str :) – Path to the INPUTS file containing output of symbolic solver.
measure_folder (str :) – The folder to store generated C code.
Path to the modified C file.
+Perform measurement using the backend.
+inputs (str:) – the inputs to drive down a PATH in a file
measure_folder (str :) – all generated files will be stored in MEASURE_FOLDER/{name of backend}
The measured value of path
+Run simulation on the .mem file generated. The measurements are stored in measure.out +Equivalent to: os.system(f”(cd {dir path of .mem file} && fp-emu –measure +ispm={file_name}.mem)”)
+stored_folder (str :) – Folder to put all the generated tempraries.
mem_filepath (str :) – Path to the .mem file +:return the measurement value
Measured cycle count for MEM_FILEPATH.
+Bases: Backend
Methods
+
|
+Modifies the input program to use INPUTS and generates the executable code. |
+
|
+Perform measurement using the backend. |
+
|
+Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program. |
+
Modifies the input program to use INPUTS and generates the executable code. Stored at MEASURE_FOLDER/driver
+filepath (str :) – Path to C file to modify with inputs.
func_name (str :) – Name of function being analyzed.
inputs (str :) – Path to the INPUTS file containing output of symbolic solver.
measure_folder (str :) – The folder to store generated executable.
Path to the executable code.
+Perform measurement using the backend.
+inputs (str:) – the inputs to drive down a PATH in a file
measure_folder (str :) – all generated files will be stored in MEASURE_FOLDER/{name of backend}
The measured value of path
+Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program. +Temperaries are stored in STORED_FOLDER.
+stored_folder (str :) – Folder to put all the generated tempraries.
executable_path (str :) – Path to executable.
Measured cycle count for EXECUTABLE_PATH.
++ Searching for multiple words only shows matches that contain + all words. +
+ + + + + + + + +