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( + '" + ) + ); + }, + + /** + * 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 @@ + + + + + + + Index — GameTime 0.0.1 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | K + | L + | M + | N + | O + | P + | R + | S + | T + | U + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
    +
  • GameTime (class in gametime.src) +
  • +
  • + gametime.src + +
  • +
  • + gametime.src.analyzer + +
  • +
  • + gametime.src.backend + +
  • +
  • + gametime.src.backend.arm_backend + +
  • +
  • + gametime.src.backend.arm_backend.arm_backend + +
  • +
  • + gametime.src.backend.backend + +
  • +
  • + gametime.src.backend.flexpret_backend + +
  • +
  • + gametime.src.backend.flexpret_backend.flexpret_backend + +
  • +
  • + gametime.src.backend.x86_backend + +
  • +
  • + gametime.src.backend.x86_backend.x86_backend + +
  • +
  • + gametime.src.clang_helper + +
  • +
  • + gametime.src.defaults + +
  • +
  • + gametime.src.file_helper + +
  • +
  • + gametime.src.gametime_configuration + +
  • +
  • + gametime.src.gametime_error + +
  • +
  • + gametime.src.histogram + +
  • +
  • + gametime.src.interval + +
  • +
  • + gametime.src.logging_helper + +
  • +
  • + gametime.src.nx_helper + +
  • +
  • + gametime.src.path + +
  • +
  • + gametime.src.path_analyzer + +
  • +
  • + gametime.src.path_generator + +
  • +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + +
+ +

U

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..0d5135c --- /dev/null +++ b/html/index.html @@ -0,0 +1,125 @@ + + + + + + + + Welcome to GameTime’s documentation! — GameTime 0.0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Welcome to GameTime’s documentation!

+ +
+
+

Indices and tables

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/html/modules.html b/html/modules.html new file mode 100644 index 0000000..9f32150 --- /dev/null +++ b/html/modules.html @@ -0,0 +1,3778 @@ + + + + + + + + GameTime src Documentation — GameTime 0.0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

GameTime src Documentation

+

This document provides comprehensive documentation for all the modules in the GameTime framework.

+
+

Main Package Module

+
+
+class gametime.src.GameTime
+

Bases: object

+

Contains methods and variables that allow a user to import +GameTime as a module.

+

Methods

+ + + + + + +

analyze(project_config)

+
param project_config:
+

object that represents the configuration of a GameTime project.

+
+
+

+
+
+static analyze(project_config: ProjectConfiguration) Analyzer
+
+
Parameters:
+

project_config – object that represents the configuration of a GameTime project.

+
+
Returns:
+

configuration provided.

+
+
+
+ +
+ +
+
+class gametime.src.analyzer.Analyzer(project_config: ProjectConfiguration)
+

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.

+
+
Parameters:
+

project_config – Object that represents the configuration of a GameTime project.

+
+
+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

add_path_bundled_constraint(edges)

Adds the edges provided to the list of path-bundled constraints, if not already present.

add_path_exclusive_constraint(edges)

Adds the edges provided to the list of path-exclusive constraints, if not already present.

create_dag()

Creates the DAG corresponding to the code being analyzed and dumps the DAG, in DOT format, to a temporary file for further analysis.

estimate_edge_weights()

Estimates the weights on the edges of the DAG, using the values of the basis "Path" objects.

generate_basis_paths()

Generates a list of "Path" objects, each of which represents a basis path of the code being analyzed.

generate_overcomplete_basis(k)

Generates an overcomplete basis so that each feasible path can be

iteratively_find_overcomplete_basis(...)

Generates overcomplete basis such the lenth of the longest

load_dag_from_dot_file(location)

Loads the DAG that corresponds to the code being analyzed from a DOT file.

measure_basis_paths()

Measure all generated BASIS_PATHS again

measure_path(path, output_name)

Measure the Path if never measured before.

measure_paths(paths, output_name_prefix)

Measure the list of PATHS.

reset_path_bundled_constraints()

Resets the path-bundled constraints.

reset_path_exclusive_constraints()

Resets the path-exclusive constraints.

+ + + + + + +

generate_paths

+
+
+add_path_bundled_constraint(edges: List[Tuple[str, str]])
+

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.

+
+
Parameters:
+

edges (List[Tuple[str, str]] :) – List of edges to add to the list of path-bundled constraints.

+
+
+
+ +
+
+add_path_exclusive_constraint(edges: List[Tuple[str, str]])
+

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.

+
+
Parameters:
+

edges (List[Tuple[str, str]] :) – List of edges to add to the list of path-exclusive constraints.

+
+
+
+ +
+
+basis_matrix: ndarray | None
+

Basis matrix.

+
+ +
+
+create_dag()
+

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.

+
+ +
+
+dag: Dag
+

Data structure for the DAG of the code being analyzed.

+
+ +
+
+estimate_edge_weights()
+

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.

+
+ +
+
+generate_basis_paths()
+

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.

+
+
Returns:
+

    +
  • List of basis paths of the code being analyzed, each

  • +
  • represented by an object of the “Path” class.

  • +
+

+
+
+
+ +
+
+generate_overcomplete_basis(k: int)
+
+
Generates an overcomplete basis so that each feasible path can be

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.

+
+
+
+
Parameters:
+

k (int :) – Maximum value of L1 norm.

+
+
+
+ +
+
+generate_paths(*args, **kwargs)
+
+ +
+
+iteratively_find_overcomplete_basis(initial_paths: List[List[Tuple[str, str]]], k: int)
+
+
Generates overcomplete basis such the lenth of the longest

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.

+
+
+
+
Parameters:
+
    +
  • initial_paths (List[List[Tuple[str, str]]] :) – A list of initial paths to begin with.

  • +
  • k (int :) – Maximum value of L1 norm.

  • +
+
+
Return type:
+

The set of basis paths.

+
+
+
+ +
+
+load_dag_from_dot_file(location: str)
+

Loads the DAG that corresponds to the code being analyzed from a DOT file.

+
+
Parameters:
+

location (str :) – Location of the file.

+
+
+
+ +
+
+measure_basis_paths()
+

Measure all generated BASIS_PATHS again

+
+ +
+
+measure_path(path: Path, output_name: str) int
+

Measure the Path if never measured before. If no name was set, the parameter output_name is used.

+
+
Parameters:
+
    +
  • path (Path :) – The path object

  • +
  • output_name (str :) – Name for this path.

  • +
+
+
Return type:
+

Measured cycle count for PATH.

+
+
+
+ +
+
+measure_paths(paths: list[Path], output_name_prefix: str) int
+

Measure the list of PATHS. Using prefix and index as name if none is given.

+
+
Parameters:
+
    +
  • paths (list[Path] :) – List of paths to measure.

  • +
  • output_name_prefix (str :) – Prefix to use for the name of each path

  • +
+
+
Return type:
+

List of measured values for the paths.

+
+
+
+ +
+
+path_bundled_constraints: List[List[Tuple[str, str]]]
+

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”.

+
+ +
+
+path_dimension: int
+

Dimension of the vector representing each path.

+
+ +
+
+path_exclusive_constraints: List[List[Tuple[str, str]]]
+

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”.

+
+ +
+
+project_config: ProjectConfiguration
+

ProjectConfiguration object +that represents the configuration of a GameTime project.

+
+ +
+
+reset_path_bundled_constraints()
+

Resets the path-bundled constraints.

+
+ +
+
+reset_path_exclusive_constraints()
+

Resets the path-exclusive constraints.

+
+ +
+ +

Functions to help interacting with clang on the command +line. Allows creation of dags

+
+
+gametime.src.clang_helper.bc_to_executable(bc_filepath: str, output_folder: str, output_name: str, extra_libs: List[str] = [], extra_flags: List[str] = []) str
+

Compile the LLVM bitcode program into executable in OUTPUT_FILE_FOLDER.

+
+
Parameters:
+
    +
  • 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 = [])

  • +
+
+
Returns:
+

The path to executable.

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.clang_helper.compile_to_llvm_for_analysis(c_filepath: str, output_file_folder: str, output_name: str, extra_libs: List[str] = [], extra_flags: List[str] = [], readable: bool = True) str
+

Compile the C program into bitcode in OUTPUT_FILE_FOLDER using -O0 option to preserve maximum structure.

+
+
Parameters:
+
    +
  • 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)

  • +
+
+
Returns:
+

The path to bc.

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.clang_helper.compile_to_llvm_for_exec(c_filepath: str, output_file_folder: str, output_name: str, extra_libs: List[str] = [], extra_flags: List[str] = [], readable: bool = False) str
+

Compile the C program into bitcode in OUTPUT_FILE_FOLDER.

+
+
Parameters:
+
    +
  • 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)

  • +
+
+
Returns:
+

The path to bc.

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.clang_helper.dump_object(object_filepath: str, output_folder: str, output_name: str) str
+

Dump the .o file to OUTPUT_NAME.dmp

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Returns:
+

Path of the output OUTPUT_NAME.dmp file

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.clang_helper.generate_dot_file(bc_filename: str, bc_file_folder: str, output_name: str = 'main') str
+

Create dag from .bc file using opt through executing shell commands

+
+
Parameters:
+
    +
  • 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”)

  • +
+
+
Returns:
+

Path of the output .dot file

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.clang_helper.inline_functions(bc_filepath: str, output_file_folder: str, output_name: str) 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.

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Returns:
+

Path of the output .bc file

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.clang_helper.remove_temp_cil_files(project_config: ProjectConfiguration, all_temp_files=False) None
+

Removes the temporary files created by CIL during its analysis.

+
+
Parameters:
+
    +
  • project_config – ProjectConfiguration this helper is calling from.

  • +
  • all_temp_files – True if all files in temperary directory should be removed.

  • +
+
+
+
+ +
+
+gametime.src.clang_helper.unroll_loops(bc_filepath: str, output_file_folder: str, output_name: str, project_config: ProjectConfiguration) 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.

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Returns:
+

Path of the output .bc file

+
+
Return type:
+

str

+
+
+
+ +

Initializes the various variables, used in different +submodules of GameTime, with default values.

+
+
+gametime.src.defaults.config: GametimeConfiguration = <gametime_configuration.GametimeConfiguration object>
+

Default GametimeConfiguration object +that represents the configuration of GameTime.

+
+ +
+
+gametime.src.defaults.config_file: str = '/home/c/Desktop/research/lf/code/gametime/src/config.yaml.in'
+

Default configuration YAML file.

+
+ +
+
+gametime.src.defaults.gui_dir: str = '/home/c/Desktop/research/lf/code/gametime/src/gui'
+

Default directory that contains the GameTime GUI.

+
+ +
+
+gametime.src.defaults.source_dir: str = '/home/c/Desktop/research/lf/code/gametime/src'
+

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.

+
+
+gametime.src.file_helper.create_dir(location: str) None
+

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,

+
+
Parameters:
+

location (str :) – Location of the directory to be created

+
+
+
+ +
+
+gametime.src.file_helper.move_files(patterns: List[str], source_dir: str, dest_dir: str, overwrite: bool = True) None
+

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.

+
+
Parameters:
+
    +
  • 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)

  • +
+
+
+
+ +
+
+gametime.src.file_helper.remove_all_except(patterns: List[str], dir_location: str) None
+

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.

+
+
Parameters:
+
    +
  • patterns (List[str] :) – List of patterns to match filenames against

  • +
  • dir_location (str :) – Location of the directory to remove files from

  • +
+
+
+
+ +
+
+gametime.src.file_helper.remove_file(location: str) None
+

Removes the file at the provided location. This is a wrapper around +the remove() function of the os module, but does not

+
+
Parameters:
+

location (str :) – Location of the file to be removed

+
+
+
+ +
+
+gametime.src.file_helper.remove_files(patterns: List[str], dir_location: str) None
+

Removes the files from the directory whose location is provided, +whose names match any of the patterns in the list provided.

+
+
Parameters:
+
    +
  • patterns (List[str] :) – List of patterns to match filenames against

  • +
  • dir_location (str :) – Location of the directory to remove files from

  • +
+
+
+
+ +
+
+class gametime.src.gametime_configuration.Endianness
+

Bases: object

+

This class represents the endianness of the target machine.

+
+
+BIG = 0
+
+ +
+
+LITTLE = 1
+
+ +
+ +
+
+class gametime.src.gametime_configuration.GametimeConfiguration
+

Bases: object

+

Stores information necessary to configure GameTime.

+
+ +
+
+gametime.src.gametime_configuration.read_gametime_config_yaml(yaml_config_path: str) GametimeConfiguration
+

Creates GametimeConfiguration from yaml files

+
+
Parameters:
+

yaml_config_path (str :) – path of the yaml config file that contains

+
+
Returns:
+

GametimeConfiguration object that contains information from YAML file at yaml_config_path

+
+
Return type:
+

GametimeConfiguration

+
+
+
+ +

Defines the error that GameTime can throw.

+
+
+exception gametime.src.gametime_error.GameTimeError
+

Bases: Exception

+

Error that GameTime can throw.

+
+ +
+
+exception gametime.src.gametime_error.GameTimeWarning
+

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.

+
+
+gametime.src.histogram.compute_histogram(paths: list[Path], bins=10, path_value_range=None, measured=False)
+

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.

+
+
Parameters:
+
    +
  • 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)

  • +
  • measuredTrue if, and only if, the values that will be used for the histogram are the measured values of the feasible paths. (Default value = False)

  • +
+
+
Returns:
+

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.

+
+
Return type:
+

Tuple

+
+
+
+ +
+
+gametime.src.histogram.write_histogram_to_file(location, paths, bins=10, path_value_range=None, measured=False)
+

Create a histogram and write it to location.

+
+
Parameters:
+
    +
  • 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)

  • +
  • measuredTrue 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.

+
+
+class gametime.src.interval.Interval(lower: int = None, upper: int = None)
+

Bases: object

+

Maintains a representation of, and information about, +an interval of values.

+
+
Attributes:
+
+
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

+ + + + + + + + + +

has_finite_lower_bound()

+
rtype:
+

True if, and only if, the represented interval has a finite lower bound.

+
+
+

has_finite_upper_bound()

+
rtype:
+

True if, and only if, the represented interval has a finite upper bound.

+
+
+

+
+
+has_finite_lower_bound() bool
+
+
Return type:
+

True if, and only if, the represented interval has a finite lower bound.

+
+
+
+ +
+
+has_finite_upper_bound() bool
+
+
Return type:
+

True if, and only if, the represented interval has a finite upper bound.

+
+
+
+ +
+
+property lower_bound: int
+

rtype: Lower bound of the interval represented by this object, or None if the interval has no finite lower bound.

+
+ +
+
+property upper_bound: int
+

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.

+
+
+gametime.src.logging_helper.initialize(logger: Logger) None
+

Initializes the logger provided with +~logging.Formatter and ~logging.StreamHandler +objects appropriate for GameTime.

+
+
Parameters:
+

logger (logging.Logger :) – Logger to initialize

+
+
+
+ +

Exposes classes and functions to supplement those provided by +the NetworkX graph package.

+
+
+class gametime.src.nx_helper.Dag(*args, **kwargs)
+

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.

+
+
Attributes:
+
+
adj

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.

+
+
degree

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.

+
+
nbunchsingle node, container, or all nodes (default= all nodes)

The view will only report edges incident to these nodes.

+
+
weightstring or None, optional (default=None)

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.

+
+
+
+
DiDegreeView or int

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)]
+
+
+
+
edges

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.

+
+
nbunchsingle node, container, or all nodes (default= all nodes)

The view will only report edges from these nodes.

+
+
datastring or bool, optional (default=False)

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).

+
+
defaultvalue, optional (default=None)

Value used for edges that don’t have the requested attribute. +Only relevant if data is not True or False.

+
+
+
+
edgesOutEdgeView

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)])
+
+
+
+
in_degree

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.

+
+
nbunchsingle node, container, or all nodes (default= all nodes)

The view will only report edges incident to these nodes.

+
+
weightstring or None, optional (default=None)

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)]
+
+
+
+
in_edges

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):

+
+
nbunchsingle node, container, or all nodes (default= all nodes)

The view will only report edges incident to these nodes.

+
+
datastring or bool, optional (default=False)

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).

+
+
defaultvalue, optional (default=None)

Value used for edges that don’t have the requested attribute. +Only relevant if data is not True or False.

+
+
+
+
in_edgesInEdgeView or InEdgeDataView

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.

+
+
nodes

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.

+
+
datastring or bool, optional (default=False)

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.

+
+
defaultvalue, optional (default=None)

Value used for nodes that don’t have the requested attribute. +Only relevant if data is not True or False.

+
+
+
+
NodeView

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}
+
+
+
+
out_degree

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.

+
+
nbunchsingle node, container, or all nodes (default= all nodes)

The view will only report edges incident to these nodes.

+
+
weightstring or None, optional (default=None)

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)]
+
+
+
+
out_edges

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.

+
+
nbunchsingle node, container, or all nodes (default= all nodes)

The view will only report edges from these nodes.

+
+
datastring or bool, optional (default=False)

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).

+
+
defaultvalue, optional (default=None)

Value used for edges that don’t have the requested attribute. +Only relevant if data is not True or False.

+
+
+
+
edgesOutEdgeView

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)])
+
+
+
+
pred

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.

+
+
succ

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_edge(u_of_edge, v_of_edge, **attr)

Add an edge between u and v.

add_edges_from(ebunch_to_add, **attr)

Add all the edges in ebunch_to_add.

add_node(node_for_adding, **attr)

Add a single node node_for_adding and update node attributes.

add_nodes_from(nodes_for_adding, **attr)

Add multiple nodes.

add_weighted_edges_from(ebunch_to_add[, weight])

Add weighted edges in ebunch_to_add with specified weight attr

adjacency()

Returns an iterator over (node, adjacency dict) tuples for all nodes.

adjlist_inner_dict_factory

alias of dict

adjlist_outer_dict_factory

alias of dict

clear()

Remove all nodes and edges from the graph.

clear_edges()

Remove all edges from the graph without altering nodes.

copy([as_view])

Returns a copy of the graph.

edge_attr_dict_factory

alias of dict

edge_subgraph(edges)

Returns the subgraph induced by the specified edges.

get_edge_data(u, v[, default])

Returns the attribute dictionary associated with edge (u, v).

get_edges(nodes)

+
param nodes:
+

Nodes of a path in the directed acyclic graph

+
+
+

get_node_label(node)

gets node label from node ID

graph_attr_dict_factory

alias of dict

has_edge(u, v)

Returns True if the edge (u, v) is in the graph.

has_node(n)

Returns True if the graph contains the node n.

has_predecessor(u, v)

Returns True if node u has predecessor v.

has_successor(u, v)

Returns True if node u has successor v.

is_directed()

Returns True if graph is directed, False otherwise.

is_multigraph()

Returns True if graph is a multigraph, False otherwise.

load_variables()

Loads the instance variables of this object with appropriate values.

nbunch_iter([nbunch])

Returns an iterator over nodes contained in nbunch that are also in the graph.

neighbors(n)

Returns an iterator over successor nodes of n.

node_attr_dict_factory

alias of dict

node_dict_factory

alias of dict

number_of_edges([u, v])

Returns the number of edges between two nodes.

number_of_nodes()

Returns the number of nodes in the graph.

order()

Returns the number of nodes in the graph.

predecessors(n)

Returns an iterator over predecessor nodes of n.

remove_edge(u, v)

Remove the edge between u and v.

remove_edges_from(ebunch)

Remove all edges specified in ebunch.

remove_node(n)

Remove node n.

remove_nodes_from(nodes)

Remove multiple nodes.

reset_edge_weights()

Resets the weights assigned to the edges of the DAG.

reverse([copy])

Returns the reverse of the graph.

size([weight])

Returns the number of edges or total of all edge weights.

subgraph(nodes)

Returns a SubGraph view of the subgraph induced on nodes.

successors(n)

Returns an iterator over successor nodes of n.

to_directed([as_view])

Returns a directed representation of the graph.

to_directed_class()

Returns the class to use for empty directed copies.

to_undirected([reciprocal, as_view])

Returns an undirected representation of the digraph.

to_undirected_class()

Returns the class to use for empty undirected copies.

update([edges, nodes])

Update the graph using nodes/edges/graphs as input.

+ + + + + + +

initialize_dictionaries

+
+
+all_edges: List[Tuple[str, str]]
+

List of edges in the DAG.

+
+ +
+
+all_nodes: List[str]
+

List of nodes in the DAG.

+
+ +
+
+edge_weights: List[int]
+

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.

+
+ +
+
+edges_indices: Dict[Tuple[str, str]:int]
+

Dictionary that maps edges to their indices in the list of all_temp_files edges. +This is maintained for efficiency purposes.

+
+ +
+
+edges_reduced: List[Tuple[str, str]]
+

List of non-special edges in the DAG.

+
+ +
+
+edges_reduced_indices: Dict[Tuple[str, str], int]
+

Dictionary that maps non-special edges to their indices in the +list of all_temp_files edges. This is maintained for efficiency purposes.

+
+ +
+
+static get_edges(nodes: List[str]) List[Tuple[str, str]]
+
+
Parameters:
+

nodes (List[str] :) – Nodes of a path in the directed acyclic graph

+
+
Return type:
+

List of edges that lie along the path.

+
+
+
+ +
+
+get_node_label(node: int) str
+

gets node label from node ID

+
+
Parameters:
+

node (int :) – ID of the node of interest

+
+
Return type:
+

label corresponding to the node. (code corresponding to the node in LLVM IR)

+
+
+
+ +
+
+initialize_dictionaries()
+
+ +
+
+load_variables()
+

Loads the instance variables of this object with appropriate +values. This method is useful when the DAG is loaded from a DOT file.

+
+ +
+
+nodes_except_sink: List[str]
+

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.

+
+ +
+
+nodes_except_sink_indices: Dict[str, int]
+

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.

+
+ +
+
+nodes_except_source_sink: List[str]
+

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.

+
+ +
+
+nodes_except_source_sink_indices: Dict[str, int]
+

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.

+
+ +
+
+nodes_indices: Dict[str, int]
+

Dictionary that maps nodes to their indices in the list of all_temp_files nodes. +This is maintained for efficiency purposes.

+
+ +
+
+num_edges: int
+

Number of edges in the DAG.

+
+ +
+
+num_nodes: int
+

Number of nodes in the DAG.

+
+ +
+
+num_paths: int
+

Number of paths in the DAG.

+
+ +
+
+reset_edge_weights()
+

Resets the weights assigned to the edges of the DAG.

+
+ +
+
+sink: str
+

Sink of the DAG.

+
+ +
+
+special_edges: Dict[str, Tuple[str, str]]
+

Dictionary that maps nodes to the special (‘default’) edges.

+
+ +
+ +
+
+gametime.src.nx_helper.construct_dag(location: str) tuple[Dag, bool]
+

Constructs a ~gametime.nxHelper.Dag object to represent +the directed acyclic graph described in DOT format in the file provided.

+
+
Parameters:
+

location (str :) – Path to the file describing a directed acyclic graph in DOT format

+
+
Returns:
+

Object that represents the directed acyclic graph.

+
+
Return type:
+

~gametime.src.nx_helper.Dag

+
+
+
+ +
+
+gametime.src.nx_helper.find_root_node(G)
+
+
Parameters:
+

G – The graph to find root node in

+
+
Returns:
+

Root node of G or None if one doesn’t exist.

+
+
Return type:
+

Node

+
+
+
+ +
+
+gametime.src.nx_helper.get_random_path(dag: Dag, source: str, sink: str) List[str]
+
+
Parameters:
+
    +
  • 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

  • +
+
+
Returns:
+

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.

+
+
Return type:
+

List[str]

+
+
+
+ +
+
+gametime.src.nx_helper.has_cycles(dag: Dag) bool
+
+
Parameters:
+

dag (Dag :) – DAG represented by a dag

+
+
Returns:
+

True if, and only if, the DAG provided has cycles.

+
+
Return type:
+

bool

+
+
+
+ +
+
+gametime.src.nx_helper.num_paths(dag: Dag, source: str, sink: str) int
+
+
Parameters:
+
    +
  • dag – DAG represented by a ~gametime.src.nx_helper.Dag object.

  • +
  • source – Source node.

  • +
  • sink – Sink node.

  • +
+
+
Returns:
+

Number of paths in the DAG provided. Note: Passed in DAG must be actually acyclic.

+
+
Return type:
+

int

+
+
+
+ +
+
+gametime.src.nx_helper.remove_back_edges_to_make_dag(G, root)
+

Remove all back edges from G to make it a DAG. Assuming G is connected and rooted at ROOT.

+
+
Parameters:
+
    +
  • G – The graph to remove root edges

  • +
  • root – The root node of G to start DFS with

  • +
+
+
Return type:
+

DAG version of G with all back edges removed.

+
+
+
+ +
+
+gametime.src.nx_helper.write_dag_to_dot_file(dag: Dag, location: str, dag_name: str = '', edges_to_labels: Dict[Tuple[str, str], str] = None, highlighted_edges: List[Tuple[str, str]] = None, highlight_color: str = 'red')
+

Writes the directed acyclic graph provided to a file in DOT format.

+
+
Parameters:
+
    +
  • 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”)

  • +
+
+
+
+ +
+
+class gametime.src.path_analyzer.PathAnalyzer(preprocessed_path: str, project_config: ProjectConfiguration, dag: Dag, path: Path, path_name: str, repeat: int = 1)
+

Bases: object

+

Methods

+ + + + + + +

measure_path(backend)

run the entire simulation on the given path

+
+
+measure_path(backend: Backend) int
+

run the entire simulation on the given path

+
+
Parameters:
+

backend (Backend :) – Backend object used for simulation

+
+
Return type:
+

the total measurement of path given by backend

+
+
+
+ +
+ +

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.

+
+
+class gametime.src.path_generator.PathGenerator
+

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

+ + + + + + +

generate_paths(analyzer[, num_paths, ...])

Generates a list of feasible paths of the code being analyzed, each represented by an object of the Path class.

+
+
+static generate_paths(analyzer, num_paths=10, path_type=0, interval=None, use_ob_extraction=False)
+

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.

+
+
Parameters:
+
    +
  • analyzerAnalyzer 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.

  • +
  • intervalInterval 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

  • +
+
+
Returns:
+

List of feasible paths of the code being analyzed, each +represented by an object of the Path class.

+
+
Return type:
+

List[Path]

+
+
+
+ +
+ +
+
+class gametime.src.path_generator.PathType
+

Bases: object

+

Represents the type of paths that can be generated.

+

Methods

+ + + + + + +

get_description(path_type)

+
param path_type:
+

One of the predefined path types

+
+
+

+
+
+ALL_DECREASING = 3
+

All feasible paths, arranged in decreasing order of value.

+
+ +
+
+ALL_INCREASING = 4
+

All feasible paths, arranged in increasing order of value.

+
+ +
+
+BEST_CASE = 1
+

Best-case feasible paths, arranged in increasing order of value.

+
+ +
+
+RANDOM = 2
+

Random feasible paths.

+
+ +
+
+WORST_CASE = 0
+

Worst-case feasible paths, arranged in decreasing order of value.

+
+ +
+
+static get_description(path_type)
+
+
Parameters:
+

path_type – One of the predefined path types

+
+
Return type:
+

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.

+
+
+class gametime.src.path.Path(ilp_problem: IlpProblem = None, nodes: List[str] = None, line_numbers: List[str] = None, conditions: List[str] = None, condition_edges: Dict[int, Tuple[str]] = None, condition_truths: Dict[str, bool] = None, array_accesses: Dict[str, List[Tuple[int]]] = None, agg_index_exprs: IndexExpression = None, assignments: Dict[str, str] = None, predicted_value: float = 0, measured_value: float = 0)
+

Bases: object

+

Maintains a representation of, and information about, +a single path in the code that is being analyzed.

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

get_agg_index_exprs()

+
returns:
+

String representation of the expressions associated

+
+
+

get_array_accesses()

+
returns:
+

String representation of the array accesses made in

+
+
+

get_assignments()

+
returns:
+

String representation of the assignments to variables

+
+
+

get_condition_edges()

+
returns:
+

String representation of the numbers of the conditions along

+
+
+

get_condition_truths()

+
returns:
+

String representation of the line numbers of the conditional points

+
+
+

get_conditions()

+
returns:
+

String representation of the conditions along this path.

+
+
+

get_edges_for_conditions(condition_nums)

+
param condition_nums:
+

List of conditions

+
+
+

get_line_numbers()

+
returns:
+

String representation of the line numbers of

+
+
+

get_measured_value()

+
returns:
+

String representation of the measured value

+
+
+

get_nodes()

+
returns:
+

String representation of the IDs of the nodes in

+
+
+

get_predicted_value()

+
returns:
+

String representation of the predicted value

+
+
+

read_agg_index_exprs_from_file(location)

Reads, from a file, information about the expressions associated with the temporary index variables of aggregate accesses along a path.

read_array_accesses_from_file(location)

Reads information about the array accesses made in conditions along a path from a file.

read_assignments_from_file(location)

Reads, from a file, the assignments to variables that would drive an execution of the code under analysis along a path.

read_condition_edges_from_file(location)

Reads the numbers of the conditions along a path, and the edges that are associated with the conditions, from a file.

read_condition_truths_from_file(location)

Reads the line numbers of the conditional points in the code being analyzed, along with their truth values along a path, from a file.

read_conditions_from_file(location)

Reads the conditions along a path from a file.

read_line_numbers_from_file(location)

Reads the line numbers of the source-level statements that lie along a path from a file.

read_measured_value_from_file(location)

Reads the measured value of a path from a file.

read_nodes_from_file(location)

Reads the IDs of the nodes in a directed acyclic graph along a path from a file.

read_predicted_value_from_file(location)

Reads the predicted value of a path from a file.

set_measured_value(value)

Sets the measured value (runtime, energy consumption, etc.) of this path.

set_predicted_value(value)

Sets the predicted value (runtime, energy consumption, etc.) of this path.

write_agg_index_exprs_to_file(location)

Writes information about the expressions associated with the temporary index variables of aggregate accesses along this path to a file.

write_array_accesses_to_file(location)

Writes information about the array accesses made in conditions along this path to a file.

write_assignments_to_file(location)

Writes the assignments to variables that would drive an execution of the code under analysis along this path to a file.

write_condition_edges_to_file(location)

Writes the numbers of the conditions along this path, and the edges that are associated with the conditions, to a file.

write_condition_truths_to_file(location)

Writes the line numbers of the conditional points in the code being analyzed, along with their truth values, to a file.

write_conditions_to_file(location)

Writes the conditions along this path to a file.

write_ilp_problem_to_lp_file(location)

Writes, to an LP file, the integer linear programming problem that, when solved, produced this path.

write_line_numbers_to_file(location)

Writes the line numbers of the source-level statements that lie along this path to a file.

write_measured_value_to_file(location)

Writes the measured value of this path to a file.

write_nodes_to_file(location)

Writes the IDs of the nodes in a directed acyclic graph along this path to a file.

write_predicted_value_to_file(location)

Writes the predicted value of this path to a file.

+
+
+agg_index_exprs
+

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.

+
+ +
+
+array_accesses
+

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.

+
+ +
+
+assignments
+

Dictionary of assignments to variables that would drive an execution +of the code along this path.

+
+ +
+
+condition_edges
+

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.

+
+ +
+
+condition_truths
+

Dictionary that associates the line numbers of the conditional points +in the code being analyzed with their truth values.

+
+ +
+
+conditions
+

Conditions along this path, represented as a list of strings.

+
+ +
+
+get_agg_index_exprs() str
+
+
Returns:
+

String representation of the expressions associated +with the temporary index variables of aggregate accesses +along a path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_array_accesses() str
+
+
Returns:
+

String representation of the array accesses made in +conditions along this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_assignments() str
+
+
Returns:
+

String representation of the assignments to variables +that would drive an execution of the code under analysis +along this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_condition_edges() str
+
+
Returns:
+

String representation of the numbers of the conditions along +this path, and the edges that are associated with the conditions.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_condition_truths() str
+
+
Returns:
+

String representation of the line numbers of the conditional points +in the code being analyzed, along with their truth values.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_conditions() str
+
+
Returns:
+

String representation of the conditions along this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_edges_for_conditions(condition_nums: List[int]) List[Tuple[str]]
+
+
Parameters:
+

condition_nums (List[int] :) – List of conditions

+
+
Returns:
+

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.

+
+
Return type:
+

List[Tuple[str]]

+
+
+
+ +
+
+get_line_numbers() str
+
+
Returns:
+

String representation of the line numbers of +the source-level statements that lie along this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_measured_value() str
+
+
Returns:
+

String representation of the measured value +(runtime, energy consumption, etc.) of this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_nodes() str
+
+
Returns:
+

String representation of the IDs of the nodes in +a directed acyclic graph along this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_predicted_value() str
+
+
Returns:
+

String representation of the predicted value +(runtime, energy consumption, etc.) of this path.

+
+
Return type:
+

str

+
+
+
+ +
+
+ilp_problem
+

Integer linear programming problem that, when solved, produced +this path, represented as an IlpProblem object.

+
+ +
+
+line_numbers
+

Line numbers of the source-level statements along this path, +represented as a list of positive integers.

+
+ +
+
+measured_value
+

Measured value (runtime, energy consumption, etc.) +of this path, represented as a number (either +an integer or a floating-point number).

+
+ +
+
+nodes
+

IDs of the nodes in a directed acyclic graph along this path, +represented as a list of strings.

+
+ +
+
+predicted_value
+

Predicted value (runtime, energy consumption, etc.) +of this path, represented as a number (either +an integer or a floating-point number).

+
+ +
+
+static read_agg_index_exprs_from_file(location: str) Dict[int, IndexExpression]
+

Reads, from a file, information about the expressions associated with +the temporary index variables of aggregate accesses along a path.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Dictionary that maps the number of a temporary index +variable to an IndexExpression object.

+
+
Return type:
+

Dict[int, IndexExpression]

+
+
+
+ +
+
+static read_array_accesses_from_file(location: str) Dict[str, List[Tuple[int, int]]]
+

Reads information about the array accesses made in conditions +along a path from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

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.

+
+
Return type:
+

Dict[str, List[Tuple[int, int]]]

+
+
+
+ +
+
+static read_assignments_from_file(location: str) Dict[str, str]
+

Reads, from a file, the assignments to variables that would +drive an execution of the code under analysis along a path.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Dictionary of assignments to variables that would +drive an execution of the code under analysis along a path.

+
+
Return type:
+

Dict[str, str]

+
+
+
+ +
+
+static read_condition_edges_from_file(location: str) Dict[int, Tuple[str]]
+

Reads the numbers of the conditions along a path, and +the edges that are associated with the conditions, from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

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.

+
+
Return type:
+

Dict[int, Tuple[str]]

+
+
+
+ +
+
+static read_condition_truths_from_file(location: str) Dict[int, bool]
+

Reads the line numbers of the conditional points in the code +being analyzed, along with their truth values along a path, +from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Dictionary that associates the line numbers of +the conditional points in the code being analyzed with +their truth values.

+
+
Return type:
+

Dict[int, bool]

+
+
+
+ +
+
+static read_conditions_from_file(location: str) List[str]
+

Reads the conditions along a path from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Conditions along a path, represented as a list of strings.

+
+
Return type:
+

List[str]

+
+
+
+ +
+
+static read_line_numbers_from_file(location: str) List[int]
+

Reads the line numbers of the source-level statements that +lie along a path from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Line numbers of the source-level statements along this path, +represented as a list of positive integers.

+
+
Return type:
+

List[int]

+
+
+
+ +
+
+static read_measured_value_from_file(location: str) float
+

Reads the measured value of a path from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Measured value of a path, represented as a number +(either an integer or a floating-point number).

+
+
Return type:
+

float

+
+
+
+ +
+
+static read_nodes_from_file(location: str) List[str]
+

Reads the IDs of the nodes in a directed acyclic graph +along a path from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

IDs of the nodes in a directed acyclic graph along a path, +represented as a list of strings.

+
+
Return type:
+

List[str]

+
+
+
+ +
+
+static read_predicted_value_from_file(location: str) float
+

Reads the predicted value of a path from a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
Returns:
+

Predicted value of a path, represented as a number +(either an integer or a floating-point number).

+
+
Return type:
+

float

+
+
+
+ +
+
+set_measured_value(value: float) None
+

Sets the measured value (runtime, energy consumption, etc.) +of this path.

+
+
Parameters:
+

value (float :) – Value to set as the measured value of this path

+
+
+
+ +
+
+set_predicted_value(value: float)
+

Sets the predicted value (runtime, energy consumption, etc.) +of this path.

+
+
Parameters:
+

value (float :) – Value to set as the predicted value of this path

+
+
+
+ +
+
+write_agg_index_exprs_to_file(location: str) None
+

Writes information about the expressions associated with the +temporary index variables of aggregate accesses along this path +to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_array_accesses_to_file(location: str) None
+

Writes information about the array accesses made in conditions +along this path to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_assignments_to_file(location: str) None
+

Writes the assignments to variables that would drive an execution +of the code under analysis along this path to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_condition_edges_to_file(location: str) None
+

Writes the numbers of the conditions along this path, and +the edges that are associated with the conditions, to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_condition_truths_to_file(location: str) None
+

Writes the line numbers of the conditional points in the code +being analyzed, along with their truth values, to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_conditions_to_file(location: str) None
+

Writes the conditions along this path to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_ilp_problem_to_lp_file(location) None
+

Writes, to an LP file, the integer linear programming problem that, +when solved, produced this path.

+
+
Parameters:
+

location – Location of the file

+
+
+
+ +
+
+write_line_numbers_to_file(location: str) None
+

Writes the line numbers of the source-level statements that +lie along this path to a file.

+
+
Parameters:
+

location (str:) – Location of the file

+
+
+
+ +
+
+write_measured_value_to_file(location: str) None
+

Writes the measured value of this path to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_nodes_to_file(location: str) None
+

Writes the IDs of the nodes in a directed acyclic graph +along this path to a file.

+
+
Parameters:
+

location (str :) – Location of the file

+
+
+
+ +
+
+write_predicted_value_to_file(location: str) None
+

Writes the predicted value of this path to a file.

+
+
location: str :

Location of the file

+
+
+
+ +
+ +
+
+class gametime.src.project_configuration_parser.ConfigurationParser
+

Bases: object

+

Methods

+ + + + + + +

parse(configuration_file_path)

+
param configuration_file_path:
+

Path to configuration file

+
+
+

+
+
+abstract static parse(configuration_file_path: str) ProjectConfiguration
+
+
Parameters:
+

configuration_file_path (str :) – Path to configuration file

+
+
Returns:
+

ProjectConfiguration object corresponding to file.

+
+
Return type:
+

ProjectConfiguration

+
+
+
+ +
+ +
+
+class gametime.src.project_configuration_parser.YAMLConfigurationParser
+

Bases: ConfigurationParser

+

Methods

+ + + + + + +

parse(configuration_file_path)

+
param configuration_file_path:
+

Path to configuration file

+
+
+

+
+
+static parse(configuration_file_path: str) ProjectConfiguration
+
+
Parameters:
+

configuration_file_path (str :) – Path to configuration file

+
+
Returns:
+

ProjectConfiguration object corresponding to file.

+
+
Return type:
+

ProjectConfiguration

+
+
+
+ +
+ +
+
+gametime.src.project_configuration_parser.get_dir_paths(dir_paths_str: str, dir_location: str = None) List[str]
+

Gets a list of directory paths from the string provided, where +the directory paths are separated by whitespaces or commas.

+
+
Parameters:
+
+
String of directory paths
+
dir_location: str

Directory to which the directory paths may be relative (Default value = None)

+
+
:returns: List of directory paths in the string.
+
:rtype: List[str]
+
+
+
+
+ +
+
+gametime.src.project_configuration_parser.get_file_paths(file_paths_str: str, dir_location: str = None) List[str]
+

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.

+
+
Parameters:
+
    +
  • file_paths_str (str :) – String of file paths

  • +
  • dir_location (str :) – Directory to which the file paths may be relative (Default value = None)

  • +
+
+
Returns:
+

List of file paths in the string.

+
+
Return type:
+

List[str]

+
+
+
+ +
+
+class gametime.src.project_configuration.DebugConfiguration(keep_cil_temps=False, dump_ir=False, keep_ilp_solver_output=False, dump_instruction_trace=False, dump_path=False, dump_all_paths=False, dump_smt_trace=False, dump_all_queries=False, keep_parser_output=False, keep_simulator_output=False)
+

Bases: object

+

Stores debugging configuration information, which +determines the debugging information that is shown and +the temporary files that are dumped.

+
+
+DUMP_ALL_PATHS
+

Dump information about all_temp_files of the paths that have been traced +during analysis to a file.

+
+ +
+
+DUMP_ALL_QUERIES
+

Dump information about all_temp_files of the SMT queries that +have been made during analysis to a file.

+
+ +
+
+DUMP_INSTRUCTION_TRACE
+

Dump information produced when an IR-level instruction +is traced backward.

+
+ +
+
+DUMP_IR
+

Dump the Phoenix intermediate representation of the function +under analysis to a file.

+
+ +
+
+DUMP_PATH
+

Dump information about the path being traced.

+
+ +
+
+DUMP_SMT_TRACE
+

Dump information produced when an SMT query is created.

+
+ +
+
+KEEP_CIL_TEMPS
+

Keep the temporary files that CIL generates during its analysis.

+
+ +
+
+KEEP_ILP_SOLVER_OUTPUT
+

Keep debugging information and files produced by +the integer linear programming solver.

+
+ +
+
+KEEP_PARSER_OUTPUT
+

Keep the debugging information and the temporary files +produced by the parser.

+
+ +
+
+KEEP_SIMULATOR_OUTPUT
+

Keep the temporary files produced by a simulator when +measuring the value of a path.

+
+ +
+ +
+
+class gametime.src.project_configuration.ProjectConfiguration(location_file, func, start_label='', end_label='', included=None, merged=None, inlined=None, unroll_loops=False, randomize_initial_basis=False, maximum_error_scale_factor=10, determinant_threshold=0.001, max_infeasible_paths=100, model_as_nested_arrays=False, prevent_basis_refinement=False, ilp_solver_name='', debug_config=None, gametime_flexpret_path='', gametime_path='', gametime_file_path='', compile_flags=[], backend='')
+

Bases: object

+

Stores information necessary to configure a GameTime project.

+

Methods

+ + + + + + + + + + + + +

get_orig_filename_with_extension(extension)

Return path of file with name and extension.

get_temp_filename_with_extension(extension)

Return path of temporary file with name and extension.

set_ilp_solver(ilp_solver_name)

+
param ilp_solver_name:
+

ILP solver name to use

+
+
+

+
+
+get_orig_filename_with_extension(extension: str, name: str = None) str
+

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”

+
+
Parameters:
+
    +
  • extension (str :) – extension of the file

  • +
  • name (str :) – name of the file (defaults to self.nameOrigNoExtension) (Default value = None)

  • +
+
+
Returns:
+

path of the file in the original directory.

+
+
Return type:
+

str

+
+
+
+ +
+
+get_temp_filename_with_extension(extension: str, name: str = None) 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”

+
+
Parameters:
+
    +
  • extension (str :) – extension of the temporary file name

  • +
  • name (str :) – name of the temporary file (defaults to self.nameOrigNoExtension) (Default value = None)

  • +
+
+
Returns:
+

path of the temporary file

+
+
Return type:
+

str

+
+
+
+ +
+
+set_ilp_solver(ilp_solver_name)
+
+
Parameters:
+

ilp_solver_name (str:) – ILP solver name to use

+
+
+
+ +
+ +

Exposes functions to interact with different +linear programming solvers through the PuLP package.

+
+
+class gametime.src.pulp_helper.Extremum
+

Bases: object

+

Represents the extremum that needs to be determined.

+
+
+LONGEST = 0
+

Find the longest path.

+
+ +
+
+SHORTEST = 1
+

Find the shortest path.

+
+ +
+ +
+
+class gametime.src.pulp_helper.IlpProblem(*args, **kwargs)
+

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

addVariable(variable)

Adds a variable to the problem before a constraint is added

addVariables(variables)

Adds variables to the problem before a constraint is added

assignStatus(status[, sol_status])

Sets the status of the model after solving.

checkDuplicateVars()

Checks if there are at least two variables with the same name :return: 1 :raises const.PulpError: if there ar duplicates

checkLengthVars(max_length)

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

copy()

Make a copy of self.

deepcopy()

Make a copy of self.

extend(other[, use_objective])

extends an LpProblem by adding constraints either from a dictionary a tuple or another LpProblem object.

fromDict(_dict)

Takes a dictionary with all necessary information to build a model.

fromJson(filename)

Creates a new Lp Problem from a json file with information

from_dict(_dict)

Takes a dictionary with all necessary information to build a model.

from_json(filename)

Creates a new Lp Problem from a json file with information

numConstraints()

+
return:
+

number of constraints in model

+
+
+

numVariables()

+
return:
+

number of variables in model

+
+
+

resolve([solver])

resolves an Problem using the same solver as previously

roundSolution([epsInt, eps])

Rounds the lp variables

sequentialSolve(objectives[, absoluteTols, ...])

Solve the given Lp problem with several objective functions.

setObjective(obj)

Sets the input variable as the objective function.

setSolver([solver])

Sets the Solver for this problem useful if you are using resolve

solve([solver])

Solve the given Lp problem.

startClock()

initializes properties with the current time

stopClock()

updates time wall time and cpu time

toDict()

creates a dictionary from the model with as much data as possible.

toJson(filename, *args, **kwargs)

Creates a json file from the LpProblem information

to_dict()

creates a dictionary from the model with as much data as possible.

to_json(filename, *args, **kwargs)

Creates a json file from the LpProblem information

variables()

Returns the problem variables

writeLP(filename[, writeSOS, mip, max_length])

Write the given Lp problem to a .lp file.

writeMPS(filename[, mpsSense, rename, mip, ...])

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

+
+
+obj_val
+

Value of the objective function, stored for efficiency purposes.

+
+ +
+ +
+
+gametime.src.pulp_helper.find_extreme_path(analyzer, extremum=0, interval=None)
+

Determines either the longest or the shortest path through the DAG +with the constraints stored in the Analyzer object provided.

+
+
Parameters:
+
    +
  • analyzerAnalyzer object that maintains information about +the code being analyzed.

  • +
  • extremum – Type of extreme path to calculate.

  • +
  • intervalInterval 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.

  • +
+
+
Returns:
+

    +
  • 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.

  • +
+

+
+
+
+ +
+
+gametime.src.pulp_helper.find_goodness_of_fit(analyzer, paths, basis)
+
+
This function is here only for test purposes. 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 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:

+
+

|a_1| + |a_2| + … + |a_n| <= c

+
+
+
+
+
Parameters:
+
    +
  • analyzerAnalyzer 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

  • +
+
+
Return type:
+

The number c as described in the paragraph above.

+
+
+
+ +
+
+gametime.src.pulp_helper.find_least_compatible_mu_max(analyzer: Analyzer, paths)
+
+
This function returns the least dealta in the underlying graph, as

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.

+
+
+
+
Parameters:
+
    +
  • analyzerAnalyzer 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

  • +
+
+
Returns:
+

A floating point value—the least delta compatible with the +measurements

+
+
Return type:
+

float

+
+
+
+ +
+
+gametime.src.pulp_helper.find_longest_path_with_delta(analyzer, paths, delta, extremum=0)
+
+
This functions finds the longest/shortest path compatible with the

measured lengths of paths, as given in ‘paths’, such the actual +lengths are within ‘delta’ of the measured lengths

+
+
+
+
Parameters:
+
    +
  • analyzerAnalyzer 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

  • +
+
+
Returns:
+

    +
  • Pair consisting of the resulting path and the ILP problem used to

  • +
  • calculate the path

  • +
+

+
+
+
+ +
+
+gametime.src.pulp_helper.find_minimal_overcomplete_basis(analyzer: Analyzer, paths, k)
+
+
This function is here only for test purposes. The functions finds the

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’:

+
+

|a_1| + |a_2| + … + |a_n| <= k

+
+
+
+
+
Parameters:
+
    +
  • analyzerAnalyzer 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

  • +
+
+
Return type:
+

List of paths satisfying the condition stated above

+
+
+
+ +
+
+gametime.src.pulp_helper.find_worst_expressible_path(analyzer, paths, bound)
+
+
Function to find the longest path in the underlying graph of ‘analyzer’

assuming the lengths of all_temp_files measured paths are between -1 and 1.

+
+
+
+
Parameters:
+
    +
  • analyzerAnalyzer 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

    ???

    +

  • +
+
+
Returns:
+

    +
  • Triple consisting of the length of the longsest path, the path itself

  • +
  • and the ILP solved to find the path.

  • +
+

+
+
+
+ +
+
+gametime.src.pulp_helper.generate_and_solve_core_problem(analyzer, paths, path_function_upper, path_function_lower, weights_positive, print_problem=False, extremum=0)
+

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’.

+
+
Parameters:
+
    +
  • analyzerAnalyzer 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

  • +
+
+
Returns:
+

    +
  • Triple consisting of the length of the longest path found, the actual

  • +
  • path and the ILP problem generated.

  • +
+

+
+
+
+ +
+
+gametime.src.pulp_helper.get_ilp_solver(ilp_solver_name: str, project_config: ProjectConfiguration) pulp.LpSolver | None
+
+
Parameters:
+
    +
  • ilp_solver_name (str :) – Name of the integer linear programming solver

  • +
  • project_config (ProjectConfiguration :) – ProjectConfiguration object that represents the configuration of a GameTime project

  • +
+
+
Returns:
+

    +
  • 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.

  • +
+

+
+
+
+ +
+
+gametime.src.pulp_helper.get_ilp_solver_name(ilp_solver: LpSolver) str | None
+
+
Parameters:
+

ilp_solver (pulp.LpSolver :) – Object of a PuLP solver class

+
+
Returns:
+

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.

+
+
Return type:
+

str, Optional

+
+
+
+ +
+
+gametime.src.pulp_helper.get_ilp_solver_names() List[str]
+
+
Returns:
+

List of the names of the supported integer linear programming solvers.

+
+
Return type:
+

List[str]

+
+
+
+ +
+
+gametime.src.pulp_helper.get_ilp_solver_proper_names() List[str]
+
+
Returns:
+

List of proper names of the supported integer linear programming +solvers, for display purposes.

+
+
Return type:
+

List[str]

+
+
+
+ +
+
+gametime.src.pulp_helper.get_proper_name(ilp_solver_name: str) str
+
+
Parameters:
+

ilp_solver_name (str :) – Name of an integer linear programming solver used by GameTime

+
+
Returns:
+

Proper name of an integer linear programming solver, +for display purposes.

+
+
Return type:
+

str

+
+
+
+ +
+
+gametime.src.pulp_helper.is_ilp_solver_name(name: str) bool
+
+
Parameters:
+

name (str :) – Possible name of an integer linear programming solver

+
+
Returns:
+

True if, and only if, the name provided is the name of a supported +integer linear programming solver.

+
+
Return type:
+

bool

+
+
+
+ +
+
+gametime.src.pulp_helper.make_compact(dag)
+
+
Function to create a compact representation of the given graph

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

+
+
+
+
Parameters:
+

dag – The graph that get compactified

+
+
Returns:
+

    +
  • 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’

  • +
+

+
+
+
+ +
+
+

Backend Modules

+
+

Backend Base Module

+

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.

+
+
+class gametime.src.backend.backend.Backend(project_config: ProjectConfiguration, name: str = '')
+

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

+ + + + + + +

measure(inputs, measure_folder)

Perform measurement using the backend.

+
+
+measure(inputs: str, measure_folder: str) int
+

Perform measurement using the backend.

+
+
Parameters:
+
    +
  • 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}

  • +
+
+
Return type:
+

The measured value of path

+
+
+
+ +
+
+name: str
+

Name of the backend that this object represents.

+
+ +
+
+project_config: ProjectConfiguration
+

GameTime project configuration for the code that is being analyzed.

+
+ +
+ +
+
+

ARM Backend Module

+
+
+class gametime.src.backend.arm_backend.arm_backend.ArmBackend(project_config: ProjectConfiguration)
+

Bases: Backend

+

Methods

+ + + + + + + + + + + + +

generate_executable(filepath, func_name, ...)

Modifies the input program to use INPUTS and generates the executable code.

measure(inputs, measure_folder)

Perform measurement using the backend.

run_backend_and_parse_output(stored_folder, ...)

Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program.

+
+
+generate_executable(filepath: str, func_name: str, inputs: str, measure_folder: str) str
+

Modifies the input program to use INPUTS and generates the executable code. Stored at MEASURE_FOLDER/driver

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Return type:
+

Path to the executable code.

+
+
+
+ +
+
+measure(inputs: str, measure_folder: str) int
+

Perform measurement using the backend.

+
+
Parameters:
+
    +
  • 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}

  • +
+
+
Return type:
+

The measured value of path

+
+
+
+ +
+
+run_backend_and_parse_output(stored_folder: str, executable_path: str) int
+

Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program. +Temperaries are stored in STORED_FOLDER.

+
+
Parameters:
+
    +
  • stored_folder (str :) – Folder to put all the generated tempraries.

  • +
  • executable_path (str :) – Path to executable.

  • +
+
+
Return type:
+

Measured cycle count for EXECUTABLE_PATH.

+
+
+
+ +
+
+timing_func = '\nstatic inline unsigned long long read_cycle_count() {\n    unsigned long long val;\n    asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (val));\n    return val;\n}\n'
+
+ +
+ +
+
+

FlexPRET Backend Module

+
+
+class gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend(project_config: ProjectConfiguration)
+

Bases: Backend

+

Methods

+ + + + + + + + + + + + + + + +

c_file_to_mem(stored_folder, file_name, ...)

Use same Make file mechanism as Flexpret to generate .mem file from .c

generate_executable_c(filepath, func_name, ...)

Modifies the input program to use INPUTS and returns path to modifed C program.

measure(inputs, measure_folder)

Perform measurement using the backend.

run_backend_and_parse_output(stored_folder, ...)

Run simulation on the .mem file generated.

+
+
+c_file_to_mem(stored_folder: str, file_name: str, c_filepath: str) str
+

Use same Make file mechanism as Flexpret to generate .mem file from .c

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Return type:
+

Measured cycle count for C_FILEPATH.

+
+
+
+ +
+
+generate_executable_c(filepath: str, func_name: str, inputs: str, measure_folder: str) str
+

Modifies the input program to use INPUTS and returns path to modifed C program.

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Return type:
+

Path to the modified C file.

+
+
+
+ +
+
+measure(inputs: str, measure_folder: str) int
+

Perform measurement using the backend.

+
+
Parameters:
+
    +
  • 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}

  • +
+
+
Return type:
+

The measured value of path

+
+
+
+ +
+
+run_backend_and_parse_output(stored_folder: str, mem_filepath: str) int
+

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)”)

+
+
Parameters:
+
    +
  • stored_folder (str :) – Folder to put all the generated tempraries.

  • +
  • mem_filepath (str :) – Path to the .mem file +:return the measurement value

  • +
+
+
Return type:
+

Measured cycle count for MEM_FILEPATH.

+
+
+
+ +
+
+timing_func = '\nstatic inline unsigned long long read_cycle_count() {\n    unsigned long long cycles;\n    asm volatile ("rdcycle %0" : "=r" (cycles));\n    return cycles;\n}\n'
+
+ +
+ +
+
+

x86 Backend Module

+
+
+class gametime.src.backend.x86_backend.x86_backend.X86Backend(project_config: ProjectConfiguration)
+

Bases: Backend

+

Methods

+ + + + + + + + + + + + +

generate_executable(filepath, func_name, ...)

Modifies the input program to use INPUTS and generates the executable code.

measure(inputs, measure_folder)

Perform measurement using the backend.

run_backend_and_parse_output(stored_folder, ...)

Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program.

+
+
+generate_executable(filepath: str, func_name: str, inputs: str, measure_folder: str) str
+

Modifies the input program to use INPUTS and generates the executable code. Stored at MEASURE_FOLDER/driver

+
+
Parameters:
+
    +
  • 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.

  • +
+
+
Return type:
+

Path to the executable code.

+
+
+
+ +
+
+measure(inputs: str, measure_folder: str) int
+

Perform measurement using the backend.

+
+
Parameters:
+
    +
  • 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}

  • +
+
+
Return type:
+

The measured value of path

+
+
+
+ +
+
+run_backend_and_parse_output(stored_folder: str, executable_path: str) int
+

Runs the executable in EXECUTABLE_PATH in host machine and extracts the outputs from program. +Temperaries are stored in STORED_FOLDER.

+
+
Parameters:
+
    +
  • stored_folder (str :) – Folder to put all the generated tempraries.

  • +
  • executable_path (str :) – Path to executable.

  • +
+
+
Return type:
+

Measured cycle count for EXECUTABLE_PATH.

+
+
+
+ +
+
+timing_func = '\nstatic inline unsigned long long read_cycle_count() {\n    unsigned int lo, hi;\n    __asm__ __volatile__ ("RDTSC" : "=a" (lo), "=d" (hi));\n    return ((unsigned long long)hi << 32) | lo;\n}\n'
+
+ +
+ +
+
+
+

SMT Solver Module

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/html/objects.inv b/html/objects.inv new file mode 100644 index 0000000..b50a191 Binary files /dev/null and b/html/objects.inv differ diff --git a/html/py-modindex.html b/html/py-modindex.html new file mode 100644 index 0000000..a9f0071 --- /dev/null +++ b/html/py-modindex.html @@ -0,0 +1,248 @@ + + + + + + + Python Module Index — GameTime 0.0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ g +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ g
+ gametime +
    + gametime.src +
    + gametime.src.analyzer +
    + gametime.src.backend +
    + gametime.src.backend.arm_backend +
    + gametime.src.backend.arm_backend.arm_backend +
    + gametime.src.backend.backend +
    + gametime.src.backend.flexpret_backend +
    + gametime.src.backend.flexpret_backend.flexpret_backend +
    + gametime.src.backend.x86_backend +
    + gametime.src.backend.x86_backend.x86_backend +
    + gametime.src.clang_helper +
    + gametime.src.defaults +
    + gametime.src.file_helper +
    + gametime.src.gametime_configuration +
    + gametime.src.gametime_error +
    + gametime.src.histogram +
    + gametime.src.interval +
    + gametime.src.logging_helper +
    + gametime.src.nx_helper +
    + gametime.src.path +
    + gametime.src.path_analyzer +
    + gametime.src.path_generator +
    + gametime.src.project_configuration +
    + gametime.src.project_configuration_parser +
    + gametime.src.pulp_helper +
    + gametime.src.smt_solver +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/html/search.html b/html/search.html new file mode 100644 index 0000000..35a3d21 --- /dev/null +++ b/html/search.html @@ -0,0 +1,120 @@ + + + + + + + Search — GameTime 0.0.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/html/searchindex.js b/html/searchindex.js new file mode 100644 index 0000000..6c3e4bb --- /dev/null +++ b/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"ARM Backend Module": [[1, "module-gametime.src.backend.arm_backend"]], "Backend Base Module": [[1, "module-gametime.src.backend"]], "Backend Modules": [[1, "backend-modules"]], "Contents:": [[0, null]], "FlexPRET Backend Module": [[1, "module-gametime.src.backend.flexpret_backend"]], "GameTime src Documentation": [[1, "gametime-src-documentation"]], "Indices and tables": [[0, "indices-and-tables"]], "Main Package Module": [[1, "module-gametime.src"]], "SMT Solver Module": [[1, "module-gametime.src.smt_solver"]], "Welcome to GameTime\u2019s documentation!": [[0, "welcome-to-gametime-s-documentation"]], "x86 Backend Module": [[1, "module-gametime.src.backend.x86_backend"]]}, "docnames": ["index", "modules"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["index.rst", "modules.rst"], "indexentries": {"add_path_bundled_constraint() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.add_path_bundled_constraint", false]], "add_path_exclusive_constraint() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.add_path_exclusive_constraint", false]], "agg_index_exprs (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.agg_index_exprs", false]], "all_decreasing (gametime.src.path_generator.pathtype attribute)": [[1, "gametime.src.path_generator.PathType.ALL_DECREASING", false]], "all_edges (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.all_edges", false]], "all_increasing (gametime.src.path_generator.pathtype attribute)": [[1, "gametime.src.path_generator.PathType.ALL_INCREASING", false]], "all_nodes (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.all_nodes", false]], "analyze() (gametime.src.gametime static method)": [[1, "gametime.src.GameTime.analyze", false]], "analyzer (class in gametime.src.analyzer)": [[1, "gametime.src.analyzer.Analyzer", false]], "armbackend (class in gametime.src.backend.arm_backend.arm_backend)": [[1, "gametime.src.backend.arm_backend.arm_backend.ArmBackend", false]], "array_accesses (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.array_accesses", false]], "assignments (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.assignments", false]], "backend (class in gametime.src.backend.backend)": [[1, "gametime.src.backend.backend.Backend", false]], "basis_matrix (gametime.src.analyzer.analyzer attribute)": [[1, "gametime.src.analyzer.Analyzer.basis_matrix", false]], "bc_to_executable() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.bc_to_executable", false]], "best_case (gametime.src.path_generator.pathtype attribute)": [[1, "gametime.src.path_generator.PathType.BEST_CASE", false]], "big (gametime.src.gametime_configuration.endianness attribute)": [[1, "gametime.src.gametime_configuration.Endianness.BIG", false]], "c_file_to_mem() (gametime.src.backend.flexpret_backend.flexpret_backend.flexpretbackend method)": [[1, "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend.c_file_to_mem", false]], "compile_to_llvm_for_analysis() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.compile_to_llvm_for_analysis", false]], "compile_to_llvm_for_exec() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.compile_to_llvm_for_exec", false]], "compute_histogram() (in module gametime.src.histogram)": [[1, "gametime.src.histogram.compute_histogram", false]], "condition_edges (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.condition_edges", false]], "condition_truths (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.condition_truths", false]], "conditions (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.conditions", false]], "config (in module gametime.src.defaults)": [[1, "gametime.src.defaults.config", false]], "config_file (in module gametime.src.defaults)": [[1, "gametime.src.defaults.config_file", false]], "configurationparser (class in gametime.src.project_configuration_parser)": [[1, "gametime.src.project_configuration_parser.ConfigurationParser", false]], "construct_dag() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.construct_dag", false]], "create_dag() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.create_dag", false]], "create_dir() (in module gametime.src.file_helper)": [[1, "gametime.src.file_helper.create_dir", false]], "dag (class in gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.Dag", false]], "dag (gametime.src.analyzer.analyzer attribute)": [[1, "gametime.src.analyzer.Analyzer.dag", false]], "debugconfiguration (class in gametime.src.project_configuration)": [[1, "gametime.src.project_configuration.DebugConfiguration", false]], "dump_all_paths (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.DUMP_ALL_PATHS", false]], "dump_all_queries (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.DUMP_ALL_QUERIES", false]], "dump_instruction_trace (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.DUMP_INSTRUCTION_TRACE", false]], "dump_ir (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.DUMP_IR", false]], "dump_object() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.dump_object", false]], "dump_path (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.DUMP_PATH", false]], "dump_smt_trace (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.DUMP_SMT_TRACE", false]], "edge_weights (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.edge_weights", false]], "edges_indices (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.edges_indices", false]], "edges_reduced (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.edges_reduced", false]], "edges_reduced_indices (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.edges_reduced_indices", false]], "endianness (class in gametime.src.gametime_configuration)": [[1, "gametime.src.gametime_configuration.Endianness", false]], "estimate_edge_weights() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.estimate_edge_weights", false]], "extremum (class in gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.Extremum", false]], "find_extreme_path() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.find_extreme_path", false]], "find_goodness_of_fit() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.find_goodness_of_fit", false]], "find_least_compatible_mu_max() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.find_least_compatible_mu_max", false]], "find_longest_path_with_delta() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.find_longest_path_with_delta", false]], "find_minimal_overcomplete_basis() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.find_minimal_overcomplete_basis", false]], "find_root_node() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.find_root_node", false]], "find_worst_expressible_path() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.find_worst_expressible_path", false]], "flexpretbackend (class in gametime.src.backend.flexpret_backend.flexpret_backend)": [[1, "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend", false]], "gametime (class in gametime.src)": [[1, "gametime.src.GameTime", false]], "gametime.src": [[1, "module-gametime.src", false]], "gametime.src.analyzer": [[1, "module-gametime.src.analyzer", false]], "gametime.src.backend": [[1, "module-gametime.src.backend", false]], "gametime.src.backend.arm_backend": [[1, "module-gametime.src.backend.arm_backend", false]], "gametime.src.backend.arm_backend.arm_backend": [[1, "module-gametime.src.backend.arm_backend.arm_backend", false]], "gametime.src.backend.backend": [[1, "module-gametime.src.backend.backend", false]], "gametime.src.backend.flexpret_backend": [[1, "module-gametime.src.backend.flexpret_backend", false]], "gametime.src.backend.flexpret_backend.flexpret_backend": [[1, "module-gametime.src.backend.flexpret_backend.flexpret_backend", false]], "gametime.src.backend.x86_backend": [[1, "module-gametime.src.backend.x86_backend", false]], "gametime.src.backend.x86_backend.x86_backend": [[1, "module-gametime.src.backend.x86_backend.x86_backend", false]], "gametime.src.clang_helper": [[1, "module-gametime.src.clang_helper", false]], "gametime.src.defaults": [[1, "module-gametime.src.defaults", false]], "gametime.src.file_helper": [[1, "module-gametime.src.file_helper", false]], "gametime.src.gametime_configuration": [[1, "module-gametime.src.gametime_configuration", false]], "gametime.src.gametime_error": [[1, "module-gametime.src.gametime_error", false]], "gametime.src.histogram": [[1, "module-gametime.src.histogram", false]], "gametime.src.interval": [[1, "module-gametime.src.interval", false]], "gametime.src.logging_helper": [[1, "module-gametime.src.logging_helper", false]], "gametime.src.nx_helper": [[1, "module-gametime.src.nx_helper", false]], "gametime.src.path": [[1, "module-gametime.src.path", false]], "gametime.src.path_analyzer": [[1, "module-gametime.src.path_analyzer", false]], "gametime.src.path_generator": [[1, "module-gametime.src.path_generator", false]], "gametime.src.project_configuration": [[1, "module-gametime.src.project_configuration", false]], "gametime.src.project_configuration_parser": [[1, "module-gametime.src.project_configuration_parser", false]], "gametime.src.pulp_helper": [[1, "module-gametime.src.pulp_helper", false]], "gametime.src.smt_solver": [[1, "module-gametime.src.smt_solver", false]], "gametimeconfiguration (class in gametime.src.gametime_configuration)": [[1, "gametime.src.gametime_configuration.GametimeConfiguration", false]], "gametimeerror": [[1, "gametime.src.gametime_error.GameTimeError", false]], "gametimewarning": [[1, "gametime.src.gametime_error.GameTimeWarning", false]], "generate_and_solve_core_problem() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.generate_and_solve_core_problem", false]], "generate_basis_paths() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.generate_basis_paths", false]], "generate_dot_file() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.generate_dot_file", false]], "generate_executable() (gametime.src.backend.arm_backend.arm_backend.armbackend method)": [[1, "gametime.src.backend.arm_backend.arm_backend.ArmBackend.generate_executable", false]], "generate_executable() (gametime.src.backend.x86_backend.x86_backend.x86backend method)": [[1, "gametime.src.backend.x86_backend.x86_backend.X86Backend.generate_executable", false]], "generate_executable_c() (gametime.src.backend.flexpret_backend.flexpret_backend.flexpretbackend method)": [[1, "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend.generate_executable_c", false]], "generate_overcomplete_basis() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.generate_overcomplete_basis", false]], "generate_paths() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.generate_paths", false]], "generate_paths() (gametime.src.path_generator.pathgenerator static method)": [[1, "gametime.src.path_generator.PathGenerator.generate_paths", false]], "get_agg_index_exprs() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_agg_index_exprs", false]], "get_array_accesses() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_array_accesses", false]], "get_assignments() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_assignments", false]], "get_condition_edges() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_condition_edges", false]], "get_condition_truths() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_condition_truths", false]], "get_conditions() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_conditions", false]], "get_description() (gametime.src.path_generator.pathtype static method)": [[1, "gametime.src.path_generator.PathType.get_description", false]], "get_dir_paths() (in module gametime.src.project_configuration_parser)": [[1, "gametime.src.project_configuration_parser.get_dir_paths", false]], "get_edges() (gametime.src.nx_helper.dag static method)": [[1, "gametime.src.nx_helper.Dag.get_edges", false]], "get_edges_for_conditions() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_edges_for_conditions", false]], "get_file_paths() (in module gametime.src.project_configuration_parser)": [[1, "gametime.src.project_configuration_parser.get_file_paths", false]], "get_ilp_solver() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.get_ilp_solver", false]], "get_ilp_solver_name() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.get_ilp_solver_name", false]], "get_ilp_solver_names() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.get_ilp_solver_names", false]], "get_ilp_solver_proper_names() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.get_ilp_solver_proper_names", false]], "get_line_numbers() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_line_numbers", false]], "get_measured_value() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_measured_value", false]], "get_node_label() (gametime.src.nx_helper.dag method)": [[1, "gametime.src.nx_helper.Dag.get_node_label", false]], "get_nodes() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_nodes", false]], "get_orig_filename_with_extension() (gametime.src.project_configuration.projectconfiguration method)": [[1, "gametime.src.project_configuration.ProjectConfiguration.get_orig_filename_with_extension", false]], "get_predicted_value() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.get_predicted_value", false]], "get_proper_name() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.get_proper_name", false]], "get_random_path() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.get_random_path", false]], "get_temp_filename_with_extension() (gametime.src.project_configuration.projectconfiguration method)": [[1, "gametime.src.project_configuration.ProjectConfiguration.get_temp_filename_with_extension", false]], "gui_dir (in module gametime.src.defaults)": [[1, "gametime.src.defaults.gui_dir", false]], "has_cycles() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.has_cycles", false]], "has_finite_lower_bound() (gametime.src.interval.interval method)": [[1, "gametime.src.interval.Interval.has_finite_lower_bound", false]], "has_finite_upper_bound() (gametime.src.interval.interval method)": [[1, "gametime.src.interval.Interval.has_finite_upper_bound", false]], "ilp_problem (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.ilp_problem", false]], "ilpproblem (class in gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.IlpProblem", false]], "initialize() (in module gametime.src.logging_helper)": [[1, "gametime.src.logging_helper.initialize", false]], "initialize_dictionaries() (gametime.src.nx_helper.dag method)": [[1, "gametime.src.nx_helper.Dag.initialize_dictionaries", false]], "inline_functions() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.inline_functions", false]], "interval (class in gametime.src.interval)": [[1, "gametime.src.interval.Interval", false]], "is_ilp_solver_name() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.is_ilp_solver_name", false]], "iteratively_find_overcomplete_basis() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.iteratively_find_overcomplete_basis", false]], "keep_cil_temps (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.KEEP_CIL_TEMPS", false]], "keep_ilp_solver_output (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.KEEP_ILP_SOLVER_OUTPUT", false]], "keep_parser_output (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.KEEP_PARSER_OUTPUT", false]], "keep_simulator_output (gametime.src.project_configuration.debugconfiguration attribute)": [[1, "gametime.src.project_configuration.DebugConfiguration.KEEP_SIMULATOR_OUTPUT", false]], "line_numbers (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.line_numbers", false]], "little (gametime.src.gametime_configuration.endianness attribute)": [[1, "gametime.src.gametime_configuration.Endianness.LITTLE", false]], "load_dag_from_dot_file() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.load_dag_from_dot_file", false]], "load_variables() (gametime.src.nx_helper.dag method)": [[1, "gametime.src.nx_helper.Dag.load_variables", false]], "longest (gametime.src.pulp_helper.extremum attribute)": [[1, "gametime.src.pulp_helper.Extremum.LONGEST", false]], "lower_bound (gametime.src.interval.interval property)": [[1, "gametime.src.interval.Interval.lower_bound", false]], "make_compact() (in module gametime.src.pulp_helper)": [[1, "gametime.src.pulp_helper.make_compact", false]], "measure() (gametime.src.backend.arm_backend.arm_backend.armbackend method)": [[1, "gametime.src.backend.arm_backend.arm_backend.ArmBackend.measure", false]], "measure() (gametime.src.backend.backend.backend method)": [[1, "gametime.src.backend.backend.Backend.measure", false]], "measure() (gametime.src.backend.flexpret_backend.flexpret_backend.flexpretbackend method)": [[1, "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend.measure", false]], "measure() (gametime.src.backend.x86_backend.x86_backend.x86backend method)": [[1, "gametime.src.backend.x86_backend.x86_backend.X86Backend.measure", false]], "measure_basis_paths() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.measure_basis_paths", false]], "measure_path() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.measure_path", false]], "measure_path() (gametime.src.path_analyzer.pathanalyzer method)": [[1, "gametime.src.path_analyzer.PathAnalyzer.measure_path", false]], "measure_paths() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.measure_paths", false]], "measured_value (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.measured_value", false]], "module": [[1, "module-gametime.src", false], [1, "module-gametime.src.analyzer", false], [1, "module-gametime.src.backend", false], [1, "module-gametime.src.backend.arm_backend", false], [1, "module-gametime.src.backend.arm_backend.arm_backend", false], [1, "module-gametime.src.backend.backend", false], [1, "module-gametime.src.backend.flexpret_backend", false], [1, "module-gametime.src.backend.flexpret_backend.flexpret_backend", false], [1, "module-gametime.src.backend.x86_backend", false], [1, "module-gametime.src.backend.x86_backend.x86_backend", false], [1, "module-gametime.src.clang_helper", false], [1, "module-gametime.src.defaults", false], [1, "module-gametime.src.file_helper", false], [1, "module-gametime.src.gametime_configuration", false], [1, "module-gametime.src.gametime_error", false], [1, "module-gametime.src.histogram", false], [1, "module-gametime.src.interval", false], [1, "module-gametime.src.logging_helper", false], [1, "module-gametime.src.nx_helper", false], [1, "module-gametime.src.path", false], [1, "module-gametime.src.path_analyzer", false], [1, "module-gametime.src.path_generator", false], [1, "module-gametime.src.project_configuration", false], [1, "module-gametime.src.project_configuration_parser", false], [1, "module-gametime.src.pulp_helper", false], [1, "module-gametime.src.smt_solver", false]], "move_files() (in module gametime.src.file_helper)": [[1, "gametime.src.file_helper.move_files", false]], "name (gametime.src.backend.backend.backend attribute)": [[1, "gametime.src.backend.backend.Backend.name", false]], "nodes (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.nodes", false]], "nodes_except_sink (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.nodes_except_sink", false]], "nodes_except_sink_indices (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.nodes_except_sink_indices", false]], "nodes_except_source_sink (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.nodes_except_source_sink", false]], "nodes_except_source_sink_indices (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.nodes_except_source_sink_indices", false]], "nodes_indices (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.nodes_indices", false]], "num_edges (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.num_edges", false]], "num_nodes (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.num_nodes", false]], "num_paths (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.num_paths", false]], "num_paths() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.num_paths", false]], "obj_val (gametime.src.pulp_helper.ilpproblem attribute)": [[1, "gametime.src.pulp_helper.IlpProblem.obj_val", false]], "parse() (gametime.src.project_configuration_parser.configurationparser static method)": [[1, "gametime.src.project_configuration_parser.ConfigurationParser.parse", false]], "parse() (gametime.src.project_configuration_parser.yamlconfigurationparser static method)": [[1, "gametime.src.project_configuration_parser.YAMLConfigurationParser.parse", false]], "path (class in gametime.src.path)": [[1, "gametime.src.path.Path", false]], "path_bundled_constraints (gametime.src.analyzer.analyzer attribute)": [[1, "gametime.src.analyzer.Analyzer.path_bundled_constraints", false]], "path_dimension (gametime.src.analyzer.analyzer attribute)": [[1, "gametime.src.analyzer.Analyzer.path_dimension", false]], "path_exclusive_constraints (gametime.src.analyzer.analyzer attribute)": [[1, "gametime.src.analyzer.Analyzer.path_exclusive_constraints", false]], "pathanalyzer (class in gametime.src.path_analyzer)": [[1, "gametime.src.path_analyzer.PathAnalyzer", false]], "pathgenerator (class in gametime.src.path_generator)": [[1, "gametime.src.path_generator.PathGenerator", false]], "pathtype (class in gametime.src.path_generator)": [[1, "gametime.src.path_generator.PathType", false]], "predicted_value (gametime.src.path.path attribute)": [[1, "gametime.src.path.Path.predicted_value", false]], "project_config (gametime.src.analyzer.analyzer attribute)": [[1, "gametime.src.analyzer.Analyzer.project_config", false]], "project_config (gametime.src.backend.backend.backend attribute)": [[1, "gametime.src.backend.backend.Backend.project_config", false]], "projectconfiguration (class in gametime.src.project_configuration)": [[1, "gametime.src.project_configuration.ProjectConfiguration", false]], "random (gametime.src.path_generator.pathtype attribute)": [[1, "gametime.src.path_generator.PathType.RANDOM", false]], "read_agg_index_exprs_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_agg_index_exprs_from_file", false]], "read_array_accesses_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_array_accesses_from_file", false]], "read_assignments_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_assignments_from_file", false]], "read_condition_edges_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_condition_edges_from_file", false]], "read_condition_truths_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_condition_truths_from_file", false]], "read_conditions_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_conditions_from_file", false]], "read_gametime_config_yaml() (in module gametime.src.gametime_configuration)": [[1, "gametime.src.gametime_configuration.read_gametime_config_yaml", false]], "read_line_numbers_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_line_numbers_from_file", false]], "read_measured_value_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_measured_value_from_file", false]], "read_nodes_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_nodes_from_file", false]], "read_predicted_value_from_file() (gametime.src.path.path static method)": [[1, "gametime.src.path.Path.read_predicted_value_from_file", false]], "remove_all_except() (in module gametime.src.file_helper)": [[1, "gametime.src.file_helper.remove_all_except", false]], "remove_back_edges_to_make_dag() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.remove_back_edges_to_make_dag", false]], "remove_file() (in module gametime.src.file_helper)": [[1, "gametime.src.file_helper.remove_file", false]], "remove_files() (in module gametime.src.file_helper)": [[1, "gametime.src.file_helper.remove_files", false]], "remove_temp_cil_files() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.remove_temp_cil_files", false]], "reset_edge_weights() (gametime.src.nx_helper.dag method)": [[1, "gametime.src.nx_helper.Dag.reset_edge_weights", false]], "reset_path_bundled_constraints() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.reset_path_bundled_constraints", false]], "reset_path_exclusive_constraints() (gametime.src.analyzer.analyzer method)": [[1, "gametime.src.analyzer.Analyzer.reset_path_exclusive_constraints", false]], "run_backend_and_parse_output() (gametime.src.backend.arm_backend.arm_backend.armbackend method)": [[1, "gametime.src.backend.arm_backend.arm_backend.ArmBackend.run_backend_and_parse_output", false]], "run_backend_and_parse_output() (gametime.src.backend.flexpret_backend.flexpret_backend.flexpretbackend method)": [[1, "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend.run_backend_and_parse_output", false]], "run_backend_and_parse_output() (gametime.src.backend.x86_backend.x86_backend.x86backend method)": [[1, "gametime.src.backend.x86_backend.x86_backend.X86Backend.run_backend_and_parse_output", false]], "set_ilp_solver() (gametime.src.project_configuration.projectconfiguration method)": [[1, "gametime.src.project_configuration.ProjectConfiguration.set_ilp_solver", false]], "set_measured_value() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.set_measured_value", false]], "set_predicted_value() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.set_predicted_value", false]], "shortest (gametime.src.pulp_helper.extremum attribute)": [[1, "gametime.src.pulp_helper.Extremum.SHORTEST", false]], "sink (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.sink", false]], "source_dir (in module gametime.src.defaults)": [[1, "gametime.src.defaults.source_dir", false]], "special_edges (gametime.src.nx_helper.dag attribute)": [[1, "gametime.src.nx_helper.Dag.special_edges", false]], "timing_func (gametime.src.backend.arm_backend.arm_backend.armbackend attribute)": [[1, "gametime.src.backend.arm_backend.arm_backend.ArmBackend.timing_func", false]], "timing_func (gametime.src.backend.flexpret_backend.flexpret_backend.flexpretbackend attribute)": [[1, "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend.timing_func", false]], "timing_func (gametime.src.backend.x86_backend.x86_backend.x86backend attribute)": [[1, "gametime.src.backend.x86_backend.x86_backend.X86Backend.timing_func", false]], "unroll_loops() (in module gametime.src.clang_helper)": [[1, "gametime.src.clang_helper.unroll_loops", false]], "upper_bound (gametime.src.interval.interval property)": [[1, "gametime.src.interval.Interval.upper_bound", false]], "worst_case (gametime.src.path_generator.pathtype attribute)": [[1, "gametime.src.path_generator.PathType.WORST_CASE", false]], "write_agg_index_exprs_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_agg_index_exprs_to_file", false]], "write_array_accesses_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_array_accesses_to_file", false]], "write_assignments_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_assignments_to_file", false]], "write_condition_edges_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_condition_edges_to_file", false]], "write_condition_truths_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_condition_truths_to_file", false]], "write_conditions_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_conditions_to_file", false]], "write_dag_to_dot_file() (in module gametime.src.nx_helper)": [[1, "gametime.src.nx_helper.write_dag_to_dot_file", false]], "write_histogram_to_file() (in module gametime.src.histogram)": [[1, "gametime.src.histogram.write_histogram_to_file", false]], "write_ilp_problem_to_lp_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_ilp_problem_to_lp_file", false]], "write_line_numbers_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_line_numbers_to_file", false]], "write_measured_value_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_measured_value_to_file", false]], "write_nodes_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_nodes_to_file", false]], "write_predicted_value_to_file() (gametime.src.path.path method)": [[1, "gametime.src.path.Path.write_predicted_value_to_file", false]], "x86backend (class in gametime.src.backend.x86_backend.x86_backend)": [[1, "gametime.src.backend.x86_backend.x86_backend.X86Backend", false]], "yamlconfigurationparser (class in gametime.src.project_configuration_parser)": [[1, "gametime.src.project_configuration_parser.YAMLConfigurationParser", false]]}, "objects": {"gametime": [[1, 0, 0, "-", "src"]], "gametime.src": [[1, 1, 1, "", "GameTime"], [1, 0, 0, "-", "analyzer"], [1, 0, 0, "-", "backend"], [1, 0, 0, "-", "clang_helper"], [1, 0, 0, "-", "defaults"], [1, 0, 0, "-", "file_helper"], [1, 0, 0, "-", "gametime_configuration"], [1, 0, 0, "-", "gametime_error"], [1, 0, 0, "-", "histogram"], [1, 0, 0, "-", "interval"], [1, 0, 0, "-", "logging_helper"], [1, 0, 0, "-", "nx_helper"], [1, 0, 0, "-", "path"], [1, 0, 0, "-", "path_analyzer"], [1, 0, 0, "-", "path_generator"], [1, 0, 0, "-", "project_configuration"], [1, 0, 0, "-", "project_configuration_parser"], [1, 0, 0, "-", "pulp_helper"], [1, 0, 0, "-", "smt_solver"]], "gametime.src.GameTime": [[1, 2, 1, "", "analyze"]], "gametime.src.analyzer": [[1, 1, 1, "", "Analyzer"]], "gametime.src.analyzer.Analyzer": [[1, 2, 1, "", "add_path_bundled_constraint"], [1, 2, 1, "", "add_path_exclusive_constraint"], [1, 3, 1, "", "basis_matrix"], [1, 2, 1, "", "create_dag"], [1, 3, 1, "", "dag"], [1, 2, 1, "", "estimate_edge_weights"], [1, 2, 1, "", "generate_basis_paths"], [1, 2, 1, "", "generate_overcomplete_basis"], [1, 2, 1, "", "generate_paths"], [1, 2, 1, "", "iteratively_find_overcomplete_basis"], [1, 2, 1, "", "load_dag_from_dot_file"], [1, 2, 1, "", "measure_basis_paths"], [1, 2, 1, "", "measure_path"], [1, 2, 1, "", "measure_paths"], [1, 3, 1, "", "path_bundled_constraints"], [1, 3, 1, "", "path_dimension"], [1, 3, 1, "", "path_exclusive_constraints"], [1, 3, 1, "", "project_config"], [1, 2, 1, "", "reset_path_bundled_constraints"], [1, 2, 1, "", "reset_path_exclusive_constraints"]], "gametime.src.backend": [[1, 0, 0, "-", "arm_backend"], [1, 0, 0, "-", "backend"], [1, 0, 0, "-", "flexpret_backend"], [1, 0, 0, "-", "x86_backend"]], "gametime.src.backend.arm_backend": [[1, 0, 0, "-", "arm_backend"]], "gametime.src.backend.arm_backend.arm_backend": [[1, 1, 1, "", "ArmBackend"]], "gametime.src.backend.arm_backend.arm_backend.ArmBackend": [[1, 2, 1, "", "generate_executable"], [1, 2, 1, "", "measure"], [1, 2, 1, "", "run_backend_and_parse_output"], [1, 3, 1, "", "timing_func"]], "gametime.src.backend.backend": [[1, 1, 1, "", "Backend"]], "gametime.src.backend.backend.Backend": [[1, 2, 1, "", "measure"], [1, 3, 1, "", "name"], [1, 3, 1, "", "project_config"]], "gametime.src.backend.flexpret_backend": [[1, 0, 0, "-", "flexpret_backend"]], "gametime.src.backend.flexpret_backend.flexpret_backend": [[1, 1, 1, "", "FlexpretBackend"]], "gametime.src.backend.flexpret_backend.flexpret_backend.FlexpretBackend": [[1, 2, 1, "", "c_file_to_mem"], [1, 2, 1, "", "generate_executable_c"], [1, 2, 1, "", "measure"], [1, 2, 1, "", "run_backend_and_parse_output"], [1, 3, 1, "", "timing_func"]], "gametime.src.backend.x86_backend": [[1, 0, 0, "-", "x86_backend"]], "gametime.src.backend.x86_backend.x86_backend": [[1, 1, 1, "", "X86Backend"]], "gametime.src.backend.x86_backend.x86_backend.X86Backend": [[1, 2, 1, "", "generate_executable"], [1, 2, 1, "", "measure"], [1, 2, 1, "", "run_backend_and_parse_output"], [1, 3, 1, "", "timing_func"]], "gametime.src.clang_helper": [[1, 4, 1, "", "bc_to_executable"], [1, 4, 1, "", "compile_to_llvm_for_analysis"], [1, 4, 1, "", "compile_to_llvm_for_exec"], [1, 4, 1, "", "dump_object"], [1, 4, 1, "", "generate_dot_file"], [1, 4, 1, "", "inline_functions"], [1, 4, 1, "", "remove_temp_cil_files"], [1, 4, 1, "", "unroll_loops"]], "gametime.src.defaults": [[1, 5, 1, "", "config"], [1, 5, 1, "", "config_file"], [1, 5, 1, "", "gui_dir"], [1, 5, 1, "", "source_dir"]], "gametime.src.file_helper": [[1, 4, 1, "", "create_dir"], [1, 4, 1, "", "move_files"], [1, 4, 1, "", "remove_all_except"], [1, 4, 1, "", "remove_file"], [1, 4, 1, "", "remove_files"]], "gametime.src.gametime_configuration": [[1, 1, 1, "", "Endianness"], [1, 1, 1, "", "GametimeConfiguration"], [1, 4, 1, "", "read_gametime_config_yaml"]], "gametime.src.gametime_configuration.Endianness": [[1, 3, 1, "", "BIG"], [1, 3, 1, "", "LITTLE"]], "gametime.src.gametime_error": [[1, 6, 1, "", "GameTimeError"], [1, 6, 1, "", "GameTimeWarning"]], "gametime.src.histogram": [[1, 4, 1, "", "compute_histogram"], [1, 4, 1, "", "write_histogram_to_file"]], "gametime.src.interval": [[1, 1, 1, "", "Interval"]], "gametime.src.interval.Interval": [[1, 2, 1, "", "has_finite_lower_bound"], [1, 2, 1, "", "has_finite_upper_bound"], [1, 7, 1, "", "lower_bound"], [1, 7, 1, "", "upper_bound"]], "gametime.src.logging_helper": [[1, 4, 1, "", "initialize"]], "gametime.src.nx_helper": [[1, 1, 1, "", "Dag"], [1, 4, 1, "", "construct_dag"], [1, 4, 1, "", "find_root_node"], [1, 4, 1, "", "get_random_path"], [1, 4, 1, "", "has_cycles"], [1, 4, 1, "", "num_paths"], [1, 4, 1, "", "remove_back_edges_to_make_dag"], [1, 4, 1, "", "write_dag_to_dot_file"]], "gametime.src.nx_helper.Dag": [[1, 3, 1, "", "all_edges"], [1, 3, 1, "", "all_nodes"], [1, 3, 1, "", "edge_weights"], [1, 3, 1, "", "edges_indices"], [1, 3, 1, "", "edges_reduced"], [1, 3, 1, "", "edges_reduced_indices"], [1, 2, 1, "", "get_edges"], [1, 2, 1, "", "get_node_label"], [1, 2, 1, "", "initialize_dictionaries"], [1, 2, 1, "", "load_variables"], [1, 3, 1, "", "nodes_except_sink"], [1, 3, 1, "", "nodes_except_sink_indices"], [1, 3, 1, "", "nodes_except_source_sink"], [1, 3, 1, "", "nodes_except_source_sink_indices"], [1, 3, 1, "", "nodes_indices"], [1, 3, 1, "", "num_edges"], [1, 3, 1, "", "num_nodes"], [1, 3, 1, "", "num_paths"], [1, 2, 1, "", "reset_edge_weights"], [1, 3, 1, "", "sink"], [1, 3, 1, "", "special_edges"]], "gametime.src.path": [[1, 1, 1, "", "Path"]], "gametime.src.path.Path": [[1, 3, 1, "", "agg_index_exprs"], [1, 3, 1, "", "array_accesses"], [1, 3, 1, "", "assignments"], [1, 3, 1, "", "condition_edges"], [1, 3, 1, "", "condition_truths"], [1, 3, 1, "", "conditions"], [1, 2, 1, "", "get_agg_index_exprs"], [1, 2, 1, "", "get_array_accesses"], [1, 2, 1, "", "get_assignments"], [1, 2, 1, "", "get_condition_edges"], [1, 2, 1, "", "get_condition_truths"], [1, 2, 1, "", "get_conditions"], [1, 2, 1, "", "get_edges_for_conditions"], [1, 2, 1, "", "get_line_numbers"], [1, 2, 1, "", "get_measured_value"], [1, 2, 1, "", "get_nodes"], [1, 2, 1, "", "get_predicted_value"], [1, 3, 1, "", "ilp_problem"], [1, 3, 1, "", "line_numbers"], [1, 3, 1, "", "measured_value"], [1, 3, 1, "", "nodes"], [1, 3, 1, "", "predicted_value"], [1, 2, 1, "", "read_agg_index_exprs_from_file"], [1, 2, 1, "", "read_array_accesses_from_file"], [1, 2, 1, "", "read_assignments_from_file"], [1, 2, 1, "", "read_condition_edges_from_file"], [1, 2, 1, "", "read_condition_truths_from_file"], [1, 2, 1, "", "read_conditions_from_file"], [1, 2, 1, "", "read_line_numbers_from_file"], [1, 2, 1, "", "read_measured_value_from_file"], [1, 2, 1, "", "read_nodes_from_file"], [1, 2, 1, "", "read_predicted_value_from_file"], [1, 2, 1, "", "set_measured_value"], [1, 2, 1, "", "set_predicted_value"], [1, 2, 1, "", "write_agg_index_exprs_to_file"], [1, 2, 1, "", "write_array_accesses_to_file"], [1, 2, 1, "", "write_assignments_to_file"], [1, 2, 1, "", "write_condition_edges_to_file"], [1, 2, 1, "", "write_condition_truths_to_file"], [1, 2, 1, "", "write_conditions_to_file"], [1, 2, 1, "", "write_ilp_problem_to_lp_file"], [1, 2, 1, "", "write_line_numbers_to_file"], [1, 2, 1, "", "write_measured_value_to_file"], [1, 2, 1, "", "write_nodes_to_file"], [1, 2, 1, "", "write_predicted_value_to_file"]], "gametime.src.path_analyzer": [[1, 1, 1, "", "PathAnalyzer"]], "gametime.src.path_analyzer.PathAnalyzer": [[1, 2, 1, "", "measure_path"]], "gametime.src.path_generator": [[1, 1, 1, "", "PathGenerator"], [1, 1, 1, "", "PathType"]], "gametime.src.path_generator.PathGenerator": [[1, 2, 1, "", "generate_paths"]], "gametime.src.path_generator.PathType": [[1, 3, 1, "", "ALL_DECREASING"], [1, 3, 1, "", "ALL_INCREASING"], [1, 3, 1, "", "BEST_CASE"], [1, 3, 1, "", "RANDOM"], [1, 3, 1, "", "WORST_CASE"], [1, 2, 1, "", "get_description"]], "gametime.src.project_configuration": [[1, 1, 1, "", "DebugConfiguration"], [1, 1, 1, "", "ProjectConfiguration"]], "gametime.src.project_configuration.DebugConfiguration": [[1, 3, 1, "", "DUMP_ALL_PATHS"], [1, 3, 1, "", "DUMP_ALL_QUERIES"], [1, 3, 1, "", "DUMP_INSTRUCTION_TRACE"], [1, 3, 1, "", "DUMP_IR"], [1, 3, 1, "", "DUMP_PATH"], [1, 3, 1, "", "DUMP_SMT_TRACE"], [1, 3, 1, "", "KEEP_CIL_TEMPS"], [1, 3, 1, "", "KEEP_ILP_SOLVER_OUTPUT"], [1, 3, 1, "", "KEEP_PARSER_OUTPUT"], [1, 3, 1, "", "KEEP_SIMULATOR_OUTPUT"]], "gametime.src.project_configuration.ProjectConfiguration": [[1, 2, 1, "", "get_orig_filename_with_extension"], [1, 2, 1, "", "get_temp_filename_with_extension"], [1, 2, 1, "", "set_ilp_solver"]], "gametime.src.project_configuration_parser": [[1, 1, 1, "", "ConfigurationParser"], [1, 1, 1, "", "YAMLConfigurationParser"], [1, 4, 1, "", "get_dir_paths"], [1, 4, 1, "", "get_file_paths"]], "gametime.src.project_configuration_parser.ConfigurationParser": [[1, 2, 1, "", "parse"]], "gametime.src.project_configuration_parser.YAMLConfigurationParser": [[1, 2, 1, "", "parse"]], "gametime.src.pulp_helper": [[1, 1, 1, "", "Extremum"], [1, 1, 1, "", "IlpProblem"], [1, 4, 1, "", "find_extreme_path"], [1, 4, 1, "", "find_goodness_of_fit"], [1, 4, 1, "", "find_least_compatible_mu_max"], [1, 4, 1, "", "find_longest_path_with_delta"], [1, 4, 1, "", "find_minimal_overcomplete_basis"], [1, 4, 1, "", "find_worst_expressible_path"], [1, 4, 1, "", "generate_and_solve_core_problem"], [1, 4, 1, "", "get_ilp_solver"], [1, 4, 1, "", "get_ilp_solver_name"], [1, 4, 1, "", "get_ilp_solver_names"], [1, 4, 1, "", "get_ilp_solver_proper_names"], [1, 4, 1, "", "get_proper_name"], [1, 4, 1, "", "is_ilp_solver_name"], [1, 4, 1, "", "make_compact"]], "gametime.src.pulp_helper.Extremum": [[1, 3, 1, "", "LONGEST"], [1, 3, 1, "", "SHORTEST"]], "gametime.src.pulp_helper.IlpProblem": [[1, 3, 1, "", "obj_val"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"], "5": ["py", "data", "Python data"], "6": ["py", "exception", "Python exception"], "7": ["py", "property", "Python property"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function", "5": "py:data", "6": "py:exception", "7": "py:property"}, "terms": {"": 1, "0": 1, "001": 1, "1": 1, "10": 1, "100": 1, "2": 1, "3": 1, "32": 1, "4": 1, "5": 1, "5pm": 1, "A": 1, "By": 1, "For": 1, "If": 1, "In": 1, "It": 1, "Not": 1, "OR": 1, "One": 1, "The": 1, "There": 1, "These": 1, "To": 1, "__asm__": 1, "__volatile__": 1, "a_1": 1, "a_2": 1, "a_n": 1, "about": 1, "abov": 1, "absolut": 1, "abstract": 1, "access": 1, "account": 1, "actual": 1, "acycl": 1, "add": 1, "add_edg": 1, "add_nod": 1, "add_path": 1, "add_path_bundled_constraint": 1, "add_path_exclusive_constraint": 1, "addconstraint": 1, "addit": 1, "adj": 1, "adjac": 1, "again": 1, "against": 1, "agg_index_expr": 1, "aggreg": 1, "algorithm": 1, "all": 1, "all_decreas": 1, "all_edg": 1, "all_increas": 1, "all_nod": 1, "all_temp_fil": 1, "allow": 1, "along": 1, "alreadi": 1, "also": 1, "alwai": 1, "among": 1, "an": 1, "analysi": 1, "analyz": 1, "ani": 1, "annot": 1, "appear": 1, "appropri": 1, "ar": 1, "arbitrari": 1, "arg": 1, "argument": 1, "arm_backend": 1, "armbackend": 1, "around": 1, "arrai": 1, "arrang": 1, "array_access": 1, "asm": 1, "assign": 1, "assignconspi": 1, "assignconsslack": 1, "assignvarsdj": 1, "assignvarsv": 1, "associ": 1, "assum": 1, "attribut": 1, "avail": 1, "b_1": 1, "b_i": 1, "b_n": 1, "back": 1, "backend": 0, "backward": 1, "bar": 1, "basi": 1, "basis_matrix": 1, "basis_path": 1, "bc": 1, "bc_file_fold": 1, "bc_filenam": 1, "bc_filepath": 1, "bc_to_execut": 1, "becom": 1, "been": 1, "befor": 1, "begin": 1, "behav": 1, "being": 1, "below": 1, "best": 1, "best_cas": 1, "between": 1, "big": 1, "bin": 1, "bitcod": 1, "blue": 1, "bool": 1, "boolean": 1, "bound": 1, "branch": 1, "built": 1, "bundl": 1, "c": 1, "c_file_to_mem": 1, "c_filepath": 1, "calcul": 1, "call": 1, "can": 1, "cannot": 1, "case": 1, "cd": 1, "chang": 1, "cil": 1, "clang": 1, "clang_help": 1, "class": 1, "cleaner": 1, "close": 1, "code": 1, "codebas": 1, "coeffici": 1, "collect": 1, "color": 1, "combin": 1, "comma": 1, "command": 1, "compact": 1, "compactifi": 1, "compat": 1, "compil": 1, "compile_flag": 1, "compile_to_llvm_for_analysi": 1, "compile_to_llvm_for_exec": 1, "comprehens": 1, "comput": 1, "compute_histogram": 1, "condit": 1, "condition_edg": 1, "condition_num": 1, "condition_truth": 1, "config": 1, "config_fil": 1, "configur": 1, "configuration_file_path": 1, "configurationpars": 1, "connect": 1, "consid": 1, "consist": 1, "constraint": 1, "construct": 1, "construct_dag": 1, "consumpt": 1, "contain": 1, "control": 1, "copi": 1, "correspond": 1, "could": 1, "count": 1, "creat": 1, "create_dag": 1, "create_dir": 1, "creation": 1, "cycl": 1, "d": 1, "dag": 1, "dag_nam": 1, "data": 1, "datadict": 1, "ddict": 1, "dealta": 1, "debug": 1, "debug_config": 1, "debugconfigur": 1, "decreas": 1, "default": 1, "defin": 1, "deg": 1, "degre": 1, "degreeview": 1, "delta": 1, "describ": 1, "descript": 1, "desktop": 1, "dest_dir": 1, "destin": 1, "determin": 1, "determinant_threshold": 1, "df": 1, "dict": 1, "dictionari": 1, "didegreeview": 1, "differ": 1, "digraph": 1, "dimens": 1, "dir": 1, "dir_loc": 1, "dir_paths_str": 1, "direct": 1, "directori": 1, "displai": 1, "dmp": 1, "do": 1, "doe": 1, "doesn": 1, "don": 1, "dot": 1, "down": 1, "drive": 1, "driver": 1, "dump": 1, "dump_all_path": 1, "dump_all_queri": 1, "dump_instruction_trac": 1, "dump_ir": 1, "dump_object": 1, "dump_path": 1, "dump_smt_trac": 1, "dure": 1, "e": 1, "e1": 1, "e2": 1, "each": 1, "edg": 1, "edge_numb": 1, "edge_weight": 1, "edgedataview": 1, "edges_indic": 1, "edges_reduc": 1, "edges_reduced_indic": 1, "edges_to_label": 1, "edgeweight": 1, "effici": 1, "either": 1, "element": 1, "empti": 1, "emu": 1, "end": 1, "end_label": 1, "endian": 1, "energi": 1, "entir": 1, "equival": 1, "error": 1, "estim": 1, "estimate_edge_weight": 1, "etc": 1, "everi": 1, "exampl": 1, "except": 1, "exclus": 1, "execut": 1, "executable_path": 1, "exhaust": 1, "exist": 1, "expos": 1, "express": 1, "extend": 1, "extens": 1, "extra": 1, "extra_flag": 1, "extra_lib": 1, "extract": 1, "extrem": 1, "extremum": 1, "f": 1, "fals": 1, "feasibl": 1, "file": 1, "file_help": 1, "file_nam": 1, "file_paths_str": 1, "filenam": 1, "filepath": 1, "find": 1, "find_extreme_path": 1, "find_goodness_of_fit": 1, "find_least_compatible_mu_max": 1, "find_longest_path_with_delta": 1, "find_minimal_overcomplete_basi": 1, "find_root_nod": 1, "find_worst_expressible_path": 1, "finit": 1, "first": 1, "fixobject": 1, "flag": 1, "flexpret_backend": 1, "flexpretbackend": 1, "float": 1, "folder": 1, "follow": 1, "foo": 1, "foovalu": 1, "form": 1, "format": 1, "formatt": 1, "former": 1, "found": 1, "fp": 1, "framework": 1, "from": 1, "frommp": 1, "func": 1, "func_nam": 1, "function": 1, "further": 1, "g": 1, "gametime_configur": 1, "gametime_error": 1, "gametime_file_path": 1, "gametime_flexpret_path": 1, "gametime_path": 1, "gametimeconfigur": 1, "gametimeerror": 1, "gametimewarn": 1, "gener": 1, "generate_and_solve_core_problem": 1, "generate_basis_path": 1, "generate_dot_fil": 1, "generate_execut": 1, "generate_executable_c": 1, "generate_overcomplete_basi": 1, "generate_path": 1, "get": 1, "get_agg_index_expr": 1, "get_array_access": 1, "get_assign": 1, "get_condit": 1, "get_condition_edg": 1, "get_condition_truth": 1, "get_descript": 1, "get_dir_path": 1, "get_dummyvar": 1, "get_edg": 1, "get_edges_for_condit": 1, "get_file_path": 1, "get_ilp_solv": 1, "get_ilp_solver_nam": 1, "get_ilp_solver_proper_nam": 1, "get_line_numb": 1, "get_measured_valu": 1, "get_nod": 1, "get_node_label": 1, "get_orig_filename_with_extens": 1, "get_predicted_valu": 1, "get_proper_nam": 1, "get_random_path": 1, "get_temp_filename_with_extens": 1, "getsens": 1, "given": 1, "glob": 1, "graph": 1, "guarante": 1, "gui": 1, "gui_dir": 1, "ha": 1, "has_cycl": 1, "has_finite_lower_bound": 1, "has_finite_upper_bound": 1, "have": 1, "help": 1, "helper": 1, "henc": 1, "here": 1, "hi": 1, "highlight": 1, "highlight_color": 1, "highlighted_edg": 1, "highlightededg": 1, "histogram": 1, "hold": 1, "home": 1, "host": 1, "how": 1, "human": 1, "i": 1, "id": 1, "idempot": 1, "ident": 1, "identifi": 1, "idiom": 1, "ignor": 1, "ilp": 1, "ilp_problem": 1, "ilp_solv": 1, "ilp_solver_nam": 1, "ilpproblem": 1, "import": 1, "in_degre": 1, "in_edg": 1, "incid": 1, "includ": 1, "increas": 1, "indegreeview": 1, "index": [0, 1], "indexexpress": 1, "indic": 1, "individu": 1, "inedgedataview": 1, "inedgeview": 1, "infeas": 1, "infeasibilitygap": 1, "info": 1, "inform": 1, "initi": 1, "initial_path": 1, "initialize_dictionari": 1, "inlin": 1, "inline_funct": 1, "input": 1, "input_fil": 1, "instanc": 1, "instruct": 1, "int": 1, "integ": 1, "interact": 1, "interest": 1, "interfac": 1, "intermedi": 1, "interv": 1, "ir": 1, "is_ilp_solver_nam": 1, "ismip": 1, "ispm": 1, "item": 1, "iter": 1, "iteratively_find_overcomplete_basi": 1, "its": 1, "itself": 1, "just": 1, "k": 1, "keep": 1, "keep_cil_temp": 1, "keep_ilp_solver_output": 1, "keep_parser_output": 1, "keep_simulator_output": 1, "kei": 1, "keyword": 1, "kwarg": 1, "l1": 1, "label": 1, "latter": 1, "leaf": 1, "least": 1, "left": 1, "legal": 1, "length": 1, "lenth": 1, "level": 1, "lf": 1, "librari": 1, "lie": 1, "like": 1, "limit": 1, "line": 1, "line_numb": 1, "linear": 1, "liner": 1, "list": 1, "littl": 1, "ll": 1, "llvm": 1, "lo": 1, "load": 1, "load_dag_from_dot_fil": 1, "load_vari": 1, "loadbasisvalu": 1, "loadbasisvaluesfromfil": 1, "local": 1, "locat": 1, "location_fil": 1, "log": 1, "logger": 1, "logging_help": 1, "long": 1, "longest": 1, "longsest": 1, "lookup": 1, "loop": 1, "lower": 1, "lower_bound": 1, "lp": 1, "lpproblem": 1, "lpsolver": 1, "machin": 1, "made": 1, "mai": 1, "main": 0, "maingt": 1, "maintain": 1, "make": 1, "make_compact": 1, "makedir": 1, "mani": 1, "map": 1, "match": 1, "matrix": 1, "max_infeasible_path": 1, "maxim": 1, "maximum": 1, "maximum_error_scale_factor": 1, "mean": 1, "measur": 1, "measure_basis_path": 1, "measure_fold": 1, "measure_path": 1, "measured_valu": 1, "mechan": 1, "mem": 1, "mem_filepath": 1, "merg": 1, "method": 1, "might": 1, "miscellan": 1, "model_as_nested_arrai": 1, "modif": 1, "modifi": 1, "modul": 0, "modular": 1, "more": 1, "most": 1, "move": 1, "move_fil": 1, "movement": 1, "mr": 1, "multidigraph": 1, "multipl": 1, "must": 1, "n": 1, "name": 1, "nameorignoextens": 1, "nbr": 1, "nbunch": 1, "nd_iter": 1, "ndarrai": 1, "necessari": 1, "need": 1, "neighbor": 1, "neither": 1, "networkx": 1, "never": 1, "node": 1, "nodedata": 1, "nodedataview": 1, "nodes_except_sink": 1, "nodes_except_sink_indic": 1, "nodes_except_source_sink": 1, "nodes_except_source_sink_indic": 1, "nodes_indic": 1, "nodeview": 1, "non": 1, "none": 1, "nor": 1, "norm": 1, "normalisednam": 1, "note": 1, "noth": 1, "nstatic": 1, "num_edg": 1, "num_nod": 1, "num_path": 1, "number": 1, "numer": 1, "numpi": 1, "nx": 1, "nx_helper": 1, "nxhelper": 1, "o": 1, "o0": 1, "obj_al": 1, "obj_val": 1, "object": 1, "object_filepath": 1, "obtain": 1, "onc": 1, "one": 1, "onli": 1, "oper": 1, "opt": 1, "option": 1, "order": 1, "origin": 1, "other": 1, "otherwis": 1, "out": 1, "out_degre": 1, "out_edg": 1, "outdegreeview": 1, "outedgedataview": 1, "outedgeview": 1, "outgo": 1, "output": 1, "output_file_fold": 1, "output_fold": 1, "output_nam": 1, "output_name_prefix": 1, "over": 1, "overcomplet": 1, "overwrit": 1, "overwritten": 1, "own": 1, "packag": 0, "page": 0, "pair": 1, "paragraph": 1, "paramet": 1, "pars": 1, "parser": 1, "pass": 1, "path": 1, "path_analyz": 1, "path_bundled_constraint": 1, "path_dimens": 1, "path_exclusive_constraint": 1, "path_function_low": 1, "path_function_upp": 1, "path_gener": 1, "path_graph": 1, "path_nam": 1, "path_typ": 1, "path_value_rang": 1, "pathanalyz": 1, "pathfunctionlow": 1, "pathfunctionupp": 1, "pathgener": 1, "pathtyp": 1, "pattern": 1, "perform": 1, "period": 1, "phoenix": 1, "pi": 1, "pmccntr_el0": 1, "point": 1, "posit": 1, "possibl": 1, "practic": 1, "preced": 1, "precondit": 1, "pred": 1, "predecessor": 1, "predefin": 1, "predict": 1, "predicted_valu": 1, "prefix": 1, "preprocessed_path": 1, "present": 1, "preserv": 1, "prevent_basis_refin": 1, "print": 1, "print_problem": 1, "printproblem": 1, "privat": 1, "problem": 1, "process": 1, "produc": 1, "program": 1, "project": 1, "project_config": 1, "project_configur": 1, "project_configuration_pars": 1, "projectconfigur": 1, "proper": 1, "properti": 1, "provid": 1, "pulp": 1, "pulp_help": 1, "purpos": 1, "put": 1, "python": 1, "queri": 1, "quietli": 1, "r": 1, "rais": 1, "random": 1, "randomize_initial_basi": 1, "rang": 1, "rather": 1, "rdcycl": 1, "rdtsc": 1, "read": 1, "read_agg_index_exprs_from_fil": 1, "read_array_accesses_from_fil": 1, "read_assignments_from_fil": 1, "read_condition_edges_from_fil": 1, "read_condition_truths_from_fil": 1, "read_conditions_from_fil": 1, "read_cycle_count": 1, "read_gametime_config_yaml": 1, "read_line_numbers_from_fil": 1, "read_measured_value_from_fil": 1, "read_nodes_from_fil": 1, "read_predicted_value_from_fil": 1, "readabl": 1, "real": 1, "red": 1, "refer": 1, "regener": 1, "rel": 1, "relat": 1, "relev": 1, "reli": 1, "remov": 1, "remove_all_except": 1, "remove_back_edges_to_make_dag": 1, "remove_fil": 1, "remove_temp_cil_fil": 1, "repeat": 1, "replac": 1, "report": 1, "repres": 1, "represent": 1, "request": 1, "requir": 1, "research": 1, "reset": 1, "reset_edge_weight": 1, "reset_path_bundled_constraint": 1, "reset_path_exclusive_constraint": 1, "rest": 1, "restoreobject": 1, "result": 1, "return": 1, "root": 1, "rtype": 1, "run": 1, "run_backend_and_parse_output": 1, "runtim": 1, "same": 1, "satisfi": 1, "save": 1, "scalabl": 1, "search": 0, "second": 1, "self": 1, "separ": 1, "set": 1, "set_ilp_solv": 1, "set_measured_valu": 1, "set_predicted_valu": 1, "shell": 1, "shortest": 1, "should": 1, "shown": 1, "simpl": 1, "simpler": 1, "simul": 1, "singl": 1, "sink": 1, "smallest": 1, "smt": 0, "so": 1, "solv": 1, "solver": 0, "some": 1, "someth": 1, "sourc": 1, "source_dir": 1, "special": 1, "special_edg": 1, "specif": 1, "specifi": 1, "specifii": 1, "src": 0, "standard": 1, "start": 1, "start_label": 1, "state": 1, "statement": 1, "static": 1, "storag": 1, "store": 1, "stored_fold": 1, "str": 1, "streamhandl": 1, "string": 1, "structur": 1, "style": 1, "subclass": 1, "submodul": 1, "subscript": 1, "succ": 1, "successor": 1, "sum": 1, "supplement": 1, "support": 1, "symbol": 1, "system": 1, "t": 1, "take": 1, "taken": 1, "target": 1, "temperari": 1, "temporari": 1, "temprari": 1, "test": 1, "than": 1, "thei": 1, "them": 1, "thi": 1, "those": 1, "through": 1, "throw": 1, "time": 1, "timing_func": 1, "togeth": 1, "tool": 1, "total": 1, "trace": 1, "travers": 1, "tripl": 1, "true": 1, "truth": 1, "tupl": 1, "two": 1, "type": 1, "u": 1, "under": 1, "underli": 1, "unix": 1, "unreli": 1, "unrol": 1, "unroll_loop": 1, "unsign": 1, "unusedconstraintnam": 1, "upper": 1, "upper_bound": 1, "us": 1, "use_ob_extract": 1, "user": 1, "usual": 1, "util": 1, "v": 1, "val": 1, "valid": 1, "valu": 1, "variabl": 1, "variablesdict": 1, "variou": 1, "vector": 1, "version": 1, "vertex": 1, "via": 1, "view": 1, "visit": 1, "visual": 1, "volatil": 1, "wa": 1, "wai": 1, "want": 1, "warn": 1, "we": 1, "weight": 1, "weights_posit": 1, "weightsposit": 1, "well": 1, "when": 1, "where": 1, "whether": 1, "which": 1, "while": 1, "whitespac": 1, "whose": 1, "within": 1, "without": 1, "word": 1, "work": 1, "worst": 1, "worst_cas": 1, "would": 1, "wrapper": 1, "write": 1, "write_agg_index_exprs_to_fil": 1, "write_array_accesses_to_fil": 1, "write_assignments_to_fil": 1, "write_condition_edges_to_fil": 1, "write_condition_truths_to_fil": 1, "write_conditions_to_fil": 1, "write_dag_to_dot_fil": 1, "write_histogram_to_fil": 1, "write_ilp_problem_to_lp_fil": 1, "write_line_numbers_to_fil": 1, "write_measured_value_to_fil": 1, "write_nodes_to_fil": 1, "write_predicted_value_to_fil": 1, "written": 1, "x86_backend": 1, "x86backend": 1, "yaml": 1, "yaml_config_path": 1, "yamlconfigurationpars": 1, "yield": 1, "you": 1, "your": 1}, "titles": ["Welcome to GameTime\u2019s documentation!", "GameTime src Documentation"], "titleterms": {"": 0, "arm": 1, "backend": 1, "base": 1, "content": 0, "document": [0, 1], "flexpret": 1, "gametim": [0, 1], "indic": 0, "main": 1, "modul": 1, "packag": 1, "smt": 1, "solver": 1, "src": 1, "tabl": 0, "welcom": 0, "x86": 1}}) \ No newline at end of file