From acbfa0129af1dace09c782d05da34192bde423bc Mon Sep 17 00:00:00 2001 From: Stan Jenkins Date: Tue, 26 Nov 2024 22:40:35 +0000 Subject: [PATCH] auto generated docs from Jenkins --- index.html | 19 + odoc.support/fonts/KaTeX_AMS-Regular.woff2 | Bin 0 -> 28076 bytes .../fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 0 -> 6912 bytes .../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 0 -> 6908 bytes odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 0 -> 11348 bytes .../fonts/KaTeX_Fraktur-Regular.woff2 | Bin 0 -> 11316 bytes odoc.support/fonts/KaTeX_Main-Bold.woff2 | Bin 0 -> 25322 bytes .../fonts/KaTeX_Main-BoldItalic.woff2 | Bin 0 -> 16780 bytes odoc.support/fonts/KaTeX_Main-Italic.woff2 | Bin 0 -> 16988 bytes odoc.support/fonts/KaTeX_Main-Regular.woff2 | Bin 0 -> 26272 bytes .../fonts/KaTeX_Math-BoldItalic.woff2 | Bin 0 -> 16399 bytes odoc.support/fonts/KaTeX_Math-Italic.woff2 | Bin 0 -> 16439 bytes odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 0 -> 12216 bytes .../fonts/KaTeX_SansSerif-Italic.woff2 | Bin 0 -> 12028 bytes .../fonts/KaTeX_SansSerif-Regular.woff2 | Bin 0 -> 10344 bytes odoc.support/fonts/KaTeX_Script-Regular.woff2 | Bin 0 -> 9644 bytes odoc.support/fonts/KaTeX_Size1-Regular.woff2 | Bin 0 -> 5468 bytes odoc.support/fonts/KaTeX_Size2-Regular.woff2 | Bin 0 -> 5208 bytes odoc.support/fonts/KaTeX_Size3-Regular.woff2 | Bin 0 -> 3624 bytes odoc.support/fonts/KaTeX_Size4-Regular.woff2 | Bin 0 -> 4928 bytes .../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 0 -> 13568 bytes .../fonts/fira-mono-v14-latin-500.woff2 | Bin 0 -> 16148 bytes .../fonts/fira-mono-v14-latin-regular.woff2 | Bin 0 -> 16284 bytes .../fonts/fira-sans-v17-latin-500.woff2 | Bin 0 -> 24020 bytes .../fonts/fira-sans-v17-latin-500italic.woff2 | Bin 0 -> 24896 bytes .../fonts/fira-sans-v17-latin-700.woff2 | Bin 0 -> 24964 bytes .../fonts/fira-sans-v17-latin-700italic.woff2 | Bin 0 -> 26072 bytes .../fonts/fira-sans-v17-latin-italic.woff2 | Bin 0 -> 24935 bytes .../fonts/fira-sans-v17-latin-regular.woff2 | Bin 0 -> 23879 bytes .../fonts/noticia-text-v15-latin-700.woff2 | Bin 0 -> 21972 bytes .../fonts/noticia-text-v15-latin-italic.woff2 | Bin 0 -> 17356 bytes .../noticia-text-v15-latin-regular.woff2 | Bin 0 -> 22308 bytes odoc.support/highlight.pack.js | 634 ++++++++ odoc.support/katex.min.css | 1 + odoc.support/katex.min.js | 1 + odoc.support/odoc.css | 1393 +++++++++++++++++ odoc.support/odoc_search.js | 66 + .../Dataflow_types/index.html | 19 + .../Dataflow_utils/index.html | 48 + .../Debug_data_generation/index.html | 12 + .../Dependence_analysis/index.html | 46 + .../Factor_graph/index.html | 56 + .../Memory_patterns/index.html | 60 + .../Mir_utils/index.html | 104 ++ .../Monotone_framework/index.html | 279 ++++ .../Monotone_framework_sigs/index.html | 2 + .../module-type-FLOWGRAPH/index.html | 2 + .../module-type-INITIALTOTALTYPE/index.html | 2 + .../module-type-INITIALTYPE/index.html | 2 + .../module-type-LATTICE/index.html | 2 + .../module-type-LATTICE_NO_BOT/index.html | 2 + .../module-type-MONOTONE_FRAMEWORK/index.html | 2 + .../module-type-TOTALTYPE/index.html | 2 + .../module-type-TRANSFER_FUNCTION/index.html | 2 + .../module-type-TYPE/index.html | 2 + .../Optimize/index.html | 16 + .../Partial_evaluator/index.html | 36 + .../Pedantic_analysis/index.html | 2 + .../Pedantic_dist_warnings/index.html | 24 + stanc/Analysis_and_optimization/index.html | 2 + .../Fixed/Make/argument-1-Pattern/index.html | 10 + stanc/Common/Fixed/Make/index.html | 16 + .../Make2/argument-1-First/Pattern/index.html | 10 + .../Fixed/Make2/argument-1-First/index.html | 16 + .../Fixed/Make2/argument-2-Pattern/index.html | 41 + stanc/Common/Fixed/Make2/index.html | 57 + stanc/Common/Fixed/index.html | 5 + .../Fixed/module-type-S/Pattern/index.html | 10 + stanc/Common/Fixed/module-type-S/index.html | 16 + .../module-type-S2/First/Pattern/index.html | 10 + .../Fixed/module-type-S2/First/index.html | 16 + .../Fixed/module-type-S2/Pattern/index.html | 41 + stanc/Common/Fixed/module-type-S2/index.html | 57 + .../Foldable/Make/argument-1-X/index.html | 2 + stanc/Common/Foldable/Make/index.html | 2 + .../Foldable/Make2/argument-1-X/index.html | 2 + stanc/Common/Foldable/Make2/index.html | 22 + stanc/Common/Foldable/index.html | 2 + .../Foldable/module-type-Basic/index.html | 2 + .../Foldable/module-type-Basic2/index.html | 2 + .../Common/Foldable/module-type-S/index.html | 2 + .../Common/Foldable/module-type-S2/index.html | 22 + stanc/Common/Gensym/index.html | 2 + stanc/Common/ICE/index.html | 2 + stanc/Common/Pattern/index.html | 2 + stanc/Common/Pattern/module-type-S/index.html | 10 + .../Common/Pattern/module-type-S2/index.html | 41 + stanc/Common/Pretty/index.html | 2 + stanc/Common/Pretty/module-type-S/index.html | 2 + stanc/Common/Pretty/module-type-S1/index.html | 6 + stanc/Common/Pretty/module-type-S2/index.html | 7 + .../Specialized/Make/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Make/Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Make/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Make/Map/Provide_of_sexp/index.html | 2 + stanc/Common/Specialized/Make/Map/index.html | 96 ++ .../Replace_polymorphic_compare/index.html | 2 + .../Specialized/Make/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Make/Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Make/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Make/Set/Provide_of_sexp/index.html | 2 + stanc/Common/Specialized/Make/Set/index.html | 27 + .../Specialized/Make/argument-1-X/index.html | 10 + .../Make/argument-2-Meta/index.html | 2 + stanc/Common/Specialized/Make/index.html | 7 + .../Specialized/Make2/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Make2/Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Make2/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Make2/Map/Provide_of_sexp/index.html | 2 + stanc/Common/Specialized/Make2/Map/index.html | 96 ++ .../Replace_polymorphic_compare/index.html | 2 + .../Specialized/Make2/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Make2/Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Make2/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Make2/Set/Provide_of_sexp/index.html | 2 + stanc/Common/Specialized/Make2/Set/index.html | 27 + .../Specialized/Make2/argument-1-X/index.html | 21 + .../Make2/argument-2-First/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Map/Provide_of_sexp/index.html | 2 + .../Make2/argument-2-First/Map/index.html | 96 ++ .../Make2/argument-2-First/Meta/index.html | 2 + .../Replace_polymorphic_compare/index.html | 2 + .../Make2/argument-2-First/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Set/Provide_of_sexp/index.html | 2 + .../Make2/argument-2-First/Set/index.html | 27 + .../Make2/argument-2-First/index.html | 7 + .../Make2/argument-3-Meta/index.html | 2 + stanc/Common/Specialized/Make2/index.html | 7 + stanc/Common/Specialized/index.html | 9 + .../Specialized/module-type-Meta/index.html | 2 + .../module-type-S/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../module-type-S/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Map/Provide_of_sexp/index.html | 2 + .../Specialized/module-type-S/Map/index.html | 96 ++ .../Specialized/module-type-S/Meta/index.html | 2 + .../Replace_polymorphic_compare/index.html | 2 + .../module-type-S/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../module-type-S/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Set/Provide_of_sexp/index.html | 2 + .../Specialized/module-type-S/Set/index.html | 27 + .../Specialized/module-type-S/index.html | 7 + .../module-type-Unspecialized/index.html | 10 + .../module-type-Unspecialized2/index.html | 21 + stanc/Common/index.html | 2 + stanc/Frontend/Ast/index.html | 388 +++++ stanc/Frontend/Ast_to_Mir/index.html | 7 + stanc/Frontend/Canonicalize/index.html | 5 + stanc/Frontend/Debugging/index.html | 2 + .../Frontend/Deprecation_analysis/index.html | 5 + stanc/Frontend/Environment/index.html | 13 + stanc/Frontend/Errors/index.html | 7 + stanc/Frontend/Include_files/index.html | 2 + stanc/Frontend/Info/index.html | 4 + stanc/Frontend/Input_warnings/index.html | 2 + stanc/Frontend/Lexer/index.html | 23 + stanc/Frontend/Parse/index.html | 10 + stanc/Frontend/Parser/Incremental/index.html | 9 + .../Parser/MenhirInterpreter/index.html | 33 + stanc/Frontend/Parser/index.html | 10 + stanc/Frontend/Parsing_errors/index.html | 2 + stanc/Frontend/Preprocessor/index.html | 4 + stanc/Frontend/Pretty_print_prog/index.html | 8 + stanc/Frontend/Pretty_printing/index.html | 102 ++ stanc/Frontend/Promotion/index.html | 18 + stanc/Frontend/Semantic_error/index.html | 138 ++ stanc/Frontend/SignatureMismatch/index.html | 51 + stanc/Frontend/Typechecker/index.html | 12 + stanc/Frontend/Warnings/index.html | 2 + stanc/Frontend/index.html | 2 + stanc/Middle/Expr/Fixed/Pattern/index.html | 13 + stanc/Middle/Expr/Fixed/index.html | 16 + stanc/Middle/Expr/Helpers/index.html | 10 + stanc/Middle/Expr/Typed/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Expr/Typed/Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Expr/Typed/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Expr/Typed/Map/Provide_of_sexp/index.html | 2 + stanc/Middle/Expr/Typed/Map/index.html | 96 ++ stanc/Middle/Expr/Typed/Meta/index.html | 7 + .../Replace_polymorphic_compare/index.html | 2 + stanc/Middle/Expr/Typed/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Expr/Typed/Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Expr/Typed/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Expr/Typed/Set/Provide_of_sexp/index.html | 2 + stanc/Middle/Expr/Typed/Set/index.html | 27 + stanc/Middle/Expr/Typed/index.html | 9 + stanc/Middle/Expr/index.html | 2 + stanc/Middle/Flag_vars/index.html | 2 + stanc/Middle/Fun_kind/index.html | 30 + stanc/Middle/Index/index.html | 18 + stanc/Middle/Internal_fun/index.html | 10 + stanc/Middle/Location/index.html | 10 + .../Location_span/Comparator/index.html | 2 + stanc/Middle/Location_span/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Location_span/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Map/Provide_of_sexp/index.html | 2 + stanc/Middle/Location_span/Map/index.html | 96 ++ .../Replace_polymorphic_compare/index.html | 2 + stanc/Middle/Location_span/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Location_span/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Set/Provide_of_sexp/index.html | 2 + stanc/Middle/Location_span/Set/index.html | 27 + stanc/Middle/Location_span/index.html | 8 + stanc/Middle/Mem_pattern/index.html | 5 + stanc/Middle/Operator/index.html | 5 + stanc/Middle/Program/Numbered/index.html | 9 + stanc/Middle/Program/Typed/index.html | 9 + stanc/Middle/Program/index.html | 89 ++ stanc/Middle/SizedType/index.html | 14 + stanc/Middle/Stan_math_signatures/index.html | 6 + stanc/Middle/Stmt/Fixed/Pattern/index.html | 63 + stanc/Middle/Stmt/Fixed/index.html | 59 + stanc/Middle/Stmt/Helpers/index.html | 59 + stanc/Middle/Stmt/Located/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Located/Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Stmt/Located/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Located/Map/Provide_of_sexp/index.html | 2 + stanc/Middle/Stmt/Located/Map/index.html | 96 ++ stanc/Middle/Stmt/Located/Meta/index.html | 2 + .../Stmt/Located/Non_recursive/index.html | 2 + .../Replace_polymorphic_compare/index.html | 2 + stanc/Middle/Stmt/Located/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Located/Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Stmt/Located/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Located/Set/Provide_of_sexp/index.html | 2 + stanc/Middle/Stmt/Located/Set/index.html | 27 + stanc/Middle/Stmt/Located/index.html | 9 + stanc/Middle/Stmt/Numbered/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../Numbered/Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../Stmt/Numbered/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Numbered/Map/Provide_of_sexp/index.html | 2 + stanc/Middle/Stmt/Numbered/Map/index.html | 96 ++ stanc/Middle/Stmt/Numbered/Meta/index.html | 2 + .../Replace_polymorphic_compare/index.html | 2 + stanc/Middle/Stmt/Numbered/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../Numbered/Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../Stmt/Numbered/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Numbered/Set/Provide_of_sexp/index.html | 2 + stanc/Middle/Stmt/Numbered/Set/index.html | 27 + stanc/Middle/Stmt/Numbered/index.html | 9 + stanc/Middle/Stmt/index.html | 2 + stanc/Middle/Transformation/index.html | 10 + stanc/Middle/Type/index.html | 10 + .../Middle/UnsizedType/Comparator/index.html | 2 + stanc/Middle/UnsizedType/Map/Key/index.html | 2 + .../Provide_bin_io/argument-1-Key/index.html | 2 + .../UnsizedType/Map/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Key/index.html | 2 + .../UnsizedType/Map/Provide_hash/index.html | 4 + .../Provide_of_sexp/argument-1-Key/index.html | 2 + .../Map/Provide_of_sexp/index.html | 2 + stanc/Middle/UnsizedType/Map/index.html | 96 ++ .../Replace_polymorphic_compare/index.html | 2 + stanc/Middle/UnsizedType/Set/Elt/index.html | 2 + .../Provide_bin_io/argument-1-Elt/index.html | 2 + .../UnsizedType/Set/Provide_bin_io/index.html | 2 + .../Provide_hash/argument-1-Elt/index.html | 2 + .../UnsizedType/Set/Provide_hash/index.html | 2 + .../Provide_of_sexp/argument-1-Elt/index.html | 2 + .../Set/Provide_of_sexp/index.html | 2 + stanc/Middle/UnsizedType/Set/index.html | 27 + stanc/Middle/UnsizedType/index.html | 17 + stanc/Middle/Utils/index.html | 10 + stanc/Middle/index.html | 2 + stanc/Stan_math_backend/Cpp/Decls/index.html | 2 + .../Cpp/Expression_syntax/index.html | 2 + stanc/Stan_math_backend/Cpp/Exprs/index.html | 2 + .../Stan_math_backend/Cpp/Printing/index.html | 15 + stanc/Stan_math_backend/Cpp/Stmts/index.html | 2 + stanc/Stan_math_backend/Cpp/Tests/index.html | 2 + stanc/Stan_math_backend/Cpp/Types/index.html | 2 + stanc/Stan_math_backend/Cpp/index.html | 37 + stanc/Stan_math_backend/Cpp_Json/index.html | 5 + stanc/Stan_math_backend/Cpp_str/index.html | 2 + .../Lower_expr/Testing/index.html | 6 + stanc/Stan_math_backend/Lower_expr/index.html | 83 + .../Lower_functions/index.html | 5 + .../Lower_program/index.html | 5 + .../Lower_stmt/Testing/index.html | 2 + stanc/Stan_math_backend/Lower_stmt/index.html | 51 + stanc/Stan_math_backend/Mangle/index.html | 2 + stanc/Stan_math_backend/Numbering/index.html | 7 + .../Transform_Mir/index.html | 2 + stanc/Stan_math_backend/index.html | 2 + stanc/core_ideas.html | 3 + stanc/cpp_ir.html | 6 + stanc/dependencies.html | 2 + stanc/exposing_new_functions.html | 8 + stanc/getting_started.html | 25 + stanc/index.html | 2 + stanc/parser_messages.html | 19 + 346 files changed, 6473 insertions(+) create mode 100644 index.html create mode 100644 odoc.support/fonts/KaTeX_AMS-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Caligraphic-Bold.woff2 create mode 100644 odoc.support/fonts/KaTeX_Caligraphic-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 create mode 100644 odoc.support/fonts/KaTeX_Fraktur-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Main-Bold.woff2 create mode 100644 odoc.support/fonts/KaTeX_Main-BoldItalic.woff2 create mode 100644 odoc.support/fonts/KaTeX_Main-Italic.woff2 create mode 100644 odoc.support/fonts/KaTeX_Main-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Math-BoldItalic.woff2 create mode 100644 odoc.support/fonts/KaTeX_Math-Italic.woff2 create mode 100644 odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 create mode 100644 odoc.support/fonts/KaTeX_SansSerif-Italic.woff2 create mode 100644 odoc.support/fonts/KaTeX_SansSerif-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Script-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Size1-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Size2-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Size3-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Size4-Regular.woff2 create mode 100644 odoc.support/fonts/KaTeX_Typewriter-Regular.woff2 create mode 100644 odoc.support/fonts/fira-mono-v14-latin-500.woff2 create mode 100644 odoc.support/fonts/fira-mono-v14-latin-regular.woff2 create mode 100644 odoc.support/fonts/fira-sans-v17-latin-500.woff2 create mode 100644 odoc.support/fonts/fira-sans-v17-latin-500italic.woff2 create mode 100644 odoc.support/fonts/fira-sans-v17-latin-700.woff2 create mode 100644 odoc.support/fonts/fira-sans-v17-latin-700italic.woff2 create mode 100644 odoc.support/fonts/fira-sans-v17-latin-italic.woff2 create mode 100644 odoc.support/fonts/fira-sans-v17-latin-regular.woff2 create mode 100644 odoc.support/fonts/noticia-text-v15-latin-700.woff2 create mode 100644 odoc.support/fonts/noticia-text-v15-latin-italic.woff2 create mode 100644 odoc.support/fonts/noticia-text-v15-latin-regular.woff2 create mode 100644 odoc.support/highlight.pack.js create mode 100644 odoc.support/katex.min.css create mode 100644 odoc.support/katex.min.js create mode 100644 odoc.support/odoc.css create mode 100644 odoc.support/odoc_search.js create mode 100644 stanc/Analysis_and_optimization/Dataflow_types/index.html create mode 100644 stanc/Analysis_and_optimization/Dataflow_utils/index.html create mode 100644 stanc/Analysis_and_optimization/Debug_data_generation/index.html create mode 100644 stanc/Analysis_and_optimization/Dependence_analysis/index.html create mode 100644 stanc/Analysis_and_optimization/Factor_graph/index.html create mode 100644 stanc/Analysis_and_optimization/Memory_patterns/index.html create mode 100644 stanc/Analysis_and_optimization/Mir_utils/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-FLOWGRAPH/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTOTALTYPE/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTYPE/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE_NO_BOT/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-MONOTONE_FRAMEWORK/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TOTALTYPE/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TRANSFER_FUNCTION/index.html create mode 100644 stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TYPE/index.html create mode 100644 stanc/Analysis_and_optimization/Optimize/index.html create mode 100644 stanc/Analysis_and_optimization/Partial_evaluator/index.html create mode 100644 stanc/Analysis_and_optimization/Pedantic_analysis/index.html create mode 100644 stanc/Analysis_and_optimization/Pedantic_dist_warnings/index.html create mode 100644 stanc/Analysis_and_optimization/index.html create mode 100644 stanc/Common/Fixed/Make/argument-1-Pattern/index.html create mode 100644 stanc/Common/Fixed/Make/index.html create mode 100644 stanc/Common/Fixed/Make2/argument-1-First/Pattern/index.html create mode 100644 stanc/Common/Fixed/Make2/argument-1-First/index.html create mode 100644 stanc/Common/Fixed/Make2/argument-2-Pattern/index.html create mode 100644 stanc/Common/Fixed/Make2/index.html create mode 100644 stanc/Common/Fixed/index.html create mode 100644 stanc/Common/Fixed/module-type-S/Pattern/index.html create mode 100644 stanc/Common/Fixed/module-type-S/index.html create mode 100644 stanc/Common/Fixed/module-type-S2/First/Pattern/index.html create mode 100644 stanc/Common/Fixed/module-type-S2/First/index.html create mode 100644 stanc/Common/Fixed/module-type-S2/Pattern/index.html create mode 100644 stanc/Common/Fixed/module-type-S2/index.html create mode 100644 stanc/Common/Foldable/Make/argument-1-X/index.html create mode 100644 stanc/Common/Foldable/Make/index.html create mode 100644 stanc/Common/Foldable/Make2/argument-1-X/index.html create mode 100644 stanc/Common/Foldable/Make2/index.html create mode 100644 stanc/Common/Foldable/index.html create mode 100644 stanc/Common/Foldable/module-type-Basic/index.html create mode 100644 stanc/Common/Foldable/module-type-Basic2/index.html create mode 100644 stanc/Common/Foldable/module-type-S/index.html create mode 100644 stanc/Common/Foldable/module-type-S2/index.html create mode 100644 stanc/Common/Gensym/index.html create mode 100644 stanc/Common/ICE/index.html create mode 100644 stanc/Common/Pattern/index.html create mode 100644 stanc/Common/Pattern/module-type-S/index.html create mode 100644 stanc/Common/Pattern/module-type-S2/index.html create mode 100644 stanc/Common/Pretty/index.html create mode 100644 stanc/Common/Pretty/module-type-S/index.html create mode 100644 stanc/Common/Pretty/module-type-S1/index.html create mode 100644 stanc/Common/Pretty/module-type-S2/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Key/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make/Map/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/Make/Map/index.html create mode 100644 stanc/Common/Specialized/Make/Replace_polymorphic_compare/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Elt/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make/Set/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/Make/Set/index.html create mode 100644 stanc/Common/Specialized/Make/argument-1-X/index.html create mode 100644 stanc/Common/Specialized/Make/argument-2-Meta/index.html create mode 100644 stanc/Common/Specialized/Make/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Key/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/Make2/Map/index.html create mode 100644 stanc/Common/Specialized/Make2/Replace_polymorphic_compare/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/Make2/Set/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-1-X/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Key/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Map/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Meta/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Replace_polymorphic_compare/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/Set/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-2-First/index.html create mode 100644 stanc/Common/Specialized/Make2/argument-3-Meta/index.html create mode 100644 stanc/Common/Specialized/Make2/index.html create mode 100644 stanc/Common/Specialized/index.html create mode 100644 stanc/Common/Specialized/module-type-Meta/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Key/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Map/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Meta/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Replace_polymorphic_compare/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Elt/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Provide_hash/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/index.html create mode 100644 stanc/Common/Specialized/module-type-S/Set/index.html create mode 100644 stanc/Common/Specialized/module-type-S/index.html create mode 100644 stanc/Common/Specialized/module-type-Unspecialized/index.html create mode 100644 stanc/Common/Specialized/module-type-Unspecialized2/index.html create mode 100644 stanc/Common/index.html create mode 100644 stanc/Frontend/Ast/index.html create mode 100644 stanc/Frontend/Ast_to_Mir/index.html create mode 100644 stanc/Frontend/Canonicalize/index.html create mode 100644 stanc/Frontend/Debugging/index.html create mode 100644 stanc/Frontend/Deprecation_analysis/index.html create mode 100644 stanc/Frontend/Environment/index.html create mode 100644 stanc/Frontend/Errors/index.html create mode 100644 stanc/Frontend/Include_files/index.html create mode 100644 stanc/Frontend/Info/index.html create mode 100644 stanc/Frontend/Input_warnings/index.html create mode 100644 stanc/Frontend/Lexer/index.html create mode 100644 stanc/Frontend/Parse/index.html create mode 100644 stanc/Frontend/Parser/Incremental/index.html create mode 100644 stanc/Frontend/Parser/MenhirInterpreter/index.html create mode 100644 stanc/Frontend/Parser/index.html create mode 100644 stanc/Frontend/Parsing_errors/index.html create mode 100644 stanc/Frontend/Preprocessor/index.html create mode 100644 stanc/Frontend/Pretty_print_prog/index.html create mode 100644 stanc/Frontend/Pretty_printing/index.html create mode 100644 stanc/Frontend/Promotion/index.html create mode 100644 stanc/Frontend/Semantic_error/index.html create mode 100644 stanc/Frontend/SignatureMismatch/index.html create mode 100644 stanc/Frontend/Typechecker/index.html create mode 100644 stanc/Frontend/Warnings/index.html create mode 100644 stanc/Frontend/index.html create mode 100644 stanc/Middle/Expr/Fixed/Pattern/index.html create mode 100644 stanc/Middle/Expr/Fixed/index.html create mode 100644 stanc/Middle/Expr/Helpers/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Key/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Provide_bin_io/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Provide_hash/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Expr/Typed/Map/index.html create mode 100644 stanc/Middle/Expr/Typed/Meta/index.html create mode 100644 stanc/Middle/Expr/Typed/Replace_polymorphic_compare/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Elt/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Provide_bin_io/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Provide_hash/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Expr/Typed/Set/index.html create mode 100644 stanc/Middle/Expr/Typed/index.html create mode 100644 stanc/Middle/Expr/index.html create mode 100644 stanc/Middle/Flag_vars/index.html create mode 100644 stanc/Middle/Fun_kind/index.html create mode 100644 stanc/Middle/Index/index.html create mode 100644 stanc/Middle/Internal_fun/index.html create mode 100644 stanc/Middle/Location/index.html create mode 100644 stanc/Middle/Location_span/Comparator/index.html create mode 100644 stanc/Middle/Location_span/Map/Key/index.html create mode 100644 stanc/Middle/Location_span/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Middle/Location_span/Map/Provide_bin_io/index.html create mode 100644 stanc/Middle/Location_span/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Middle/Location_span/Map/Provide_hash/index.html create mode 100644 stanc/Middle/Location_span/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Middle/Location_span/Map/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Location_span/Map/index.html create mode 100644 stanc/Middle/Location_span/Replace_polymorphic_compare/index.html create mode 100644 stanc/Middle/Location_span/Set/Elt/index.html create mode 100644 stanc/Middle/Location_span/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Middle/Location_span/Set/Provide_bin_io/index.html create mode 100644 stanc/Middle/Location_span/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Middle/Location_span/Set/Provide_hash/index.html create mode 100644 stanc/Middle/Location_span/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Middle/Location_span/Set/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Location_span/Set/index.html create mode 100644 stanc/Middle/Location_span/index.html create mode 100644 stanc/Middle/Mem_pattern/index.html create mode 100644 stanc/Middle/Operator/index.html create mode 100644 stanc/Middle/Program/Numbered/index.html create mode 100644 stanc/Middle/Program/Typed/index.html create mode 100644 stanc/Middle/Program/index.html create mode 100644 stanc/Middle/SizedType/index.html create mode 100644 stanc/Middle/Stan_math_signatures/index.html create mode 100644 stanc/Middle/Stmt/Fixed/Pattern/index.html create mode 100644 stanc/Middle/Stmt/Fixed/index.html create mode 100644 stanc/Middle/Stmt/Helpers/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Key/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Provide_bin_io/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Provide_hash/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Stmt/Located/Map/index.html create mode 100644 stanc/Middle/Stmt/Located/Meta/index.html create mode 100644 stanc/Middle/Stmt/Located/Non_recursive/index.html create mode 100644 stanc/Middle/Stmt/Located/Replace_polymorphic_compare/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Elt/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Provide_bin_io/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Provide_hash/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Stmt/Located/Set/index.html create mode 100644 stanc/Middle/Stmt/Located/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Key/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Provide_hash/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Map/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Meta/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Replace_polymorphic_compare/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Elt/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Provide_hash/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/index.html create mode 100644 stanc/Middle/Stmt/Numbered/Set/index.html create mode 100644 stanc/Middle/Stmt/Numbered/index.html create mode 100644 stanc/Middle/Stmt/index.html create mode 100644 stanc/Middle/Transformation/index.html create mode 100644 stanc/Middle/Type/index.html create mode 100644 stanc/Middle/UnsizedType/Comparator/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Key/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Provide_bin_io/argument-1-Key/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Provide_bin_io/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Provide_hash/argument-1-Key/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Provide_hash/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Provide_of_sexp/argument-1-Key/index.html create mode 100644 stanc/Middle/UnsizedType/Map/Provide_of_sexp/index.html create mode 100644 stanc/Middle/UnsizedType/Map/index.html create mode 100644 stanc/Middle/UnsizedType/Replace_polymorphic_compare/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Elt/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Provide_bin_io/argument-1-Elt/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Provide_bin_io/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Provide_hash/argument-1-Elt/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Provide_hash/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Provide_of_sexp/argument-1-Elt/index.html create mode 100644 stanc/Middle/UnsizedType/Set/Provide_of_sexp/index.html create mode 100644 stanc/Middle/UnsizedType/Set/index.html create mode 100644 stanc/Middle/UnsizedType/index.html create mode 100644 stanc/Middle/Utils/index.html create mode 100644 stanc/Middle/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Decls/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Expression_syntax/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Exprs/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Printing/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Stmts/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Tests/index.html create mode 100644 stanc/Stan_math_backend/Cpp/Types/index.html create mode 100644 stanc/Stan_math_backend/Cpp/index.html create mode 100644 stanc/Stan_math_backend/Cpp_Json/index.html create mode 100644 stanc/Stan_math_backend/Cpp_str/index.html create mode 100644 stanc/Stan_math_backend/Lower_expr/Testing/index.html create mode 100644 stanc/Stan_math_backend/Lower_expr/index.html create mode 100644 stanc/Stan_math_backend/Lower_functions/index.html create mode 100644 stanc/Stan_math_backend/Lower_program/index.html create mode 100644 stanc/Stan_math_backend/Lower_stmt/Testing/index.html create mode 100644 stanc/Stan_math_backend/Lower_stmt/index.html create mode 100644 stanc/Stan_math_backend/Mangle/index.html create mode 100644 stanc/Stan_math_backend/Numbering/index.html create mode 100644 stanc/Stan_math_backend/Transform_Mir/index.html create mode 100644 stanc/Stan_math_backend/index.html create mode 100644 stanc/core_ideas.html create mode 100644 stanc/cpp_ir.html create mode 100644 stanc/dependencies.html create mode 100644 stanc/exposing_new_functions.html create mode 100644 stanc/getting_started.html create mode 100644 stanc/index.html create mode 100644 stanc/parser_messages.html diff --git a/index.html b/index.html new file mode 100644 index 000000000..98c62de42 --- /dev/null +++ b/index.html @@ -0,0 +1,19 @@ + + + + index + + + + + +
+
+

OCaml package documentation

+
    +
  1. stanc
  2. +
+
+
+ + \ No newline at end of file diff --git a/odoc.support/fonts/KaTeX_AMS-Regular.woff2 b/odoc.support/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0acaaff03d4bb7606de02a827aeee338e5a86910 GIT binary patch literal 28076 zcmV)4K+3;&Pew8T0RR910Bx)Q4gdfE0Qryr0ButM0RR9100000000000000000000 z00006U;u_x2rvnp3=s$lgQIMM!gK*P0we>6dJBXK00bZfh;RpzAq;^h8yChW*tQI) zf474tf9UWmvjer;At_qJJ4ObAjRSzte{IG8|DTss#?U6Pq$r5$-28t~$dN6wErwJo za~1SqW}?_^GLyD_B})qv!-NCu+2=w|xZXP?WH@?W-qc{t=*Dc@7G{&*Rr|f2PJS1C zhC(0s6eQ>iMjQ6NMr%a(8W(NUg-6j?jOV&o6a!>CRL6BUiA-uV3!83tjRD8w9Q zTS)(|WV)+(idwaDgvnbaZjk7gd`Q54BYKt#$^sjr>VY-r-3%|Gm46yDaW9 zA*>`MVXTA%2t!Ch7$IRKA?zg}h>8dZvc$1L!HHv{b?xdd&bo@Vt*u>ZTiaS|hyA~G z{@0vZsQ;#>ocmS+q4P+Q6bJ==`li~vx<@m2JRmS77FvoOGC`1MckSwYimL)UDdBE= zU(y{*T007`?KlPI+1(^67zzMC`>m=oco?9F7&)oE+s{ZQpTPk8{JE5yXE%chKZB_X8HRih-qey z+?Q-qv53jN4{v&CO1eskfOCJa3iT;f#6SE4=USD}rard`&95=?zssa(BF1FNtXLQ1 zZ~TM@OYAGf@a}&8C9fbbx97ge(q^cIwlr8&Knje!sSE&n4+)%A=~R~^uDx$0UY7!KfcrV?PMq?9a+|xdk4sNTo`xT10ZSpv)=wBog^+? zNVtS)ZhL_W7i(KX_NCm#VEfLsy7t$Ty`QJ}p`|<%v{So>8SwJ~C zVK#U35`M*$l6LT#61}{p@LooR$I7G?Dbu5I6a`IQ*PrM2%Vs~gE%8~3WQvFrG9l=GIBt*Od}N}61FZQE zW6Mf!kslWpsbCTqTnlB6*K#9)4p5JHZFH&`%3(OTE6|h<2UbL>qb*@ zdi((~nNq)2{fN5qp6w(l(`U|}JCzK7tnN9WM5dL+$_%{~I)_r%rEhNQi6GO2QuU|q zeCl;wSf6R{mi}5F*{a2Ew{h$Ct$E8+)>QbX{}q~VpXSif8urVbHvX((@}GE29{i8L zdCj)1>qpnEU9o)e&|rUG`^nIk^FgQGs+6Mq7+)?5!iR%5FP^Z$K>>>T{oB_sI_aRj z=9+1$iKKyw1w6$4+{2v=0HnltxENCns)G`v`tJa?H5C^c{juAGRGbNd1U~z~&9i35 zPX9k@-dqCC`5V$MzXfWS>31JT$j&<=o~|&#q+%#X&U=D9f&}Tb07^pC z8A4D}Ml(bpUi=JEpgBQj?p@Q0JR(Ld$V{b0(M=-!GzM9T2&>ePayD*}t}aHUw0`1U zqAh3k`sNdyBBCu%ryXEL5@d#BYlYf%ScoEm1_cZV79k;{9@e1&FV>h?{?_{GD7(Wh zY1_fC_`40h2NZQV*O+^9i~e{hP2`(RmzukYLXF#SsKVb3koS} zGo%7tkm9K+i*(iji%E%L;JlwSijC1)9V3dU&^wAc&}hpw0=5-5{wk5$_LeV+$da!^ z8b#IXq~ya8YnKKV#JowMzYH67;%Gnw>#XGHksliuD1 z4sf2#;qa0o2PoYrWJNAO?TE>sT z(}xekn~&2z=l3sY6JDxL>F`|BeZ8tw6Rv1#*+3OHNX< z6Jb%r3)h9~LdqRcRT&Wfvm>kue;~LdmM3h6LKGkfF^IU8yo`jrf;@Q@`SKnV$Px-= z8AY;!Vp&Crj0UxsKu8w4l2+b)3W8a}=W_;cvxDj&lQ4Yr2Pb9t{F(&UxJI&j!s=|A z<1R_0NRVOpV8}5P7)lIZ3_lEii~y|Wp%7rZ-=ff1q-#NSB&_OKTwxOwuB*af#BQ|f zM??*vkDP{**5&fvK8-pFP?$Oi3#V_p?0Qk%E>xZEhIvbsX2u8>zi?VTqAUP95iv1Z-#B z=N-iKV>YNunx63yVCj{mUVk1=D0bUi8Rgqcrq|mFgUCL9zVxEZ%afMIYo2;A`#8NO_<8}^*$kwG$g0S*nh%*GK&lT^8}ewM5-i*4~PGo@f> zQ|k56T$}Ui2}bS8DNA0<8BIMu8^0zw&=xd4=Co{hrlVawYC0<=E|wNC)NWt_+csNN zIy2>Yd&9>MT)nU{K-+%zI01}~!&aNXn8=b73hfeR-9NCa#96A=SYpGWNUbctpU67Y z7J#K8lOvdw^(gTq6h@CLI^DB(i+(9XVsJIP3jUo<&yY*F$chz@DY6b+v_FGDRQ zy(J{GB{=zc3(j-n&Ty}Y_Pdh0y#)opnLCVBN>(uHh0=;ZxGnJ@^m0Zr-cbtrHMS^? zNh(@23`?3Er0)Zf3>h_v5-VE(Y6BoSvdJz^&>)f|Z%vTDFGLE~pdncXIU=Aj2&7~U znnsprIfEI^0gwtAEr}8*R{&ZAK!m#T20JKi7ISYQ2W{gW>o46 zflKhulrmUm$h6DSOL}awKG4ZM+dIT|p`by_jEb^GApmv6KB2nvQHeZ)Bec)KjUew6 z96^GE+JOPt)+pLSTRO>XsgQHp+4~%Em#xTZYp-nt7~) zx>HM4mn5}Jn?yBpa1fmen=5abpF<0#|07r1x*O`frFy%cL+Gimn`I)c4HKN#m zIKP%|dFF3UwR1vwX))!j>Nu3_PfWXtKLY38%rwbGl%u1PA>WCOBNV-~J@vg!lslo^ zYZ`v&sQQ0TM(3S7?nAqSA7gcey?MoKbXm86K8X*vv$vTW^zOCGmqfT^j!2N>PZqZfU)eC3Hb=u8e zO(~5mfdl(i5Kvx$-1BDNYtAtCNL=20#}ueqcbJhU~P*IcLl; z_D~AMFpw4E&FV%7kVH&Sk>@9*V4hMowiiV^D{Vaf<0(?tMI z!^6Y$H6U*loW&SHRI80w+*uN#o0TldfGdFDIh(u^5M-9+S(fEm791Xq1en<(E`WZ6 zY39v5wG>wsT>%2gf>|(4v}JCy!t}XDU!K8qg~_%fowg_lAny~xe&#M$xPO-}y=1?? zl>_t&c4JmZy-T#|)&oQ%RCGob^~BW&0fsh&y1&k{YJq4JVCR?|L58Ww7K?n)UERVA z%`4e&0A?&QXtKa8#S;_8R7T)_Ea$uiq=H)v0Jx!8LPoOm1m;~rE!qOoj*j3OJJdj+ z05v90+M(b?$=H(9nX4=8K}=AQA2w0?3q(E3p48wbMsRExq6(SBe!I&9u)Lb1a43Q-6}sEG!ZVxyG*+ll5axyIqi^b^#xIg-4M!a8D~7gc)W`%hsSj`=6n#R z2nNeT2BXREw+j#eH={#a3@`KtE{I8(Jkdjpaiww8X_6=iaLKnWS3VPbG`C3}A|VmX z+Aq!x2@T`sJKJVXV_Yga8fN@u9SGcCj^nP)J}#;q#Jq%rK>)A&Wg6zXGD!u#KIjuD zB>XhDF{W@f(MJLSmc!m7-|fYj-rD)`h10aRICwFz08JX)*Or>@iG};P;bsK z(jq_Zaxq2`?3gT@0pj~5(adkYJ|UWb=E@!D5U?e_c3wX3#SVwz5qc2jBK}6b>ja5} z{(nLRYH-nvzS1}&c!f!a)lr6cfl)SvzegRtip%46O`#a^@;Aeo1xf$@nZhAKK;9|V$kRhc(i4W4rk&j=S-bD3~YSEZpd z&mnxiE6#B(4E}^+Pkq1_K1!kyP!*p=FmbV?sG#^7M)ajCIHM7gQ7C$u5C)UI%5@dmt5!KkyX@MMhBbKDvLxX`695gPgE3LGx@MYKA6bkf+6Xu$acWM7t=Ij!ylQ3qP;rEJ zx_s%uS38Y>gG!in0FosChn+Qb$GdqOFA!kPUI#H=sVFFVF6DPFHBF5SD^v+E9*(If zLTg_->iw;naC?0xk_55eZhYD5FrIHQ{7kBFn=x*w{Dh8`wktpnH)O}X;?U(3V!^b=q;!l^% z<>sZ7$q@#b_Co1k-HVn&0^PKjU_qOrxFZtqY!x&1Pst~6%H!ur@c|VasfMCHS^ZIX zQey%IW}(33o2;{wHGH%~htcTvASztNZo;%dd&x=Z6UUCB3VQ+>VF+Pwaxa0R9LfP( zjDJTatKub0J~rX<$%x|0hU&+RE%;g)E$ulF)PxHVWrgF%i5fd^{7BzN2Z3RB{jyt) z+#WoqSS@m~OQuj|oU=!epU@V`D>FG~Lc{R*%_0O?tPL9Qn=B#k_daZGk0W_hMhgI` zVtW+%+0P%LHDvrIi{4<^w9}TR;a~qzML7oUuWEo&>+D36`9&~p=tRvbsScY`y=itX^5edpPEjaOB{VPKhoX^^yT_NbSpi961y^v z75v621(PDv+Ajhy6ePLGKw8^|S#$#^5E_R zZF-Pi1Qe{>@HB-z${K|-j}jdu4GG?C%p;gUQ2Z=qm(q=@wn(ey1lUXP@Qf3$BeegO zg_3>vteALF12*~I(NIxcE>Y$3!Dh7_88cZ3!wWX-Ayouf9Dqp_^59!dG}DrfX_wul zBV5W@s1XEPoNwMfkCS0O>SQCN+kGtX@=Npz$LfJiHh;9cfz7JUZL_t{$y_p~L7Mui zG=(Yim3hR8*Gce~gJXc|WP=GSB)F)G!H}pI%kkxr2(mGu6#7K!{JMs69JL7FR|m1t zr2Q&Z!h8wC69E8|8n*PJdCbFrvf;BzZk+#2^kX6wKV|<;PxLA`{k>XT43WLeoUwHk z67mboKunnX-BRpz4ZmH{CV0>o zA~@vboi2WP90`@UIuS{(VG9hRR{}nRtNLg)dfNp5v6gl$*Bb9_?XVS`kY0tPr)S(NtH+wJ!g5QUlgDUEZKrtZjMk4+JEuJ+HGJR5r zbS#dVZHBH1Z2+h4VOHgRc`C~6TImqW>^MPP?`$ZWMrTPGzF}j_gBy{Epj_ohbrGsK z!vU3sneup*>`z%PTVmr8Dt^08m)c3oBfkDnDWG=m#vFTq3M^~AQV+m}GzxenP@FA$ z39x0}3idwGqahrl;Ee2}+1%{Jd^N=iL)?9D3WOz1ij4QNGBX0-0Kp_$m{Une52HFD zs}L0br;yY5{`zwPwF8#GCQfu^yjM_L^b_d_Hag!~x=pwUtKPSSUV>A|V#tN1E3_@d z)DjTH)>iqi%^DyB&RN~ zd>&`gIGQR}aPvopY1UbqUj&d$3QnNofF4W_6aa!#Jp?J&1rm9REVXWxp3dASFW76CuhjO} zhSI!56VvR{lb1<}RDt$Qc?&QzMg~xRhm3BS#QvkpW*}xJUX#le^0*z%+SYx`F~jIp zhixpJN8UBf*B`&Wnyz~+=a@Ry1lx&7BBB=v=cDd>?`|tgyWh?J2bW>yKlkxbV05{Y z+>Gn=7tyRV!_H$bYUc@X41pLJg^CUuK``255lAx&;D~D3e<6S{u)bN?< zT}6dXn0R_6tb{4Fuh^K7vM{*9yh?_gz$8!F;dl-cO-*;)X^UNLz!*5WdQdpV1ST7- zvIRN^qi#Eq2%T7&yG-B#Drx1U{@OehANOBAjLBLP$V9u<#_?*!3V1eF!Zd|c1E@cA zz%7gsd4SpQaBo>WQdL01Vv%3&B-4)bMvbBBt?p`%o(q6$6^soh^4Wzrt?t_-+unv1 z%&JV>Tcg9Z_N5|EZ5AAABnqNyv_CeMl&Q3ZW0b@CZ=`v(;c#&@O{^5>d)e)k)0kk@ zj>A57T%OcJmeqQ%-->Zbp#48b|6q{D+7}Dzswks6t;de`%Zf`x{u)3M7 z_nAQiL3kd;Yb#i<){4}srT>dS*cRAS8gp^PvP%M07Ru~j;L@GTc{6IhsD-WT>zVpI zc`HMcZo9K^R~<;yA&cGuOWZ=oV{ZtY_=$FVWr+b?=WGb#tsA5Qj!6;!1i`V`leUjo zSH~U2SLdBxCQfV2SGRF%!fC?`Wyl``6Y0Y3JebJ5dFruCi-Os<&|R`=TDcWZAR80< znFxee=5V@Ks(g8kjUb{Ve_`|ty88K8t~QV)D;N%E>!}Gl<|eIG-;{z z9_~T@3^MF*U#a<1!AyItjaSOp^7|YV(Edu-v&iBa;;gP{Gp225p%jvw0G+9bn#yJ< zDi|)T1+mw_D?&#Yb~i2QPZ=nu2G8xcWtSm`src%&gMzCB?eG8#BXcH}Y7a+~SlpaD zoQ%}Qj8ihBRJ){>JiLN>rKhxOn#Hj7gVBb`e>`|5<65>Bj5R`<4NLu@5>1kMQz^+< zz;mwP4iktg(%~h0o&$D|e3dZB<+0-gsK z%6{kt&mo$1K9sfk^l@qA=9TYEpi9PYLc@gF6Ji-O4Bm7hl5MqA$k~y3#}=~;tnu$w z0w`q;>47{Vg~{ZuTgiV2jpF%#MIyG>owW#0 z)VVIDrHCHIPhnIknv*@IAyKW&Z$@7sl=F}ABLjYBkF*cPt`A8U^MO5OCg)KFOx%* zcJw#xI>tLYELSjpU*^q3A67}vVwbr%p?ZemwaY)HGV-KG zF7<-UiIv6IV7kgqno~qI+RbunKTLT7%h?+|EynV^w|p*aGQ8(Dd==Vzug}(KKi~kN zZFC>9cL`=R)%uN`7*1&y%9j80>!7l!Hlr1tBUun9c7r{CgoNb87C+4noXH+edK4eX zKGgS(!KG2;Xy*To+51xU7S6PIeFpPZ08zO7?7Hpo1)?QQKxq(Uu~qZRbL*GtTkQ7M zfDWI+i@2l3SYF2tK*KJJq0+`9t@D_XmYWUd#lsx02k$9ej_n2Zb=eZ9NRxJSZ7f*6Rc+->2g3_7A?CcgP=NnL zqsT#3du#KdNUNGer&VpfJav%R=AEditkuKy2Q=X3QpuiE9N9|-|5GE6M#2an{y|z+ zGLg!&HsUyP^GE5PBQ?aY4eL3cQBXzJ4@2-uYxy>|&e#5iBXWMAJXt=cBcGuCn1P;W z^ovAfAGQ~SQfXTiaBC_+>@rGGX}r0jw>VC5Af9LBcyQ?TmTGEy1*t7GNurL$I#yCS zdDfY3;+KlEJC2I>GGVcAy)#R-Mk=s%btQB-sWMNILas6C-?FM4CmNeIp;!YPMJ}eV zH>!Qpg=3$hs=Ifn_pOJ?Ti^lAtv88@)S}s*Q^wmhS=NiunoH;RY5czhEPeLVW8A-Tr(q=sQd3qtnm605pU_t@>npbbUe7ry zHvwStEvghqUsx(>WtMlyw;=Ezp?iCRW9C2G(aV-A6w#!NwJ#r{5PI_~KKBHCeQ|Tr zlbqsENO;YdvO~xG*4GizyUF-JR|75DM}RJmtfrShDtA2l&~8E2&4#=0Hm@kMwBR{+ z|MSwZ@4ow{+9Kn8`XyM5F}AP{ljYS9^`cs=Mumni(-CtRNll)~cs;IuV)d3 zBl)=N(*0(j`PKCtGkiC~YkZ3N?cBUd4P>C4NOp}O;hBpi{3=s~$Za*6K z_FSNto>>KgDIdhV@wf~}(Ok`t09KxT8|$UeqWb4kCxOu+E?A%SA^W+u?Q%dV8BaM( zUVw^yT4X;_@eMkYOuJmAZGE+YH#tc~WiIot?Qn3)Jt-YQAEH!)?LUvyL ziyBQ!zizfU(ZPWVXjq2$C~2k(+rbF*@b1-J*rWl27 zjI=J|-2ncP<(I_YCuk$#6@pX~0H`;RuR}h1G5nuj3yOl>?lo#37fd>)l%9sYOI>qU ztJo0{OYH<``2Y&9)Usj`P6LTmks%qged!X0m@{m4w^AgHp9Tq#9`AR-bX5m2cp3Q^ zcSMgN%LYZAFtHu=T7E;!;xG&_TsdU>}4_-wPn{)QAGQ%}SF9IBGt zlxHky@I(|6#FPZWXk;c_zOx5B-~&BdKNH#K4o^U?^>(>D@bo$@MKf_%34PGRKRGEV znxXHnPy1R{HM-{40f29HSIl)@9Lyf(;5d@GAdUc1H)GK&Zf!m1>?kp6vYVO5cA(gb6rSz{o*nyoPdbyr zh23@5qDlD&>5kN|AYJv3@@fZuTg#;WIP(48@ow#bu`y~3?b;;mMB-(AICtnfzT>#B zeGzIL&7sHpTAqve)wq(X4jmC41$2QyOU&Rn>+cDw-xPM|V{7g_aEP*(l(I-FINtB5uJjH>5+fMZC zujOyP(p$jmN%f3hbaj5}CM?p2;=EOt{>BaP*xq!Ps}|l6Sh)Z<<43{-V}ZsVZ7LJJ zyyI4Wtyv9<)CDuplSa9U6;13xX68;I7yW@3OqJn*g}OpqLBrV&(#9A)3o^`v!fPNF zm8UczpVvIYtsFQdlH*G3@Oa^-4}$QqT2S`~Yz5!o*39jbdLo(2J6VTL@UxNxeU`vpX>8_9E;kOtP3Zg;w` zsfy9lzhyM)a#inf2f*yh<{%-NG{$F*kZtt7Xwb;s=0mU!^BmMx!p{M9nsbVt7%qqs5yPr?B>1^3?@!Ci1%buN;eI@> z-3q|HVmO&008!m_8E!Mw7Crww9+`Ck8=A{Str5^Y@wwp9uxz)ZunfJjkWf1m-M?s# zjBzJkK-9t#!3{3<*AE_xsE0ahl0puQIBQ(?a$}1|sw4`FS7ImNv|-f6lE$>wjNC$NY(BWR>)kgK(A9ScNj6zs-eP>6BE(VFQhYa+i&|Xo2o%I zKO^{>NmA2I#3j&7^4vPPB$dd#XTP!BF%M>dHO_y5Nw3{kBYV}VIA-gYTA6qUMiCWp zE?(Ms$!y!-LXLqMz+={EW0qZ2Bjqx%zE5WWgmXTkgJZ{Wjt+>JnMp0Ze9neplA|Y8 z!#_{9yAINCDte;t0%yUE=br1zk{6WJq2Y?38;+^%Tv2W(ht*LEwjeJU-v1ISHzy;p z&peZcAL*)Z*p8)}_7pf z3*8MaLDCtQZ8y-ccFL984f;RW`Joakxgasl_5&9R;lNF~_iX$fV~f)z6>@)1r0!GU zE9!})=fyYtblFKRXijR}8tJ3YI;#|0#>X2nrf$a@DyT4)kPZ15(V&{Ahz^T#_+saP0D0lf(*g8Ytax z3J?E<*7z~>u_|V=FwgXL0V9iJU8soR@})KkX3ToUN)1HGLG5p)Q(OU zSV?GU=Dh82Q$#J_$7kKd2w~8GVdt)gal=L7wo#z|UDw~T(sI&I0Sk7jCA^a^=9#P& zPF|imA@!XfY@_u*r)?_dN2_R_pFEW*{1(qshy9>6$^4z4UiR))#+yMyOVir=TtQgJ zei6~)8p+nZnSagKraJ!#7`G}YFnekCnba$VT3p2Db^Wn%`!Wf0YjvV3wLL)RD*N3* z=X@YwI_PR8C<3ELIx^j;Z(kvV+m1*UL5dOscR^WMxY z@7U^9{ZLkA+R%WMBgquwAm2N$27^96|L8vGTVfaX}n~e zh*#&$0Gzg%xc0|Qd{)0YogI2mi#vd+o;@`-(}s0~tv^(?S*w%rG5ci;g{r_7`foD^ z-E$`j(sj)Kuc3qe@Uz>T3h&S&6&(h(5q~;rLfG(&kZFVHG2Q^-hlCQg=f4nl67gm zvVkr80D-OD$@V@=7p*|cGm~h_T~toC4=?>fwo{rTHoUK}cO9^eFOQjv@ih16oZ{d? z8kpqH{E|%!HwVh=(g@$&Z9Ok(C)>B``(V_t$-?)k{hf&GM_o-Tf(u}@Wq1CRq|Wka zj~};*%<2vNW-ooc(?X}&luxqmrm&G*oeao;Fw$6fM!V`9gSrz?<2QySUfAU(Ct|QZ zr`OxVzD-xfeWtykzNAqN&3`0vch7gdyy#$DW4Vwg{+|Tb5r1{ujirL zftA-mV$YvnVq+;I)VWAC<%c_;kH~DunfC*wo|lg3gtJAj0}{EEOZ0fqhSu9H&=T0Z z($vS19blLK?7{4qe&d#YXE8nX4t5lXXcy(yLhA5eR{ums@urK+X!y>78sLMyQ&zia zTve{Phx{HasWft{YlZwRK3Cq+?$2G=D}23RkGcP~dNTS#p68Nkd|s;v{qA8`T3`SG0n;V{8;M6Wa8n?f+&2mvaP`*v zPby$$WY67>g+?fOvBc+MeyX#w5AzA^FH+O`$D`>9onaCW?WToO_oT1=G!5(T-ysC@ zK2ice3NlEDh6YNM0!tG+6H}NknCjn%r0l2^x-3hf0g>HS$1h;A>~@i*Kk(g#EW4{@ zUg0G47A)~{FtceGtJC?6&(YEz;SWhCAlErHBiv-aTork+$j#{{c-gWz^tOzvIspV( zcGFvTA3$Ivv>li9r?(|oXD7psKspBK#fP9|r)D7^HOS?1-0Q(BWyAl==3~YBZn$w` zzOnR2l&rORr%HThtffMg9vMGHb@R%}`~n5qHgDlq}0`}VgYrcF+G?4@CZ0W zTxKy(K>9efWzHZ0B@w{jusVPtQUc|vD`_Z|SqhJ^nZ4Hn5xYlO4o~R-gW() zJbUo^>@r8e5c@tAzNYD3ey3o2v#`A!jR~_mFq4KeB#6G5lN-@2begj9P9D|zt4}n7wl;PR)hp?oM95|8cpKL9bWCng=D#IoW*=DKW;&q`)*jvE z3_N?Uk0hzRyAzvDd(6xSM z4Z;o zqPvRdqaQ{t;u&81q+5IR@KWK1KBKNwm&vpWlqwKXQH54krd~;Xh6+Hm-`bry!Z`JT zp6-N;J2U#APj##rNj?ioX$e`@tOS}AvQ>yJhy+H84;Uk**uXyN_Fg?LAFdRHLbdJ> zPwAiMo!rdlh^p#E-m~M#MRcZb01^dEZ$PMj3{{8NCx`0)Qe9#T*R|jREQv0592G6bVF#A50kF`WYS6!>RO|bl~T|w?`HK@ zrGLyy&{to*aPSL&ii2iJ3HCN(e#JeliB9t5?OipMKP6=)J4cW2e|mpB?6dm!>iUVD zFM2)j+|CS0pll}79~MNJToGhnMVhV9B*=j40D1GR+>c9TH-1H1M?u{$0s3&%a9h_d zF_3 zx;AU-!wr7v62r{!=*#am; z1j?0QvIQdY0!huN%U0DXBJza1_rn0yhhWiSU+_nen>kKH3-mi=IpR+$d4}}*GxMqS^0^cJ_756I=NoX|0=y|HZwUu`I{U-P(E6^Rz9}_%@H?s2K%4_B4~qv!9BxsKzQLt+xaIT(ISMA5qI5A zZ;kXn4+a;yXTX1V*9U3P((wXZ$QeAmU} zue^rZVoEbc^K0l5dx5=lW-7c03ol)kyXZgMcKSXZc0GjO@XV<)xt)5L6UDRVxJf_g z9GgSK^upXpbf_nbb#L>ZLgMN+UyFFb#Oio5R4)Wo@L5&{4FlO)U7JsTMnmYZr zh|>)18@*g1=8|-iwlt-H_|90z;J(t$h;C599NYcWiOaC`%aSh?bvRZBYUPdLR$M^e zi?Oy7|Nq(e);VKU7l<4#i4kbmzm8+LF1MTh4!!DA?8Hv`% zfgKun;HTFW%K20SwLiZNnorgF6|oQ)pI+2rVq{QprmxQs;2I4`_`JITwL}FSBJvH3 z_g^Zb^7D&G7ruf-zd!{CF6kQBdFx4`&l8ejNxY~^t*hPrDfg(W|8qJm$m>Co5lj=B zWS=l(w}vEM@Qzu_ppVfJ3QRH(>&Mi?Owui$6c#Nzocp|~DI4|R7m@gSI%BG?-cjA? zd+F{s*B3X$CAS`8dVkKtHqaSs)Wajhwvi5sp#R%g+v0nD*KXWqVm(X#+5Nx5C6|4T zNeR$f3IRl+E}V8-7We;winUQ$*+W0E|M2MpggG?L*0g4=iAG;fC;t{!ZcUv#6U_00 zyr97zUb_b7wNY3z4gBWnnhwf}Ggr1vU8sAF_T<#oy|vG3_X@%wqc?8x9(?Q@%@!TY zg3T@=cNkPS=Rq5{0#wjpj6aG*=@8UE2GT)81GoOGTr$iDZe~n>LtRIqyWa!!VZu*M z>-L#jrHo1h$Mwvdlu{oTRxxJB>^y~C`i8jXfpj#=V73!nGBX+~7>UW}SB|)QKtTf9 z21%CyJ3K5stKD2}NIBuZn~-RhK+uIi1XS%kn8a3)q#H?dOK={zQj;T_9mf`Sk@UTE z=CJyv&}u*2O-A?aXzBoIQ0hkCKxb_uHmdEu$fJiybG6A&z#PZ1F~Xr~HWw2+ne43c z@>~y?S(V!~m%q39TQ=RP8Fw}kJG)AJ{CtshRG0xen?Oefq^?8q5ncA5)j}Z>!M`~< zZN9UlJ+l%5qoJzv#Y2Fx(KlTkZtzDIRMz%jn-4z(zn>FrTEGb5mbS|%VadUB>;0bTgVRDRF(~JP6c53;71>AV zAuj2Z9X^Gl$f(p1oA=rbvM0jxyu0S(cMds(fRL2p9Flc8)xz_A@J*;N#4-Xyg5i;E zTaN^!U`sz72vGOT<{ax&m43b{)k6?cI!=3x*&zw=|I$RVYaJTSgCg*rAv414! z2__vhy?2iP?2RtP$?iNKPh!!v%ZrJ_GU?%&tU~ighs^n$nVvp8_hh0{pINnlx^UZv z+b};4FB6R9tw_=wJ(S7g`1LJ!Tubwd4UiCm=5LoLRD3u87~6R8FkfQDt6XQ{Zi{u# z-6;}DF_SdBM=N4f-{F`7P`n~jk!-1kt~s(V`O-XvVYN_7aitP^K)KR_+gK1EH4ayXY0Zl{6hjKDluYkIRmm7xF{bfEPTOYyt{<*GPo9a z+Zt&I*NQ@VgS!YJyPfI5dJy1X^EtXRs-)L`ZoXa$VnfJWRzipB8+r7hmz8KVK37;ayl*S+rHP5;$-fx zC7J?t3h|4b@xKlG5loOP@i+fHq`cVu%5pZtr6Ia7EXBnlzVblP^=Y@^c+2)D3nmxR zR@-NMUB!>IOjTMCeuL%y^*+>LC}qLeoa&Vh4O0xAY3K*FiVnwjWha)5_yO}0#3FS#T3Ra6)DBcA*bHo82HTKY4%|0r75iW zzFeXHOoL>>?-AN2yn*gu&dlo&zQsu{!E1AN_IQTkbowL>~vK2zpmi0c)(BGo&S+40{w5dSaBprlCFaw!xt zFHa+de*4BebNyQA33Simx>-4Xr7h}}0&jYPUyDyoPqhaF%JnIEP6#BUsM5eC3B&7{7`73etK>!#q#P@E`Hj+RPtDXwVD0M^_fK z7B|YI;7*!&>UHE6)_CJ6f6vF@{*-uX(EByuy<<@2$sBH`;m04Qo}j_|AKU}i?q-r9 zgmBkiOU)JLmOJ;r_4An+fY9B|J{6B@D+#q57+a)S!HD2(=ZzN|)XVCz1&Ue&L~fI_ z)N|(i&7{4Vqakdy^>+(vzQ1)alNyK=vx)dQIktvI(2@q)7K-2Wv7m(<;^7%V$u6Fe zGrksaEammn(6=AoH6kj^{_H9E5GWPObtnE7{=MNF*|)0#%!e|hRf}1LcpT0uc!So( zwaEW=$|7w@TX%`*ej_Fl6~HMl+AI6!hlww+8o zWqMDooGi&`$*SenX0>FLkn-A|=_xpKr^Lfk+G-7`aD+T|ee4JUw~hi2S9`_vRxgDw z0r0IAYU_|lV7*a&&#DITTFSdtgMr2CEsMtB28fYA!xs?oi|Lg5?3d8kcMYMlK zap()yixRb8S#-rkSDadQ{{8#3t;~ZDGYOQjQv7FZ!Sk!&YS;*fe8-;Jewzs|8{VHU zrQxpk5>oxjO4RnSFa)6_j1;T<%Tp8XxiTo_cYXoNBI6y}X$4Rq&=M`q457<*)DI~GHNeSr0!^TDsD6ix9wN@PL=Se=9Nh5+fg+(oUS2(oB&y;; z7`ateT^~;pbq4P;(Zg(Iso?9UXmnV8FrZ(D!92iz6j4w*C=o&AyLzKf1=0ubvCr}y z^3;mL?94oiF(a9&0e3Bk(zF5%Y!o-b$7S;WpGvx$sBdplv(<`{9DyaZ=dG&h^$}Ox zNR4+ji(p=G*vNLtc(3_qV+%Az#Q)^9OHjfqd^Db%3)N71Wh zpnF$6&9^orN^I<^>8z<%&l;AT%e0SGFPf{G*}Hyy`;hasWO$ak+QRN~s)`CZk+<2X zERPASZ<%saqT0ZfnY7llu;BsK@F+4eDj66Kv!-cHGOj_LXnNU(MWvR&Vo-E+(a3(@ zh6Q?6QIxWpJHa32u3rKo*s(^sSx?blN-huh03ZX2_Xuu*YXO%+`FEnDmkL9y9;Ph} zEDZd24~j&}n(DYPGAU5(<+@f zx@`M{R^c_d@{>BjrX8#nv5V}}<5XNkW15a#PD?86#%K*8#pMCllGx-rVUibRAA?aB zpRF>kwq?Zyztcgxx+lQz&L7=%vd7Ky901%C202Y^I-md ze+^Q-57~IP>Z864&xV!EV$UE?PHVb-_Tyw9TiAa^9$mxC8d@}skyA35d&qhba*wwc{Zi>5J)8dha^_IHaL|y8CPH z|IYOA^SYJjS2ypPH($I7K3e z;3KDo=6CZfVhayU?w!s*cI=8)-SdY|jo=6riC*OH0_XR}aM-CmtKHmxIxwpTcO0@O z2;*+pjL`)Fc3?ny-1WHh#n^b38`lR-FN+Q{7U=w{MIz))-=_8b1H?lY)`)swaM7~K zdvd7ZFmRyiW8z~t=zh6V#F;-KB9YW_F?y#=eKREsibP1!Oy2eSMT3Ln4z|lfVxWKh zrallYJ^qBrSgRf!T=d#q&-0T*{)mVEnfJp-y_UhA8UO?D@8z{3A<{(0-kl@)k$#oD zUf;Yd&B)HZi4JK9w<7P}d!QfL#28=78XY|Fo&rUpN{OM7uMIS31boc-I3pm)Y>ug} z_Z5jC^{f5sMp;Y8S&g7?U{v+QY_OLbo~TAa#1_^|2D+0ei1IBD9q0$o*(4u!gb(F@ zJa_$Ty}|c;_A{FIGe%WU4CQu%`H5r-UH<2g+_RHngw7?U5 zGi^en^mGp`Ngh92p(4kCff@gyj_mD_|Cr_Pl909=JYbAg7KNZG|q}Rw`srEbe-(0rvI@EtA)y+1M>QL?DEd-cD@Ch^#`Z z#+S0-42ERB$A`RSS4KuMycV|20k)M3+uGo^Nm1$wuwtQC#?T}Xna`f8k)(TD$A~i+ z>XGD?4EY1$jT|YWD-vh@L?I}A8hyd}Iy;MxiFSWW^^RT!aJN%z=BJAn17l#-#6Iw7 zIgJ|~XbGN$83Q61Q^61>^QuH)h)fop{q)M*U3WXOzmAs4kT6jdRB*Wf22U|q?^4>M z)2&g1EiLMuY}O8SwUfd0Se>Ok2WsmxKtp@AySD{ z5JPaei06<1iPWuAj`H^mfC0p3OvmO|@gpLq7UayKNY{GIM`2c0OYIS_WesGyN{#gN z_*WhuiU$O$u+$8aUJSmT)Hf;*`|~<|C5=uf=U_! zvUfHlaH>=Re-I>}@KLHt7?P5h+#K+T%}YLxEE}N<0qnQ=xBY(hd&(1h;dVnj6|ezp z*od>6!UG<^fbd3fV_kBfU_CZLr%B5LH=$Y@_8Eq%C86U87u;71UDbI(hc_Sfuk_to z5~Rv_kYTJ1E7?(d*(61q)bV_FH($$s*}^#$E7s*Fwkwte}-A+VSM%0<6WxqRlVa-%fLjzC{jmUB*) zgZe@Q^y&u~*aVLB29eU|0y!oZ9Lt_)x?uClDn=TQep3V~rv(Pk!525~avY7=4L1MS z#AYl7?(T7CPQ3zQv^AxVG1eG!7#v*6U@qMZHpQ)>;}bU<8Di21V)r;PRzC01LtZ`$ zbDF^JUEtR|7Cr`c?FObA?qJc2b8#lqr>5ro`Q}DqgS*e(QWI3{EQSb_DM{v3&+lDK zCko5zhn;UqZ3u=QK4wnwVj>{ci=|>$Sy+A`&OUUPxx1;{TqSPe-#0|LbKTuYvD+JM zJP^K)!SAk}@(x7oOLsKxi`}KsbB3{BljEUL&^GR`G0Yirw zFI5sCyKh6W35==$%0e{RDf=f-it)zOTVn>zxt2VMjl$*Ad0kjktay(Pl9W>Z^sTUR zLF5PGsje5UFS1%JL2xF5$}=ds z?{E(m$4j4@b#|4|EvuXYgDin*aP3-!fK7<1dTz81Gn&DWA|RRTgxZ{Xe+TR>}*j{lW<@eoOk5+LVq^@*AB~ zRivSmvV&6OUnp2oHhm!{Aw9!L=Xf=nYb+VhS~+Wf8Long%65CeJ&0d+XrY#`7r2tZ z@s6678M?<^n)YL2u>8s7Tw-_}pPm}P3SY8fePh;q}|S3rcTi+%6umz;6{HUxxZ@ zjXmrU`ft8IeoagImwplZGR4|as?eAI40od7!q*fIRgr%#nbc5@wvkn0`3frQ&)Usg zxQRsKe)?d(&is0D^}C??=8XPgL-GAY6|gBKL)+74Xcy|e7itw$E=dapN{7fw7UOtp zAT9nH^JT)H;^&D|?8$Xu<~s)aIj}#aEu~}fAdKU7-XzIP9pZ|yVGq1Bc$-@U!zpIRU8{#lFJCn!vUL1CYqwRk_* zr}m$|x9^C=5BZileD+MM4!AD9*GUS4VAenJu_a!I+|Pw#!2a- zsFvs{u=+G@Q#gE7O;qwLWi1B)IsboT1e@fdbq|O8%KuD}(g>2}Buj&f0|T=^3oX_) zY_)8&l2sUOGaXMDL(<36H<00PDrO&S2+fc0N|p6YOOp1%JsDv30r>t}#4(#mjr!L> z$uusavm-6CAa3ZJzT9{+d-`h2ZC1V0FC_|&C>FFaNc5U(wl9Z73QzuwEHxxa!GaH) zqL*vC0ldBInaPPU*V;b$RIFDPkkxeTscY0yBs@aBlZ81o(y(c9>$b>qA?%7?5UaWS z3atDP!t$SB6dOB@QK1#{aqd5-o*ed7|V0m}h3^$jfAv{~Pg37uME+b7I4qh4*%lExMnA(vtw=2CVY{aTbtO8|__yrW1>+jR%O>k50cwFUl}Q8OWd z=CN9kLGC?sV85VhvhpKM1cUw=hC+VP>B8fX7CahF^hlEX2nsfV$s}oco+a`%@!zEA z3SF{v8PURmOe&wpF+++7b$q3%JL-QKly^1Q%IRU?5~P?!Zk1&=9lJ%GYlg^o3j%_2 zzjBEEXA@^|YNmYr^Qdo=bv~=)MthzlO@>Wi6rwL#GJSrGsaHBM|5`smT1g<+2T*uD ziEagqOi;5xJXLo#xcO`P&UlGxFxF zC*h6nfTKV>HMYI)@2Ajw2uWpY5=(u{6uC%(BS+_1u{FdeiE#9FIEjJMKyQn;6<)oD zWKws)T{%>Zro>ZSUa4LdfD{)$XEP^jt3mlsHR`sF5Lpv+taRhL69K%UZwkKzh%5&h zmDxIBL7k~ikdqPN0FJ!2@l7+CkoU|t%yq+?MVrBHfPm6WUSk6*gYGV-Z?=?9=UmgO z7J)7OwsdS$X(c||%`Hsg?q@%zhs3FD2sVMyxN@(MHZZrQ&^;tr?a9E7z_}%%O^sj@ z*lW5&^X-$9gj6`Tpn~4Kag6N2Y>BQ926>MCVyk*!()icE=cblz^5*iqH>H+N4>?XT zx*1G9BBEINy}^cJXR&3R;Nn-!U?!D9YQ67M(H}q)Ug+rfL>VzhO$);3L2m<%6OD$& zfD7W^iKiON+XLFm8!fZEvcJs&ZrY2He$7>!G=nphKPx;XoG4FBv82~?9r9pZk#ONE zqU6?Y>rR{6Cnnmf^|rSsGWFH-uIOsj2ai7$^X?B#EOHmSFFv~`Q<=Hv>|*71o}Ku# zIB=bPyJCVa4BX@pp z&I^_NLXNRrrf|4aa^~2vCvQfmN9c0`P4;p%<{~3FL&fkPqVuIWBtp7wt|Y<9btXvW zu2mo9ut4(Bm{ee{t>|8-T*KcJ2lx#hTn~!}>EUbgNza;)4`7E>lZAD9Ip`{H zU)Nr)9pafN?6L6^=U>0OOd+Fk45XrWp?2S|i>hm2-w?fVrt?hS;{L&Yz~}?O&*58U zDT{xr<+{;icTmh}9A|A=8$#ecK5xFdom+p-&l%`^wd=z9c|bFc0FM+rkdtY?*v;CkDnJ!PYzfLhH&glf2Fg`S)K{(lejl5D_cL! zV5w?#b76sM5V5nH%~<*$`2XnYDry2LlysxPQC5KMO&VUhYRNDddDUcpKPPJ(=QM%N zuBtLs4Q`ybH=HwvTWEk;Mlg1c{nx97jtp5H*T%U1ahpMSKY$~6cJs^`cK6(5hCeN$?!~|8QL3!AvEnj08QxnmwIT_no-cZjKh* zpKi8KbDQ&-KI&wtV45R&*bN|Q>9OF8TzVP;))lMtMoqw(0D&N2Vw+76k~WkHrX7!r zSbqigH~?^_H5GgsyW4Q#!;yh;ru*j>U?*cl=l z7#20Xlv`%MwQPw3)gRsZn~DGP$qUyPAmTJ*YKlbT9=&^gIE>0jB4@pA{hemuu=2sf zGY<-q7}zkIY^H26v$#mmR3-X>1X2__i9FLvUO zEUKu8{q8b`NrKrPT~-Z0csbQJT!G6Wvc^Wu{xy+jf+lc5Fk3XA{phGhT{;g%b#)DZ zauEt1ik%}lli2fpm*rOfm*oVJ8~yKK%rOw<&{_o$f!ODC%migRZq}MD*Ew&_R!swqXraaPGqa5JASn9$E@s2ax zXyFT5-X&-(y1RXW!j}EkvP5qV%af?y=gUN`S@%n;--NYv)c5{8Q~RH6){D+5U=QYr z=&FYDAu1`Gbp+JN>2yAs zK-y4NK39SM5Ia9^K^t*|%M%Njt3o4g-^URc6x4+1U!8PU(M3G&k!)5}lCy#Hn+!PK z*$&T?%Q9In{r(z53uhc9mY*jo(-ra?IPZQfjUioGue z*`uT0xe*$Ep(H|H;^t>x*D0gBlg#`g%B{)OY;og(#cb=ge*;wsx*XAg1C8Rwi6zX` z&W6rZ=8_4J?qn{93%UwbN$CTz1u@s!Ty+iv^RT;KrNb+;H2A$ZHZBhbhKFy(K1lB5ogW6gg`){=#i^+0T29*ST#KD|0;EITWiCXVs2~v&N8N!+L!QF=Dn48n-)G0Qu*|Y4b*-#?(h$ zxLn--5t$Gg&MQBLedOKBd>OhHA$7JM$8TXO<$dD_lTj%PeuVHyPQT>w+2sF~deAHH zWPpA^)s$mralQY;FwUy*e}rQb81vfOi;d1207W3(G+PN*n}$D~ySB z9>JCQ!BBO~P!}T2-a-U&@%Oz2zUTby|b zI$$coBSODG3L%ID`eE-Kl)Mk4*Q@aIAp4^pfq)WOd-(94=P^kt|2ra+eXr_%)i!>FP9@eat z-F<~r?uIaWL3AH<5@(3gPq$ltZ{o>$7Ub!j*6=$~JyEAy2AXC>=^&!_N|$E`rYSGy z=lbXQ!-9{wB&Zih8NHSmiUJ|T14Fu)WB8C73R@$VIx*a-zFM>;HEKabw@Jyu_7S1= zgR|jQD~)a8k()#^calY=KmxQye^|kufBdOLW0yO8EffE`9L_>eMgA=aUAnu>#nPzhOszZ^aS z;QZ*`X_~vQ;Klq8^ZaJ27m_9hk6>8tE;9&9hO1p!FkQR+f;hF@w#4MU-J1Uv!ga~{ zv0r}P)1T{ryw!&`Nyl5KA=h#%L*c8tvaysE37KUcX$Q#K)ad+x*~hMYTTfv@HCmmQ zC>=?x2!S4H9_dk=VCrCFLC|J%E@^mb{CVPBqej`_+n|EpIY0eGyImg!*ChjMJAM$1^daevVkgl z^ed&_9C->OxwOXti37z}&LbcBBb&>rMzH%TVb}92B_pf7D?}!9ws*QLtEW3ln&z41 zw0JtDJ>9Y_@AT|15BJYAi;g}$)!cOYR80d-MOn)DGp-lMM~23EdG))K&LtPJ2@ODT{O_-H%+ObAKO&ldS{wF+>l$E==@{0NLDjDohGW9 z;IN&v_-s?Muf|`zzu@}*`quNY=^){#^ym@wPS>64-Me=8(=paufK63QQ(jWe}O7sZgmz2feB|9TzB~00|MY! zTJjjcxHzm@fN59vJ(qS|?zx$hLZPN)_uNv1QZ+|?qiWpBj-b;buDwV=mL+v0wqvM| zrTC}^?Gv{E3q+tFIx~uR_yf3niQ+uyq@YL`*-D&h!0wW$M7Kqnvwr(f*r7cpP_MG} zmzS{~3Q;n=SH5gT7SS)2qaBG-S0~w46ky$CnDEfq?QfL6Iu7ai;|tJMcYoII#ChV} z1GGsx!W?L8|%w`tQDlq7iG`!j^o_a9auBH9-Pf1>8`@GyvnBGvft|!$eqTM19?-sFHPAyYf?@MPMNS)JpO0q zOYxV##F23nNOgJr+6?w|`}wxx{n|$3l4N$u}kH&(tirc0S0y!S4BTC46~TC z%A+184~eG|pNpR-vd{eQz&YUCqa^yieGMD0lEpp3NG@v!5Fwyy9y>-#;~vVYaP}H| z)O{81b}7Ox(k_rYKmmIyF;Ah56v*nEHjp@#yp^D06U~!laY-!hk*t!z8ir(*XWcvu z!p>v#s`;X#d4kS3VN>Do;)axFaYmbSF4b5am+Di3AavL#JTzfb-@^>6?X7?2_xffi zii7&&ta8zRm0BJP5TIm?Qoii z(>PUPkm!fMk&(g5Yr7J$Gf)1xt)fd8Nr1y-EIK#nKJ zF9h0ySDNO=v|_al#r9!z$Xl_+1{^hU*ZW3yf?emK4c|{ol78-ErQHrD8Mxe>>bzY$ zQ>4S?{{tGnd_5fNIqTV(c3`9+&?le8%;N?Jxme2J1TSfG_GAat{JPh$^@ABn zO-$@_Iz)uZ*u(E#&HpKUbyqV#X09%HAbY``gQW+mRO~*M#Xru@!5Wy|8I z%#t)V_SDtro?+EFTiWzlhU(8E zpgI&1D7GJC?zFu(#1UH}#*y}@&S)8VYoGpmE3|ygozR^7?^mRRhd|gNS=bp39BlE_ zE@@h+f0P-bC%#J*RaWv6wubm5a|`5)K`o5~Z@LU5T}sgQ?12InCy@kkSF*Qv)88}R z!R0F?VQ!9sQPb!daCVZ(n7jh6N-a_={Qmpr;^$A_dL@vFIQ<4j_cxCy1W0Tsa*uwJ zRGAeqr+)SY2on+nnU}LIkx8>^GMKc+zf=K!XI&{zt~Rb0jZo`QDAl`|?B`YGqm`hF zDt-%?skGS!cE~*h4)OU0Bb9y*qb%gZi7D~aeN12T_xkl?%1<*r^9 zFDtxwiF2eI;AY(DOYozZ$9=5|)#_MreorwDb@V7x$fJ?|Ka0eML=zv-G%N7_3B?vT zyE@8k2T!QNC#J+x*LgWt>gPEnHU!&;(@3bzfB@2Iw2a!ojqMy` zGo`M~(ld$+9QM>W6+#IM)N@uYS=c*!dS!{-><(#d!pXwyv;=P#)Ierz+c2`QV@4_@ zD`agPTe)KKqWLpJXw>rGqjDxl| zRuoTJi;qY_O+}%@YKjQ*Wc?^(O>A4cdhtL{gE!=NnE9Rcxz3DG%AsWbxb;{I)xBz>e>LR!$- zK5Is4h=_65-{!k<(Bsd0bwr)Cfa5CHtZ2}UT$$2~ob-hTw!qgMg%z&{`ijbR$} z4*_`q2xJ4mD;uSS&p|4R&L{&Yi6k5VeE1g71J{+{fgS>+nkh-?5NrMT@#Jzu1f)NiYkT;}6A<~VRe_!gu>wlsUZ zO;FmoE-P(lO484c+DbF!NJWB*BDZ_*Z|JoTS~Bz~IfBtBPtY5nFnN0ovf+Z1kiUT= z=!~EkG^HnAqJ{%q0Iykgl}=(lou1Dk&YH-HL4d)xg`*jvC1<+}ttWf%1CbrYeLvStRbah;WfPd%&S>%x+{elZ@bsa0*xsqn#81fUD18 z*}_tlaWh?8%~?5o8*m)N^?e+IH0N>bb_wds<e>Z7g+DSZCZ)`-lfj{- zasb1m%scBU(kxgxj^ETbHF*_o6UKr$SryQ&Rzp0~_0hkdOT~GqSIhsXb zaNK;^*n(p|<0(T}OevbdoL8ZlGbP561vrH4IGNY|prMAIr{k6Cl-^&2ae?*T0S1$^ zb8vET^YHTV3kVj>@2(M1F>wh=DQOv5IeCM)vesfh2I^DCuU9FQDz!$d(;JK?Gs) z*&R-o+vD~5JuQS_1QLbDU~zZ?kwm6YX>Sq-Is^$n6ap)Msb-*0qd5#mMINy` z%@|D%*bzb=+96ysvTsf%%ECVgez2m5=9h12ja#q5->$P9sZ?wxAgr{B%>qc7R5mV~ zFrkbKskE_iIjLfDp-l4xxF~;bMzF2o+TY_rqI}Z-4={Lgn+qg|*QirRAxykg{oa$H zy(ng|=~N01>848ylAnkPE5eGC(S0<1ztqA+@oc z^>Ps~@wikMeP4;%2S>EA+y)_)Ha0E?Ai{()E~K(?xd18SLMmOJ37;qUy|n*L8zF?$ z{9WM+m89h{d4*Sa7$I5HTrLDM=~mC{G%?(|00|>mg8saiNWkO9V(67xKT_YG649 zChfV0AzYq!2)?}d7tMzO-FO5*5HP89tUU)fhQXiDn&+xjRPP8XO`gq zOM*5=2<9KQRTU_BMxzlGwv~WzSli+^Rdx{muj4olHX5bgJ*Oipw;IuWU-<$htl`jl zoclDNi72q66eA>=9iF!N?~LU|NW7k|L#vPF^*=UOKS~Cu~XrK zRb*R@Hu1ju=H7nn?yCzNgTGUzuf|lKFqwC5#%?l!k5GaXfH&C#Rd_yiB^On~3Vh{< zckBQiIHaXRkb=^!Z;Seh+FkYJV+-Brk$)|>=?e@D@O{8nNN{}I# z`4+R|t9N|?9J=m<0r1UrCji@ep>Guf29FyF&z}L{2hz9S`4$zIp-$k%IEpZxt1(e0 z8DM8CVwJ#m05;bP?MX?ep@-X04oNT#Td!<%^x8EI^X2-lAL%tNn|g!0pz9s=VE<4I zIKS=+FRTKn@%Ex#QvxcUc3eI zu=Cpw^_r$$skqjpclXKFtjc`}l2wvwOx4ly7;`9x11x4_EX|hm1{@g;#n>p0hGj!` z5JMO_1F*y62oU#xk_TyJVJb_>r<|oLQbv~Nxx!>=2z3fT5dshh-yt%p3k4XYFQA@k zfyFHk%N&F`V{HJc1vu_}fmo4QV<$#bwrk3uvwEE03E0TGrcP;?|ErUc9a9dPw|(3) zX(xCMHVEE3zbHeGlhUyYSb)t=3t+y1$g<6;0FI|6;PDvfJAgG>BQ_-Kf`FqdRF;aT z6mJct-Pk*wjDwcFEP=jzZ7T@4>sOS^^LBnH6c7OQDE&s;q(_tn zsP4X?x;#*Gh@$s$!0xi}8Oe!2+bSTwzw<*VqAE=k{whAmk7- z*Ub&EwkcemH3M)%dq4y%X`z%}u9*}Q8C>=}lsV}mFbCg&s*`vr-<=fE#El8(91$S7 zWT2KMv%%KR!IMxRLk7}L0o^kQra7JPn{KHL3E*lx zrdcpu8t-U0M;S|7eg8Iqbu)0SW?@3@q{NPZBBzb-r$BZFHih0doy(bN z3-V#fhEy_y5dZ@83o6J#d8aDKy(R(TXl$Yz85Y?yDKP?Qhi2Jwvt?*(MG}8xmhVJ! zZEi|iH(%G@JOE_Smxub(Ha~Udi61UI$Bo@YswOwRME;PJemmes(Qp{m2t3azcPo=O6 z$4(3~1t&4vOKj|-8iaG>Db>D|O09YQNlAV!)X>9S+-~_dOoPphHoYU7vf6KZK5P-3 zSAM)NQ^$8rt^+SLPGoX^YMOq_>;x}WD6=DNc0w=qy?V!N?cDEUlN~>I0OUpBY!Ku} z!|c>*huGv^(*w>D$0UThK-Q*i7GPC^XAT3Z)OA%VDRnMRK8(!ixx02t*Y>Ys*vtft z*4f7^oiny=hHc0fBJ)6Aha4Fd`95s*jzF!41s1u|{`Xrj=;DT5%^tmy;$u3rzCAa z#{k?LAoL8BZ_i)>gM|zhF;pBI4@>9kXNtRMxY1!2X|b$(c*!5S^r=&;5B zYYef*2y2Y7YbTi&lX|N4V9lJNpyue?C*+G48Md%2!B~|5>)ABkabpf{&2e{^ki#B< z%silA9+AUoHrX$pP2w(3c<|xe|Pu!Iv3)o57Ex;9COxN?7=Bqq)Cu zGgood6AB9#zR;>w>V^it>H>JrCb0OB6tyx3Gx51s@t z1v@)uC1@wGW_|So1n3N`IyVlgy0U&aTCDX(5_QE+dg*YBuO_Q)v~rM(anV!m$qm@W z-vD>MGbbZ{B#Ey|BRyix@brgG3zArX{Bv_7cuVXJTdvoU`o37I##rdb#Dt=HI6KfI zl7R2Qx@$erM+gzTz@CvzmaQ{ne6!zXXL)42?`WYg4tBK=plGL0ej^0nW4tR6;KgUI zGffQe9KT#Dp+(=!su3V;q><0FW`+@60DAcY2rgjSFG=Qw-s87p3tJU$#RxHrETgK@l1%n%?KaIYc%GB+f5rr5} z`BJoV1~u^{oKoGh1GMATkf%W%&24hdpoaLYGyzs0U1ylLAUtZikxX(cxO`}&%r>e5 zKl0SpVr-7>O}GHdD_w!ZO_yVdqDk^R3Q@XN__>}G=NWym$vWyGz9YSdid4EIKwiOM zPp6vuAC)YsLtD_S-p=$b>PNJAGEF2mWoZDgqie;}2<~54@J5}D=K!_!+3JFoeV(Q2 z(zt-2Jff_)iBW^Nk*0*=Jiwniwh5|71A8kz7Ds9eKS>%skT5#8N+jhRj%OGb*Yr7| zh3!hd(?{*-vg&T%9mmqHrmjb1AWfHtQAAHaw57jDM$JA^9Mci_w)(U@Y8R)8=CAf~ zn8y@t(=3^DvDp0 zWg)MR#wS{x=}S{|f%DbcOR71eB^9|lU>!m>higMTP`oITM$XDs+Q^3r*WUzp+Nyd( z_*CWimSS5Txp|Gl!w{`A+*{NNJ8Ob-5F6A4d?bxbxoI%xyW*gH?+DfbmFcGv+KWR2=8-=iN-z&Ul`gm~fJG!4kq1+-A1%K2Z^pP)_ zHUbX71n2%LslLEe7(zv(Z=^3Yppb~BAXIp4$fW}pW8-ig%^{OKEJ6QiyDj~r<6c2( zn*b&TAuzgM9MR2g#Fqm};^q0pW-ZASz6Ubx@HX818S(#HQatXppSj_ItJY1i(C3!N z)gC#=0{OGb*2244XT~o)D+7AfbF+FMsjhaW3Uv``D&sT!dg1gI2?E1XDep=mKSQ_YsJxZ#RW(`q;cD4g+% z#`RbT)=c>SX(7hnj9{_0sux-iW{$~wOTTaoBepsD{zNy|S8b1=?cBRWYh|qcAMF*q+-!U#*aEG(GzoG#h_IHx!#~k7f`bI^FBJU0H&7NmLYoEol zA6_W1$X2XzVO26YD-An%}e)5@#EP9ywUg?C)&y#Sv7F=Mv!}PUHxdVKe5r$j?a*RCRIkWq& z$yXxDJWlSuHy?wKBD{GjX-47|gvqiy2HEJUJ7&0luvO1K985_D?w5DciK^YZK<-lW z)LnJ7jaHR3Vw`4V1A(BzuPS#E`47-kDkn^4bZPndFU_=$6Zneb}J;rmg^G2j;gOa9_{<~v7Fe}4N_o&2N!}fh`1sy~?)i<$jFhwhv zjCOB(;2Vi^cgp8ZyEyLG7G0A07^O^t&)n2273z$M!f>QkxI!!*@aBHuEkq%F;Bzi+ z*f;TqbAA1XymvTkL!1&-6=Z$xH>A=OqWGY?BDdbUk_82TQV|BQOY~N`wIaJ^BzkV> zP42D+^TsQP2m|mai~h3xgY__W&qQ&FOI~*$p}9vTBA?CJ87t)+)z}_ip3)%lDEcR= zT*oxNz4_kzpP%;z@CpLRJ<**eK0W)#WF=QFz%HYb-wqhv8>Wm&L2aolO-A84>)=D5 zz7#_iu+<3LR+H{F7rpa6euztz-+jO}ob!EuD9cOAUMiLxCUVNM)L4bXFX{&8b(r{B zQ)B#A-Gb-PdnnC$ir_A=dv=$?%-{d8huV0!c*1A_XQ7i=@qnND;;(bkhJdG@KTE?ck#klS)pZ7t(s7UkSHe z_p6mMiDpl^dm2%HaoP@Z5xiB=-3u>&)e#5nx23jRd7=2~KQ9`k>G+>ag|b2xfg!j1 zOSbrE-nyeoNL9f1;w2~twpg>9&i)-u!*hO?i%`1j6K^EBgjoecQinA!>DIRh*6K$p z9}j^L_xg}>z;e}BzPTH8&)=m{QV9K6TX0L&(TBmG^Hv_&c|K3(%XOEgJ)qzD>{d&C z6??-QZ_4l|)?itvt1holj-{k}_ZknPo==^x;0Wk``e;Re3n4I@Fu; zUxHje8~s`>kegmQTG4GcHXEAF7X&GV{VVco&E>iLSW+~hR9*l7w;43vkvts#lRr1- zpEXH2{sc`em3FE&`EO0GJaIZ?{Ygar)-#$LZxpjX8`2VyymgRgQR+yR40o6pwbj)_Z9Hq>*r=v6knII z>hYRdF)4gQN_rMSzj{AZc=nffc0M^n_~P_`sZsl&WxKaVI~TekbhBS=6km;v z=HT`%BD3&%7Soe=i|B6Fwoi|zvX<3I3dHV9jZYeDZ@BSAFd!)R!|*$Xm9RBXp0d*< z*K4&Qd7K|aiSv?s)dQaAGhe(H00cq3p>!?R6@NL)Z!TXlS^bVXojK+`pSM3OJ}%Ip zk0h&Bi|*y(H{Vyuk&AG{vp0QrKChHWpnP<;$$z9eX5Dp%ZpjYdr=Q{!a$>puBPMbl$D#uNcTCT|*ctzLx%^mh$jTgFEr znv3$5nUCH6lXESrdCB9LNGN-Y$azmmkzMbU(*gXKWa&>KUVVE>))v>wO|{dd^IRD6 z;vb@>i7IjT+O|qvk+r@#))-x#p@~SklKjeuhF%eMsCi#-Fj!LBm;KkdQH^$25o?v9 zUiIbOGini@Gh6$_vKRm7Oiz|o5PdkmZEUKwu%Wo5=lWDZu%ax0va;}d$RrVdc8Wtu zI2iOJR>jiH1O2@M@#ZMPWi4#A^WV{Asq(2^IsSIjV|@$X3}qRM|6WE|hhMYGDMZ?K z`sVF9OQf^0lf`PkshsuOmm7bQidg#fwNF%zuEsx4(WU#=P0CPMEO{{Yl%|RMS-^ll ztyZQAuK)Pvgn=)R_C)5Y@)nivosp!N{_fX>WU+$Nw3sdIdb6ZtRh_jp(?={HK{@iJ z`$IM;NrXBv`q@w>&#vIsUDGH(`}pRTAEwM}AF~uRjg%X^GiQC=k!6D!%6E0qDrFB| z@Ek3|P2yPBlH-2JEZBiSB#to(MwoCs?0TA}%Qd0>Ju<(J zl8fmXbwnH(z8#7^``M~;%(SQHtt{MVbWus`V%Aa?NfqW8lfs))BiYxzx-K>Quv1Rf zmS)`hse2@M`}y;qM+_=jL^F|LiET!=_uDeEf7N)`{bS)dAH(=_CHkPEBOb5bvu;}Q zapu7H&GrI=ebChOeJ3R$g>Kv#Q-~!G(#xb3s6A98S-cK3L&^I_;(fEP>RD+nO0G>_ zCAx=8xC7+{DeE1N|NmNdO{q=EqO$WE;`w4$S7;QMx5{JLCg;|cLh{`#yE0jz>AAml zVq4o`a{z%lAi5~i#e+@*7~b!0ev|pkE&XU>V^;S&okk8TeK)OBYoey5ypNp4d1NXl z=4daw{><%x=pBzG_UG}R%6rtX7Kh%v0e|(Aj}Ig;iC%z_#m7@S{l|2~-8hjh6UqO& z)SORnuZ}sNx(M^vqfpdbpDV0INh=?Rr(zC$@=>Ltgry4P9ISm2gGA?{hPyQEgj6jT zOQx7&&QZOtV?cjm4N*bmusL{X`gkC@7L|PBBZV2@o(?fv<(Jc?roUpI7sp?(hEUv# zMXT47=auZaDm>!~;eG3oO*f6K+uYvb8@ff96)C)w!O{##1mV+*52*=ee_>!@xEd1+iEC_~tFxMW zpaCB$T#FXd3L@i39|tGpByPkXYKx6>6v+>w3SHnQL?+^0u4?IQtzl3u2Id~;!E{2C z!Xguk@<4TL$H?Qm+Fyp%rug9XjoGO*iKR(Pcdo7!JmfKdiza8^%3Dx~xDP&O-aRrq zJeU3<&c}<^HfD7AeVg8?gK+==xV6@aaL+;U*GxH1J0 z0H6E*aQruEo3P+FLWq2s*MQaf8yC-yaqY8i#)?`=qQJk(G#t6i%>^14OGDNFU$nFS zW<{#Mxl|3>!{1XxZW-%aPIZxFHA%J6$BwM?TzLn7UbFpK2*^qgb0o}*r3^XOUna|w zG?H8}o%hkYi=s9#)HD5iJu>EQia6!gA9QiC`x^jICby4*?X%nDwl7kycwjS`Z8-!q z*%gjEx@i!NB@p_7&m zS)oM2>c{G}3Ftw;yx!JfRQ8?A{YDJV$#8$iuyMIOs=Fd;d;T9a596_Id)RU=vNo=l zlVgm8PIfNy1v!4m?pZle^oV(PGE+zFInsi6x*r!s*Yn+E887DbfWjc$;B&3w1$g8w-^4TQ*$WK=;EauvU zZC>+Q&!wIE-_lo2N6)~>#4L@4m5p6`3w_@%88T(bmLr#2o_qxg2h5td>T@`J4p8y| zo{aki2-ZkpRvv* G2<`xUL{2yW literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Caligraphic-Regular.woff2 b/odoc.support/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75344a1f98e37e2c631e178065854c3a81fb842f GIT binary patch literal 6908 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 CFgb+) literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 b/odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..395f28beac23c7b0f7f3a1e714bd8dac253dd3bc GIT binary patch literal 11348 zcmV-aEUVLZPew8T0RR9104!7h4gdfE08HQj04x0f0RR9100000000000000000000 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 N{G!$%#QG2b002$N3<&@L literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Main-BoldItalic.woff2 b/odoc.support/fonts/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5931794de4a2a485fa70099bf2659b145976d043 GIT binary patch literal 16780 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Main-Italic.woff2 b/odoc.support/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b50920e138807f385d0b0359f4f0f09891f18406 GIT binary patch literal 16988 zcmV(>K-j-`Pew8T0RR91076^<4gdfE0E4su073x(0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Main-Regular.woff2 b/odoc.support/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eb24a7ba282b03d830fa6c63ee897d92a5188736 GIT binary patch literal 26272 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�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 bkH82T%!~T~dOL3iZSfI!+IWoKhyte*`46Vs literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Math-BoldItalic.woff2 b/odoc.support/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..59e91172b1399da056f33d144b5b378f9e2eba1d GIT binary patch literal 16399 zcmV+qK=8kJPew8T0RR9106-7`4gdfE0D43K06(+<0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Math-Italic.woff2 b/odoc.support/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a0df10a5263f9e2ca48a790f3da7941feb46cd82 GIT binary patch literal 16439 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 TZ|wZgDgW!det+QwP6h@5|JCx4 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 b/odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cfaa3bda59246b49e94298478d6de3b3208066c8 GIT binary patch literal 12216 zcmV;pFGtXKPew8T0RR91057-z4gdfE0AMHp054wv0RR9100000000000000000000 z00006U;u&)2wDl83=s$lfr?D$Qvo&tBm;wL3xRk51Rw>84hMp741qEmzf5I@7;GE> z-@x7*MOh-R-d(0&hfQyWlWSYq+9C>6daQjd5wv59|LwrqrN(m2Iz zjgG#xY->=qP+|u}aS$HIaj>INeoI=nnhxdsxp%{LEI0@pN**u;qJ4SJ5gPj>cX-<7 zzYC6|;y_A{Rzc(dZIq+L1~Gd&qo<217v+!IFE@2jfBTu+e&qI}is%3T-uLI)=Z+C- z*gBQQp^RXekNZ&0?8w@zpcKM&WayL*^KngtN zhj;7%9XKS@AxJ^#?AxNgqE=Tu`8fXnPnV`iSYvluZIT0q%Fji$;JZEIy{4EScmK!T z%zUlJK+;kOKyV2ES5y68x&0sCW_C;hJ%`_tTM_Y}<)VnKfl5Th8pj#(t<+$e{$-a=4?9%!CIie7vRu^>+F`vd_m> z3D&aPaMIPF8lrvt@BgvobJIn%0VmS(iEnYYw^Eb+8e_>JV#SO;-fdn0=VD#L z0N@8c27qnx&;S(}d=9~#c@^;eSibpZ$3$*}9l(p6*C1p+qprU5*F3QE1_1#2t1|!~ zVTv0eNf!lrJreatRTh%=rcySKdd-$tVcPv>%sCgT(hK-PJy-A4`)yy2vdgo1J}>1o z_f<+NNX`Gu>9Y&Z(dsxjQDaaCOH5wIlVX8+Zz4h~3k0hXjNL%PiWxo!Ad;4wTjewFG{t1^@xS zHyI(2tkaAzM2pUd0R1ttb!%iwN(k>wg11VOOxaJEJ4Ybb2(t`5(d(lD?mBuy-Qt0+ zi68jeW8VXuabgBZlB5d>LBt-qL6+db5E_RB30kD>NG3F{u0ju9-5^?i4GD?Ix~qxx zRugfz_1jj)t5~CqT>FxDX3Th>lJVk@ib&|00Kzv~A`aO>gs#S5int}5h%Na*ChKMP zJ4r)nns=XKim;Q*j-cEU6m^ueD=HxIiScLQLMUBp_<|vAtucLYgn|X>ky}K{D8^-E z05ynu=s_kk`N%Xw+>Fw?K3X$krlyF(O3b;zF{r94(c!rv;aYcO%rvY%5y}6VaU{pk zM6_&LzoEjGv*NS^y>}L6WfMV+&N4DV7AFIM#~9(UEHeUv)@ZX#F+kFI zKD!H4+VY;&@K#p@eRbRu8v|=o{Iz+lL4!D{AX2#us-TcmS47>Tj)sQb&-!0 zdW{t#;zhOUe{OiRI*ku7$XFsiC=+wcTNfml>0K+)?zPS+K!UrT9W9ZJLW~Ij1ze)` z?3Niv;Wu2a2wjCl^xzEAD=tuJkA_AOJz|S8%_8YljO87h(4WdZC2t`|0g{Z{w9DJ) zy3(UVGPo28h|673Y#R}3hN5ulSg@NUxWK}Cgmwf(e36ssG@`x{w_wPKaHgfl`>Con z1bYm373(NqOQG;2(u`C#D?pTV=peEl8c}BPz`182E zF%XSzjEphbBk3X&YDv0m<<`mJ6PHnj1c*sSITHxQ5f~{5f|LYBD#Ac&f*}oIqIiNM zEn$tZLTqnKtS;|ZK~Cr+Qs|ItYbcR9f6tm+Vs`#LV0<0({-ZQSEl)F-nCuK&vzt(erDZ!MPuAl(4 znH_0Ln31HOeXFcAM^66CO#D&rZG}k95+iNb_N~)Ub(tpn_NW{9B=zW2jEW9=eg>hC zBXgYzWGCRRQT0t`k~8Pk#9DKchsix6U0TR#&C7TGi8+8{7Q zitS?D(poD4_CO)-Vwf2+6108ub;c|Z$S5Cl)PG!;-V;}R`^W)c~uZJ+7)TSj1sch%vM1*IozN}DN7+qQt})j!-GlN!5~@$ATA+RK+z;VqT2#F zc94)5#wbNdikWzcCrEai*a#R992m&0=M>?sOoLNY*c^pulu4kdVe63G&Mj4hVAC zj`K+b1&YfMP6+X-ITqkoICBK$

uJ`Rl(T>WUyh(#Il^}b(;p^jcl4C!H=Wktd|_LD8=O1B zj`)fCX-8idj-LzkAE7uNhIqp1!IMspy7&Y8&=Nn?h?cq_w9EyecEscBcmhB%4(`q%1dweo1+K0< zf&l^L!mk*X4fDgSrGM1V1;~nIh3= zsDo~)JdSTnpt!+gtFb8LN{!bj#FRkIOEC!a?93dF*r}38jTw?~Dp#uGS@@>ROjmLa zooX@2WD<^4Dlscaky<6;7^G6Io`;L%$=bMhT_&B)XGhD$0=YsiS133P4qC-QtONeX zM*bjlHl4SuTOcUr4>%)}5|a{9RMV?z>Aj#_oS9h~=}kK;G@)e?hCc@shRr`ib?jeH zY1{!-1#0XM+f~{8REp29qEwEl59r7ff#M%pB@ve&t@%0=-nAoQ$sKKxq#zX9OL4Q= zDguO+!`3cKF~qqPFI;OusF+D!a}3Ls zKqz{k(J-|iL7321gb0QTOxjZ$`k2%KgqS7lT@O_l+9~}#g6MHV{~>gu67{Uc_#CuE z(SwAYv+42(l+0wR972+!d5d@Ihf|Y}O|F#YuD<6=M#Ts#c_J4IDl8B}!w#MWBMl67V)zhYw`JRk89lH|8m75bcXjot5`I{?i(Pf) z*yRBt)AP_B(_t?wxwDX}&U7#a^VL8uD+f)wF+v3HifE@BAj8fWAZzpU282GXdM;c?x`gPQsmq+P)4am zkj$L{oEz*Q?I73n_E}F&!(<_9*o_>GT6f5?|0~zv9}y+VzvmBob~AiBBXkQFwjzWx zcZAM>uqDzF@L~CleWvDNXdpzWED|a@V)H1REd|grToS=%yIjd-!x9r&A(KZT5JsjW zts7h0EvrhVv3wd%>*=E+gN;0hC>1Ky$g@eXDTnV#LVsVQvy*gs*mmSI@Jy*9LA*c; z%6hp&7ZCQxKJy3#GhgBEg=bVR`K&;FFqrWA0|E83VkN1N$uLPH%?1clpDWx^ z=}KqwXQDtKjM<)fm)`<}?s0_CJNk?npNF(5jR{9Y;!_NQYj;#f5frr|?#Us{|bj2#XtXA#yFuv|5uusCt#JX zDJy{Lt^KN^Xw>A^#C^XXVL;tEf92fGrbUEepj7+l>$E7-x?E+mgn3IWm6c}LmW2Cx z#z2Ipmk9%$On}1JR=LWO?Mz zfV;9P9~@EM5JI$zzphKrUbq&+U|L6d1CvQhS363{0nNNwuF)o)Bnn~c`as3)1K%Rt zZj+fKR|fW!!TmXZ`9GDfnLj^~s`~x_fz6cAlZ%B@(^zL!&Pn6L6TRrMHzf6VY^eUv z$UCSt>)41a?b6IC79>LGwz&+SwqFfo5k(^5Rs1i9?w?Q1_`b{?+|7mj;SC5uQ!fo zNLYC%1bm+4@Mi||jW2VYXR+cmT-a3h&`7b)EoWbxi@dQW;bFodzTMEc{{G7UAy5Zw zdM~`o#mB$kk_)$(j5DD44{Xc{@c=sBjq&5Eg_BoQTxY3vsscZ~C12b8g78Kn)py?& zUvtb&_orGrW2)j8-yvZ4GW|zTwp8gxLUn}~b}p6HTP+BJgyNly^bFIudO4FJN)n1A zQ{T(cD%P-hH{RX9HgAQ2K3fbn$?p{7O~ua1q|rF1U@ssK-w`T?=K`&$KjXY8I_6;` zQ8ak9Nd7@SuEo0~Qghvqr~J*Ix2m9>k{50~hhf|ffDG!I53jb7kCclOR|Y;b0(Zvb z+K+-s^hndIR&l7VMIUAmFQZj}mDEdY)T(O3rYsveQ8Z=c5uuy|8jv%RX2Fy&& z84K9u_Dd|HL1OXr^b_^C<eQuGoraK3 zoMT-S%bnA1PK^)1{QhzZEAA$|TduJcl>}Sv&Pe4_S1jrix4F+LNj*G4kc5cIv$uD> z<9_wf^fKOt5GnvlAvBEz78iTTk<7|UQ>qN|XifS4TS9=6< zrQ9VJ7MQc@jkP74ehP1`4jku6FryuE0A#fQ%1V2dOdkA{BDhL8q3F!s=g@6TQ$?Kb zCYen&aHo};%c|OWGP;{IIc5Xv{Pbi~PcZr8O{~b<{VV94n|Y{{lqtTiV}2+0qZ?o; z9)d?IgsEFF#|N5Onu<;;n~jEq^R+RG(X2BjxJl=ON+-9OxFK(gsta}1%T!+)-hvr< zrh4ww=R&M4l?0#<)Y7tc@2q6O3&}f2lou#!MKJCBf#Rt5=E4kYSUdD5f1Qra432Zj zOVK_ST05h0&`+z?;-t`G43RQmrS%|ldJUdy1S(Klo+oyC+dwY8@ve?m-PI_D)b>f$ zS;xr%+-k|podhy09rl^T>5<>TpSkh!!Voi*m5&;!h~x>2c2(!6df8kRt4}sA+7!pBHaXs97gcFy2snx!IWG=QEhrc z6N?kqg^EZBCm(^1il>D?9_Bm4zT;M0TUD;0$PhyGXE$HmJ4qoAOi>I*LrI!FVevau zwlk7aKOpzfY7^+aONbzXWT7Dwu3@tR#R&^elS&1q-dWLoRt-G{LR@MZIunB5kTt(^ z;)`oAJFI1JEM?gn+98c%zsVKbsPx73-L}7+CO<{~9i5{+Pbem|ZZWDgSu_>dJa|ij zLWIDzgo}DDJAvPUwy9fUu(4jv0NcS^9$|2}v~hoOy?LD#>#Tvjw>4hDAnnnzO1e+y z7G(ug-Sz=y_WsKx_uEE3=O*sKpDFjEJm?WvBU;pQS)A0dTj#j;k+9yL~ zJAGEay6Dv(+dRV5J7yyo!>XJ*JTbH7$F|d^pO(f`^{tL-y-bA&^mG`-9GmxEJK9Dq zGneDM&j;(98ncryx|g>5X(ii_p@Nd)KKI>wgwegpw%@TvHVZe595_?OU9ZSY`lFpp z&+pM{Kc*MYR6njQO0AWmn;#)`$Is=t8(@{=p^ED^&epSsTfnuN>&W_)4F{mrH<1+?{8IOx zX#5>GtzHKCp9u4jHruKU|Hkc;?o-Q#bS^l5&E|ut`=Ok~6wyvOPdULK^C5!sV#xSv z>8nNq_66fvvDBxdQ%qD9Wu%D;qFh4Trt{0$R>Fsy9x+69eD9uNP2EXU|%ecz8+Bl^YZ?5Zi zY=PM8DTNCPw8M#eLbs*6!XHw}TtDJ_K%@Sr9yG{mNj^YseI2(9EGNmle571Z!@m!# z6oiBe0Bqh07vuv;5dTbD$Zr}cZ8v_f?QH?V4jNJ{xYv)*DN)AG;RysgfBg?Q0t*lQ zdE@)>fUo27A@xtJ_yb;nR3~9G>jXaQUkEDdf=oE$V3S{P3WAU2Ld+Kd8LxjIg{o>} z=_w8DdkoLbo_YS@xUc@%`h(XXA?mvnw5_c9@2Q=ayk~B49`m($y|lN*_ZUq%1a&VI^t2T!KKy>N zRL!t?UfkGOZQCCuaOj_&>kND*WqW(qgAjPfsLh(a`&@73osYWXe#~cu%=GV7i4AaB zZ-`s2%%{Ig?f7#&)ev7+QrR{f#(!j1X+|w+vStYG{3v24)g_;oD}T)M72U{=Fa2eh zWk^2FjyQgYV*THuT?HGCtkr!xv}Z{7{gKrhAYe3fBaDZe#)!w4wPY_l^f2c8T4ywD z>>z%-?}iPe<_?1dW?WrzAS+|Z;j0J}yLnlnmc{i-8IWQWa*os7X?0MoT?P#sz^HMV z_GV6V>2nRQJf>|J=2>_RaYRdr$@^^2VL5*)1;$;wiRIe(hl$<0jQ&!!8|?8>)E_1tw--iCK*83E8hUM zS6fGivki%!dy$Z~OAh=vRLS$Y^olsWi|2(Zap0GCiqH!Dtt9Qq@Ne5?;ucH&Pd~vI za%Cbyw~&ssA;NE0IheK@!fLH}6f1u(Bh_zZN4)H~N-vvHKk5EWlD0f|=?=$-UPZ}R zQQ)5)-t@h$fp&DAng*CQYNUyHEm1C^AG-uhV_Y)*$X)*YE2l7zGGV8Yh&-rxhii%`RauaVg8k6b zWfU0#BF_fbVDxU21y1jV~_zgBU;ZdE4jcx4wqo!Q~w#54Z zlZ+Z^BA1|zl!M(0lAfj|>_-r%?8Y=*^pk5i!zI#IBlyE%b8JC>C{~;v@rc4oRA2k5 zCE-+M0@Ncd4@bp)BU8`s#sdqxQN~1wZWTXmJ#}_|CK8m&ozva?Bzol37Xw+GxU*N@ z`n;vuS-P5x?6#_gWw-e2`!+8rc|C*0qUt6Va>YTNN94>^Fv8cb$Ja{I3R5#(d~8gAZYB{PUefiTzEBe`sAYkmHkH z)y14b5p_2LhO z0GoF05EX?Nf%|SdaU~NFM{`x^Zp`oH`1mr?nT(o>Q-F1QmmW zHeO(Z@%v0`&TrXO2Qsfyjuf23I+ag8SX7sBx}&hufC*&*KizUaw0O3<-N9_d2i(eE z|7{#v(Q2)FcTIkPlkY8i{P+>X!ecVt#Q$v8}}c$Q*>*bDaCU2XA%X>LRFQw z|4w(*B(cJBCWrNtd1s%%-QDEl$+4^(zXs zmZ_YsUnkjl_ss1`cRm&3G-I-nn#g~}dpjIvZ1C#{)Vrg9kC=c3pP`IbMFd-*=S)A* zwenP;ed}@k{Vh>%o|40Ko4R(jZGrzRl|U$$9SVZ$6D4Dxwkl_qibOlMFZ;7#q|1NT zhOamXW}YMSUTy7!9~`*9hyei@Jsj;hR(a+AR&N^lvjj_Bwq$n21+aYiS_YX6O>`wl zmo8g%dDSI}m?^{#=fg0;SAL;qN7Kn~zoCb|lfx2{fFJs~a!J)*(8Nn= zBmLX&jm4w}Lh|sh5B`XCe@)dkty{_^j+wPtTJzY4v975mBGJj3nEaYyiaPy`+H2J| zk_|{5HHC@Wpvo`=jO3w^X~AltC@ob8I#yKI93qV%>c@QgDe9LehT1tQC8xdRiC^d` z%(c&PTXtYyce=?{8>Yo{j1<;_y6CJnzClkL=$Dr&J+{(3VZW#ao#Wk5+M z#iZm%2%ab2u+R3^KAq;|$;c{Ao_Uj= ze2A5R>8%gETGKqAncbpy#Uhw&HL|DYt$AqN$=J@r!hDdY`rJ0YGGRDh7@yyD=o)a^WllD4w^2A2OFb;mpve`&o?M+39q5lMv}DD)!@;y>?D%0t z?Z7c`9Nl4coGM6GKl>W%P+47)ZCyN3fw|{CKY{XP@34F+^}cU1%(`PS5&NfaCVCbR zFh$9$o|1p`&D76E*^xkrD(|CXMcHTm3)rlI|IXk(c2L#UMzNPF%j#^&bg*&#Jw*tm zD_C%7?K1~7b2)2F8-J}hZ=?=%lmt!1xbf>ZPYdB`)XzW2RdL2B^@k?gU=G5pamRv1 z^#S{u&XlimW1NloX&EW@x>v7#|002>&Xv_AS`}G2jk?GFPX#oCU{hV|ca;}qgwg(9 z6E5@HQQD@iCu2gI?<;isD>qeVdpUQF$l`Gw-ube_8vlq)#cD6&_7}v`R}K>uNe!h5 zzoUB^mJmyYy#|aPQMwf}kwWZ7qUpk<1PP-~CzXL*dt@ww>Rz?1?4qFjttrRwx*eEN zw^mnVtabg~k-KUbJE){_!DM~=tzhDD*TdjgG+k&<``$m z_KIx#$H9gvPBSk>D3gT>%*sMUh{%`a-q?x1q> zsE)gzIcFF#j>lDD7oJNLU_F~mdjnCAZ~n=FdU=bgCxgvR)=bJ9Q^z`@iAmAGUQ^FT zh9sRNZGSHbvW7ihWt?%4-ff<87ury!onsWeW}k3K>lFcD$V?SdBU zT6HxeEw{wUfBo~KS-w1zRe89>Cf(JL1d^zLs*k~wGf zj+aR72lBWpIs=|L2Lk?O66okg66n>_#Mw)-Do7$uVwq6z77c}%uFW)gd)HG9O4&!ST8~B`aedc}GNCNQ+>?z1V-h^bV zt6Aq#G@9OM(1HAN)J*t{!)ybAd6>w~%Is>S60JnKj$Rso6`UV1Y9w|4z~un%*ec zBD<(?aqw|t=asHh$-|$u9z)?b2nEn1W4tHM5B$#H1u)nOF>nN*SVpp4X7m_VJ13-4 zg#8Ay8G#%v@N03ZN3}$AruUUe9^B%95VLv5RO$y0OF)IY8oe2&x@~*;qPv7>0yBzz zZi7(SPCf0((^q^w4E}wb8!HmG+Ae+2h=hhOe&!~z> z_1f#UUC|UzW{=nb<3_stc9ts=8`-;lZPa6&QBb>0H?1<;(0OzeLYpC-6_jdEoB#^D`0*z&oq+ zCN&p%Egf2@2TRUY$0A{euQ9%tTj^s1MhrNtW%G$DE`V25!I&cMPzpAci_)_@wAe&Z32cz20Bg>sr6lU5FtU_pq_7}w zUdm^|O@>mWBs>%-XM$Rwawr~i%#p-_KE`*NH7bm=FgWBZOi9xMG|~eX%rH~I!vPJSVmer0~aYV#zE;O#DS0nFqw-+2rcYeQb?~}E;@Mg zo>a30Q<*e8&|yP2l*J%{RFW|sPIGWpo~lgzNP<+x`Uu##hAm=|WK)wI~ShjNPYV+1Z|6^Sd{2c&r zFaXxBPK>JSiVF#E&|+`uE%6tpodz8y{Poq)9T+G(Q`^r|W>m)jo|Y#iPLVvM%+OYj zztsen{eytp1O&Nkl~4>eu!B}i!|sBhWRrP&F@^g+B=t4aV^@1qGOrQbE}Gt-j;07y zwi$c<6UKtFy}fQ+CFizB8nS_s1c>G`RVM&(Y%&ewYMLk2psXye%zEMjco=All9n%- z#9CAS2l0sjO`1h+{L}zoPkes~OXOW%T5AWXTY(agk_L~BaeMB4V)l{BweI{vSzm}_ zDy$~&X;4<@FQBZxdcb+_X1=r)kFdjBniptC+RTRQeLoARlL5K$_RDECAh)I^rkm~3 z8$C<10}P%_sEll@bvD6qwT^Imywoi~FT#&A18G(R0)>U{XPz8y1 zXB7;0wF(jTY!xaY!YT$|GEQS#RlFL2mV7OryM4iL(2&JO^jM(V7*c|EiENx4Uz;g8 zVv1Ii0y>StctAr;OX%cw%eFuYocr0aQHv>V$l#)~v?2m+T6NHDzr~6!sPJnviyiVP zOQ*ZMi_f6GHV$$AfH8l>0-Xe6=X;+lBtlDacsvlPT9OLxprP0eXCFMaaMvRqXEUgK zX&#U*ivUkEgPlvF>epop3B%@?$Y$;OwMx@%A@igg(&j(Om3Tk#{4W(c+y^=z>**bea`n(V9&rko|US|m)5J_~KM+@*`Ol37}G&|tH$ z??@950jGTJsCN0<z(I{S3PO5uOsC866l1 G>;nKVNojrn literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_SansSerif-Italic.woff2 b/odoc.support/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..349c06dc609f896392fd5bc8b364d3bc3efc9330 GIT binary patch literal 12028 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 GG{*pT{>~Tx literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Script-Regular.woff2 b/odoc.support/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3048fc115681ee6c1bc86b0aa158cfbbf59daa3 GIT binary patch literal 9644 zcmV;dB~#jWPew8T0RR91041yd4gdfE06`=G03}%f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Size1-Regular.woff2 b/odoc.support/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5a8462fbfe2c39a7c1857b9e296e62500a8a8a5 GIT binary patch literal 5468 zcmV-i6{G5RPew8T0RR9102N#S4gdfE059|a02KrP0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Size4-Regular.woff2 b/odoc.support/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..680c13085076a2f6c5a7e695935ec3f21cddb65f GIT binary patch literal 4928 zcmV-G6Tj?tPew8T0RR91024p}4gdfE04S^g021l|0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/KaTeX_Typewriter-Regular.woff2 b/odoc.support/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..771f1af705f5cef5f578b3a1e7d8eff66f9b76b0 GIT binary patch literal 13568 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 G0ssIW6LIfZMgH#8J91MXV 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/fira-mono-v14-latin-regular.woff2 b/odoc.support/fonts/fira-mono-v14-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..edc71a868ab6867ccab1e3b3b772033909548799 GIT binary patch literal 16284 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%0D3brVzzkM-$VsXg*t!-%f< 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 S=daF)={K-yhxDBb0002=D`A}g literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/fira-sans-v17-latin-500.woff2 b/odoc.support/fonts/fira-sans-v17-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..24bb8f45f89f43e11b1e6589de9f6fa9f0175e94 GIT binary patch literal 24020 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/fira-sans-v17-latin-700italic.woff2 b/odoc.support/fonts/fira-sans-v17-latin-700italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bdf8f5f9844d5d875b915e68ff4b4965df337049 GIT binary patch literal 26072 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/fira-sans-v17-latin-italic.woff2 b/odoc.support/fonts/fira-sans-v17-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f4c80d3ecfda697016ff6053aed8b95e8b5a9922 GIT binary patch literal 24935 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/fira-sans-v17-latin-regular.woff2 b/odoc.support/fonts/fira-sans-v17-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4a6f782c8da68f16a64bdfbb850fe556c1c6e4a9 GIT binary patch literal 23879 zcmV)9K*hgzPew8T0RR9109{A`5dZ)H0P++709@n%0RR9100000000000000000000 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 aptAhGhW^k09BI<$G1rh^$>tR#odW<#crR)I literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/noticia-text-v15-latin-700.woff2 b/odoc.support/fonts/noticia-text-v15-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..536fbe1d005304c1b8f08b422b198e0a4009398f GIT binary patch literal 21972 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 literal 0 HcmV?d00001 diff --git a/odoc.support/fonts/noticia-text-v15-latin-italic.woff2 b/odoc.support/fonts/noticia-text-v15-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9b83b0712894271751c61c2129c16baa44222e3a GIT binary patch literal 17356 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 P&>NsQ4M7L++xr0k%F9lN literal 0 HcmV?d00001 diff --git a/odoc.support/highlight.pack.js b/odoc.support/highlight.pack.js new file mode 100644 index 000000000..7d1bcd04e --- /dev/null +++ b/odoc.support/highlight.pack.js @@ -0,0 +1,634 @@ +/*! + Highlight.js v11.7.0 (git: 82688fad18) + (c) 2006-2022 undefined and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";var e={exports:{}};function t(e){ +return e instanceof Map?e.clear=e.delete=e.set=()=>{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] +;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} +e.exports=t,e.exports.default=t;class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} +const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" +;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ +const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} +closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const a=(e={})=>{const t={children:[]} +;return Object.assign(t,e),t};class c{constructor(){ +this.rootNode=a(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t=a({scope:e}) +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} +function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} +function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} +function b(e){return RegExp(e.toString()+"|").exec("").length-1} +const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} +r+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], +"("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} +const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, +contains:[]},n);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, +NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, +contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function B(e,t){ +Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function H(e,t){ +void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},C=["of","and","for","in","not","or","if","then","parent","list","value"] +;function $(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ +return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) +},G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) +;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ +function t(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s +;if(s.isCompiled)return a +;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), +s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null +;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), +c=s.keywords.$pattern, +delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), +s.end&&(a.endRe=t(a.end)), +a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), +s.illegal&&(a.illegalRe=t(s.illegal)), +s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ +starts:e.starts?r(e.starts):null +}):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) +})),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ +return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ +const i=Object.create(null),r=Object.create(null),s=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let g={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function b(e){ +return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) +;const o=s.result?s.result:E(s.language,s.code,n) +;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ +const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) +;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" +;for(;t;){n+=S.substring(e,t.index) +;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ +const[e,i]=s +;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ +const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] +;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i +;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ +if(!i[N.subLanguage])return void M.addText(S) +;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top +}else e=x(S,N.subLanguage.length?N.subLanguage:null) +;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) +})():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ +if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] +;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ +value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) +;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ +return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N +;N.endScope&&N.endScope._wrap?(d(), +M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), +u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), +d(),s.excludeEnd&&(S=n));do{ +N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent +}while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} +let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 +;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ +if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=m.rule,t}return 1} +if(m=s,"begin"===s.type)return(e=>{ +const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] +;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) +;return i.skip?S+=t:(i.excludeBegin&&(S+=t), +d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) +;if("illegal"===s.type&&!r){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') +;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} +if("illegal"===s.type&&""===a)return 1 +;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=a,a.length}const y=O(e) +;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] +;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ +for(N.matcher.considerAll();;){ +A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j +;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) +;j=e.index+n} +return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ +language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, +context:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} +;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ +const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} +;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) +;r.unshift(n);const s=r.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 +;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o +;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return +;if(k("before:highlightElement",{el:e,language:n +}),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,s.language),e.result={language:s.language,re:s.relevance, +relevance:s.relevance},s.secondBest&&(e.secondBest={ +language:s.secondBest.language,relevance:s.secondBest.relevance +}),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ +"loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 +}function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} +function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +r[e.toLowerCase()]=t}))}function N(e){const t=O(e) +;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, +highlightElement:w, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, +initHighlighting:()=>{ +_(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +_(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!o)throw t;K(t),r=c} +r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete i[e] +;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, +listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, +autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} +}),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 +},t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, +anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) +;return Object.assign(t,A),t})({});return te}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `reasonml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",s="("+["||","++","**","+.","*","/","*.","/.","..."].map((e=>e.split("").map((e=>"\\"+e)).join(""))).join("|")+"|\\|>|&&|==|===)",i="\\s+"+s+"\\s+",r={ +keyword:"and as asr assert begin class constraint do done downto else end exception external for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new nonrec object of open or private rec sig struct then to try type val virtual when while with", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ", +literal:"true false" +},l="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",t={ +className:"number",relevance:0,variants:[{begin:l},{begin:"\\(-"+l+"\\)"}]},c={ +className:"operator",relevance:0,begin:s},o=[{className:"identifier", +relevance:0,begin:n},c,t],g=[e.QUOTE_STRING_MODE,c,{className:"module", +begin:"\\b"+a,returnBegin:!0,relevance:0,end:".",contains:[{ +className:"identifier",begin:a,relevance:0}]}],b=[{className:"module", +begin:"\\b"+a,returnBegin:!0,end:".",relevance:0,contains:[{ +className:"identifier",begin:a,relevance:0}]}],m={className:"function", +relevance:0,keywords:r,variants:[{begin:"\\s(\\(\\.?.*?\\)|"+n+")\\s*=>", +end:"\\s*=>",returnBegin:!0,relevance:0,contains:[{className:"params", +variants:[{begin:n},{ +begin:"~?[a-z$_][0-9a-zA-Z$_]*(\\s*:\\s*[a-z$_][0-9a-z$_]*(\\(\\s*('?[a-z$_][0-9a-z$_]*\\s*(,'?[a-z$_][0-9a-z$_]*\\s*)*)?\\))?){0,2}" +},{begin:/\(\s*\)/}]}]},{begin:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",end:"\\s=>", +returnBegin:!0,relevance:0,contains:[{className:"params",relevance:0,variants:[{ +begin:n,end:"(,|\\n|\\))",relevance:0,contains:[c,{className:"typing",begin:":", +end:"(,|\\n)",returnBegin:!0,relevance:0,contains:b}]}]}]},{ +begin:"\\(\\.\\s"+n+"\\)\\s*=>"}]};g.push(m);const d={className:"constructor", +begin:a+"\\(",end:"\\)",illegal:"\\n",keywords:r, +contains:[e.QUOTE_STRING_MODE,c,{className:"params",begin:"\\b"+n}]},u={ +className:"pattern-match",begin:"\\|",returnBegin:!0,keywords:r,end:"=>", +relevance:0,contains:[d,c,{relevance:0,className:"constructor",begin:a}]},v={ +className:"module-access",keywords:r,returnBegin:!0,variants:[{ +begin:"\\b("+a+"\\.)+"+n},{begin:"\\b("+a+"\\.)+\\(",end:"\\)",returnBegin:!0, +contains:[m,{begin:"\\(",end:"\\)",relevance:0,skip:!0}].concat(g)},{ +begin:"\\b("+a+"\\.)+\\{",end:/\}/}],contains:g};return b.push(v),{ +name:"ReasonML",aliases:["re"],keywords:r,illegal:"(:-|:=|\\$\\{|\\+=)", +contains:[e.COMMENT("/\\*","\\*/",{illegal:"^(#,\\/\\/)"}),{ +className:"character",begin:"'(\\\\[^']+|[^'])'",illegal:"\\n",relevance:0 +},e.QUOTE_STRING_MODE,{className:"literal",begin:"\\(\\)",relevance:0},{ +className:"literal",begin:"\\[\\|",end:"\\|\\]",relevance:0,contains:o},{ +className:"literal",begin:"\\[",end:"\\]",relevance:0,contains:o},d,{ +className:"operator",begin:i,illegal:"--\x3e",relevance:0 +},t,e.C_LINE_COMMENT_MODE,u,m,{className:"module-def", +begin:"\\bmodule\\s+"+n+"\\s+"+a+"\\s+=\\s+\\{",end:/\}/,returnBegin:!0, +keywords:r,relevance:0,contains:[{className:"module",relevance:0,begin:a},{ +begin:/\{/,end:/\}/,relevance:0,skip:!0}].concat(g)},v]}}})() +;hljs.registerLanguage("reasonml",e)})();/*! `javascript` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict" +;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],t=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],s=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],c=["arguments","this","super","console","window","document","localStorage","module","global"],i=[].concat(r,t,s) +;return o=>{const l=o.regex,b=e,d={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const a=e[0].length+e.index,t=e.input[a] +;if("<"===t||","===t)return void n.ignoreMatch();let s +;">"===t&&(((e,{after:n})=>{const a="",M={ +match:[/const|var|let/,/\s+/,b,/\s*/,/=\s*/,/(async\s*)?/,l.lookahead(C)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[S]} +;return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:g,exports:{ +PARAMS_CONTAINS:p,CLASS_REFERENCE:R},illegal:/#(?![$_A-z])/, +contains:[o.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},o.APOS_STRING_MODE,o.QUOTE_STRING_MODE,y,N,_,h,{match:/\$\d+/},E,R,{ +className:"attr",begin:b+l.lookahead(":"),relevance:0},M,{ +begin:"("+o.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[h,o.REGEXP_MODE,{ +className:"function",begin:C,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:o.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, +excludeEnd:!0,keywords:g,contains:p}]}]},{begin:/,/,relevance:0},{match:/\s+/, +relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:d.begin, +"on:begin":d.isTrulyOpeningTag,end:d.end}],subLanguage:"xml",contains:[{ +begin:d.begin,end:d.end,skip:!0,contains:["self"]}]}]},O,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+o.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[S,o.inherit(o.TITLE_MODE,{begin:b, +className:"title.function"})]},{match:/\.\.\./,relevance:0},x,{match:"\\$"+b, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[S]},k,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},w,T,{match:/\$[(.]/}]}}})() +;hljs.registerLanguage("javascript",e)})();/*! `sql` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const r=e.regex,t=e.COMMENT("--","$"),n=["true","false","unknown"],a=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],i=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=i,c=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!i.includes(e))),l={ +begin:r.concat(/\b/,r.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:r,when:t}={})=>{const n=t +;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) +})(c,{when:e=>e.length<3}),literal:n,type:a, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:r.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:c.concat(s),literal:n,type:a}},{className:"type", +begin:r.either("double precision","large object","with timezone","without timezone") +},l,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ +begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ +begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{className:"operator", +begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})() +;hljs.registerLanguage("sql",e)})();/*! `bash` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const s=e.regex,t={},n={begin:/\$\{/, +end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{ +className:"variable",variants:[{ +begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});const a={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(c);const o={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},r=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[r,e.SHEBANG(),l,o,e.HASH_COMMENT_MODE,i,{match:/(\/[a-z._-]+)+/},c,{ +className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}})() +;hljs.registerLanguage("bash",e)})();/*! `shell` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var s=(()=>{"use strict";return s=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]})})();hljs.registerLanguage("shell",s)})();/*! `plaintext` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0})})() +;hljs.registerLanguage("plaintext",t)})();/*! `graphql` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const a=e.regex;return{name:"GraphQL", +aliases:["gql"],case_insensitive:!0,disableAutodetect:!1,keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:a.concat(/[_A-Za-z][_0-9A-Za-z]*/,a.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}}})();hljs.registerLanguage("graphql",e) +})();/*! `ocaml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>({name:"OCaml",aliases:["ml"], +keywords:{$pattern:"[a-z_]\\w*!?", +keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref", +literal:"true false"},illegal:/\/\/|>>/,contains:[{className:"literal", +begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0},e.COMMENT("\\(\\*","\\*\\)",{ +contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{ +className:"type",begin:"`[A-Z][\\w']*"},{className:"type", +begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*",relevance:0 +},e.inherit(e.APOS_STRING_MODE,{className:"string",relevance:0 +}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),{className:"number", +begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)", +relevance:0},{begin:/->/}]})})();hljs.registerLanguage("ocaml",e)})();/*! `json` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const a=["true","false","null"],n={ +scope:"literal",beginKeywords:a.join(" ")};return{name:"JSON",keywords:{ +literal:a},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/, +relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,n,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}}})();hljs.registerLanguage("json",e)})();/*! `python` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,i=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:i, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},t={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:s,illegal:/#/},l={begin:/\{\{/,relevance:0},b={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},o="[0-9](_?[0-9])*",c=`(\\b(${o}))?\\.(${o})|\\b(${o})\\.`,d="\\b|"+i.join("|"),g={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${o})|(${c}))[eE][+-]?(${o})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${o})[jJ](?=${d})` +}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:s, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s, +contains:["self",t,g,b,e.HASH_COMMENT_MODE]}]};return r.contains=[b,g,t],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:s, +illegal:/(<\/|->|\?)|=>/,contains:[t,g,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},b,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,b]}]}}})() +;hljs.registerLanguage("python",e)})();/*! `xml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const a=e.regex,n=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},i=e.inherit(t,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),r={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,l,c,i,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[t,i,l,c]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[r],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[r],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:r}]},{ +className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(n,/>/))),contains:[{ +className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}} +})();hljs.registerLanguage("xml",e)})();/*! `markdown` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, +end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, +relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] +}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) +;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g) +})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})() +;hljs.registerLanguage("markdown",e)})();/*! `c` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),s="[a-zA-Z_]\\w*::",a="(decltype\\(auto\\)|"+n.optional(s)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},i={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},o={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(i,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={ +className:"title",begin:n.optional(s)+e.IDENT_RE,relevance:0 +},d=n.optional(s)+e.IDENT_RE+"\\s*\\(",u={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},g=[o,r,t,e.C_BLOCK_COMMENT_MODE,l,i],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:g.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:g.concat(["self"]),relevance:0}]),relevance:0},p={ +begin:"("+a+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)", +keywords:u,relevance:0},{begin:d,returnBegin:!0,contains:[e.inherit(c,{ +className:"title.function"})],relevance:0},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,i,l,r,{begin:/\(/,end:/\)/,keywords:u, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,i,l,r]}] +},r,t,e.C_BLOCK_COMMENT_MODE,o]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:o, +strings:i,keywords:u}}}})();hljs.registerLanguage("c",e)})(); diff --git a/odoc.support/katex.min.css b/odoc.support/katex.min.css new file mode 100644 index 000000000..5f1f85765 --- /dev/null +++ b/odoc.support/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2")}.katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.15.2"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/odoc.support/katex.min.js b/odoc.support/katex.min.js new file mode 100644 index 000000000..e4d78f243 --- /dev/null +++ b/odoc.support/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Zn}});var r=function e(t,r){this.position=void 0;var n,a="KaTeX parse error: "+t,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;n=i.start;var s=i.end;n===o.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var l=o.slice(n,s).replace(/[^]/g,"$&\u0332");a+=(n>15?"\u2026"+o.slice(n-15,n):o.slice(0,n))+l+(s+15":">","<":"<",'"':""","'":"'"},o=/[&><"']/g;var s=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(o,(function(e){return i[e]}))},hyphenate:function(e){return e.replace(a,"-$1").toLowerCase()},getBaseElem:s,isCharacterBox:function(e){var t=s(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(e);return null!=t?t[1]:"_relative"}},h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:function(e){return"#"+e}},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:function(e,t){return t.push(e),t}},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:function(e){return Math.max(0,e)},cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:function(e){return Math.max(0,e)},cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:function(e){return Math.max(0,e)},cli:"-e, --max-expand ",cliProcessor:function(e){return"Infinity"===e?1/0:parseInt(e)}},globalGroup:{type:"boolean",cli:!1}};function m(e){if(e.default)return e.default;var t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var c=function(){function e(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},h)if(h.hasOwnProperty(t)){var r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:m(r)}}var t=e.prototype;return t.reportNonstrict=function(e,t,r){var a=this.strict;if("function"==typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))},t.isTrusted=function(e){e.url&&!e.protocol&&(e.protocol=l.protocolFromUrl(e.url));var t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)},e}(),u=function(){function e(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}var t=e.prototype;return t.sup=function(){return p[d[this.id]]},t.sub=function(){return p[f[this.id]]},t.fracNum=function(){return p[g[this.id]]},t.fracDen=function(){return p[v[this.id]]},t.cramp=function(){return p[b[this.id]]},t.text=function(){return p[y[this.id]]},t.isTight=function(){return this.size>=2},e}(),p=[new u(0,0,!1),new u(1,0,!0),new u(2,1,!1),new u(3,1,!0),new u(4,2,!1),new u(5,2,!0),new u(6,3,!1),new u(7,3,!0)],d=[4,5,4,5,6,7,6,7],f=[5,5,5,5,7,7,7,7],g=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],x={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},w=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var k=[];function S(e){for(var t=0;t=k[t]&&e<=k[t+1])return!0;return!1}w.forEach((function(e){return e.blocks.forEach((function(e){return k.push.apply(k,e)}))}));var M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t=5?0:e>=3?1:2]){var r=N[t]={cssEmPerMu:B.quad[t]/18};for(var n in B)B.hasOwnProperty(n)&&(r[n]=B[n][t])}return N[t]}(this.size)),this._fontMetrics},t.getColor=function(){return this.phantom?"transparent":this.color},e}();H.BASESIZE=6;var E=H,L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},P=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},F=function(e,t){var r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},V=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((function(e){return e})).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Y=function(e){var t=document.createElement(e);for(var r in t.className=G(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var n in this.attributes)this.attributes.hasOwnProperty(n)&&t.setAttribute(n,this.attributes[n]);for(var a=0;a"},W=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"span")},t.toMarkup=function(){return X.call(this,"span")},e}(),_=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"a")},t.toMarkup=function(){return X.call(this,"a")},e}(),j=function(){function e(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e},t.toMarkup=function(){var e=""+this.alt+"=a[0]&&e<=a[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=$[this.text])}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=V(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=G(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(n)&&(r+=l.hyphenate(n)+":"+this.style[n]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');var a=l.escape(this.text);return e?(t+=">",t+=a,t+=""):a},e}(),K=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r":""},e}(),Q=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e="","\\gt",!0),ie(oe,le,be,"\u2208","\\in",!0),ie(oe,le,be,"\ue020","\\@not"),ie(oe,le,be,"\u2282","\\subset",!0),ie(oe,le,be,"\u2283","\\supset",!0),ie(oe,le,be,"\u2286","\\subseteq",!0),ie(oe,le,be,"\u2287","\\supseteq",!0),ie(oe,he,be,"\u2288","\\nsubseteq",!0),ie(oe,he,be,"\u2289","\\nsupseteq",!0),ie(oe,le,be,"\u22a8","\\models"),ie(oe,le,be,"\u2190","\\leftarrow",!0),ie(oe,le,be,"\u2264","\\le"),ie(oe,le,be,"\u2264","\\leq",!0),ie(oe,le,be,"<","\\lt",!0),ie(oe,le,be,"\u2192","\\rightarrow",!0),ie(oe,le,be,"\u2192","\\to"),ie(oe,he,be,"\u2271","\\ngeq",!0),ie(oe,he,be,"\u2270","\\nleq",!0),ie(oe,le,ye,"\xa0","\\ "),ie(oe,le,ye,"\xa0","\\space"),ie(oe,le,ye,"\xa0","\\nobreakspace"),ie(se,le,ye,"\xa0","\\ "),ie(se,le,ye,"\xa0"," "),ie(se,le,ye,"\xa0","\\space"),ie(se,le,ye,"\xa0","\\nobreakspace"),ie(oe,le,ye,null,"\\nobreak"),ie(oe,le,ye,null,"\\allowbreak"),ie(oe,le,ve,",",","),ie(oe,le,ve,";",";"),ie(oe,he,ce,"\u22bc","\\barwedge",!0),ie(oe,he,ce,"\u22bb","\\veebar",!0),ie(oe,le,ce,"\u2299","\\odot",!0),ie(oe,le,ce,"\u2295","\\oplus",!0),ie(oe,le,ce,"\u2297","\\otimes",!0),ie(oe,le,xe,"\u2202","\\partial",!0),ie(oe,le,ce,"\u2298","\\oslash",!0),ie(oe,he,ce,"\u229a","\\circledcirc",!0),ie(oe,he,ce,"\u22a1","\\boxdot",!0),ie(oe,le,ce,"\u25b3","\\bigtriangleup"),ie(oe,le,ce,"\u25bd","\\bigtriangledown"),ie(oe,le,ce,"\u2020","\\dagger"),ie(oe,le,ce,"\u22c4","\\diamond"),ie(oe,le,ce,"\u22c6","\\star"),ie(oe,le,ce,"\u25c3","\\triangleleft"),ie(oe,le,ce,"\u25b9","\\triangleright"),ie(oe,le,ge,"{","\\{"),ie(se,le,xe,"{","\\{"),ie(se,le,xe,"{","\\textbraceleft"),ie(oe,le,ue,"}","\\}"),ie(se,le,xe,"}","\\}"),ie(se,le,xe,"}","\\textbraceright"),ie(oe,le,ge,"{","\\lbrace"),ie(oe,le,ue,"}","\\rbrace"),ie(oe,le,ge,"[","\\lbrack",!0),ie(se,le,xe,"[","\\lbrack",!0),ie(oe,le,ue,"]","\\rbrack",!0),ie(se,le,xe,"]","\\rbrack",!0),ie(oe,le,ge,"(","\\lparen",!0),ie(oe,le,ue,")","\\rparen",!0),ie(se,le,xe,"<","\\textless",!0),ie(se,le,xe,">","\\textgreater",!0),ie(oe,le,ge,"\u230a","\\lfloor",!0),ie(oe,le,ue,"\u230b","\\rfloor",!0),ie(oe,le,ge,"\u2308","\\lceil",!0),ie(oe,le,ue,"\u2309","\\rceil",!0),ie(oe,le,xe,"\\","\\backslash"),ie(oe,le,xe,"\u2223","|"),ie(oe,le,xe,"\u2223","\\vert"),ie(se,le,xe,"|","\\textbar",!0),ie(oe,le,xe,"\u2225","\\|"),ie(oe,le,xe,"\u2225","\\Vert"),ie(se,le,xe,"\u2225","\\textbardbl"),ie(se,le,xe,"~","\\textasciitilde"),ie(se,le,xe,"\\","\\textbackslash"),ie(se,le,xe,"^","\\textasciicircum"),ie(oe,le,be,"\u2191","\\uparrow",!0),ie(oe,le,be,"\u21d1","\\Uparrow",!0),ie(oe,le,be,"\u2193","\\downarrow",!0),ie(oe,le,be,"\u21d3","\\Downarrow",!0),ie(oe,le,be,"\u2195","\\updownarrow",!0),ie(oe,le,be,"\u21d5","\\Updownarrow",!0),ie(oe,le,fe,"\u2210","\\coprod"),ie(oe,le,fe,"\u22c1","\\bigvee"),ie(oe,le,fe,"\u22c0","\\bigwedge"),ie(oe,le,fe,"\u2a04","\\biguplus"),ie(oe,le,fe,"\u22c2","\\bigcap"),ie(oe,le,fe,"\u22c3","\\bigcup"),ie(oe,le,fe,"\u222b","\\int"),ie(oe,le,fe,"\u222b","\\intop"),ie(oe,le,fe,"\u222c","\\iint"),ie(oe,le,fe,"\u222d","\\iiint"),ie(oe,le,fe,"\u220f","\\prod"),ie(oe,le,fe,"\u2211","\\sum"),ie(oe,le,fe,"\u2a02","\\bigotimes"),ie(oe,le,fe,"\u2a01","\\bigoplus"),ie(oe,le,fe,"\u2a00","\\bigodot"),ie(oe,le,fe,"\u222e","\\oint"),ie(oe,le,fe,"\u222f","\\oiint"),ie(oe,le,fe,"\u2230","\\oiiint"),ie(oe,le,fe,"\u2a06","\\bigsqcup"),ie(oe,le,fe,"\u222b","\\smallint"),ie(se,le,pe,"\u2026","\\textellipsis"),ie(oe,le,pe,"\u2026","\\mathellipsis"),ie(se,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u22ef","\\@cdots",!0),ie(oe,le,pe,"\u22f1","\\ddots",!0),ie(oe,le,xe,"\u22ee","\\varvdots"),ie(oe,le,me,"\u02ca","\\acute"),ie(oe,le,me,"\u02cb","\\grave"),ie(oe,le,me,"\xa8","\\ddot"),ie(oe,le,me,"~","\\tilde"),ie(oe,le,me,"\u02c9","\\bar"),ie(oe,le,me,"\u02d8","\\breve"),ie(oe,le,me,"\u02c7","\\check"),ie(oe,le,me,"^","\\hat"),ie(oe,le,me,"\u20d7","\\vec"),ie(oe,le,me,"\u02d9","\\dot"),ie(oe,le,me,"\u02da","\\mathring"),ie(oe,le,de,"\ue131","\\@imath"),ie(oe,le,de,"\ue237","\\@jmath"),ie(oe,le,xe,"\u0131","\u0131"),ie(oe,le,xe,"\u0237","\u0237"),ie(se,le,xe,"\u0131","\\i",!0),ie(se,le,xe,"\u0237","\\j",!0),ie(se,le,xe,"\xdf","\\ss",!0),ie(se,le,xe,"\xe6","\\ae",!0),ie(se,le,xe,"\u0153","\\oe",!0),ie(se,le,xe,"\xf8","\\o",!0),ie(se,le,xe,"\xc6","\\AE",!0),ie(se,le,xe,"\u0152","\\OE",!0),ie(se,le,xe,"\xd8","\\O",!0),ie(se,le,me,"\u02ca","\\'"),ie(se,le,me,"\u02cb","\\`"),ie(se,le,me,"\u02c6","\\^"),ie(se,le,me,"\u02dc","\\~"),ie(se,le,me,"\u02c9","\\="),ie(se,le,me,"\u02d8","\\u"),ie(se,le,me,"\u02d9","\\."),ie(se,le,me,"\xb8","\\c"),ie(se,le,me,"\u02da","\\r"),ie(se,le,me,"\u02c7","\\v"),ie(se,le,me,"\xa8",'\\"'),ie(se,le,me,"\u02dd","\\H"),ie(se,le,me,"\u25ef","\\textcircled");var we={"--":!0,"---":!0,"``":!0,"''":!0};ie(se,le,xe,"\u2013","--",!0),ie(se,le,xe,"\u2013","\\textendash"),ie(se,le,xe,"\u2014","---",!0),ie(se,le,xe,"\u2014","\\textemdash"),ie(se,le,xe,"\u2018","`",!0),ie(se,le,xe,"\u2018","\\textquoteleft"),ie(se,le,xe,"\u2019","'",!0),ie(se,le,xe,"\u2019","\\textquoteright"),ie(se,le,xe,"\u201c","``",!0),ie(se,le,xe,"\u201c","\\textquotedblleft"),ie(se,le,xe,"\u201d","''",!0),ie(se,le,xe,"\u201d","\\textquotedblright"),ie(oe,le,xe,"\xb0","\\degree",!0),ie(se,le,xe,"\xb0","\\degree"),ie(se,le,xe,"\xb0","\\textdegree",!0),ie(oe,le,xe,"\xa3","\\pounds"),ie(oe,le,xe,"\xa3","\\mathsterling",!0),ie(se,le,xe,"\xa3","\\pounds"),ie(se,le,xe,"\xa3","\\textsterling",!0),ie(oe,he,xe,"\u2720","\\maltese"),ie(se,he,xe,"\u2720","\\maltese");for(var ke='0123456789/@."',Se=0;Set&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>n&&(n=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Xe=function(e,t,r,n){var a=new W(e,t,r,n);return Ye(a),a},We=function(e,t,r,n){return new W(e,t,r,n)},_e=function(e){var t=new A(e);return Ye(t),t},je=function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},$e={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ze={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Ke={fontMap:$e,makeSymbol:Ge,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ve(e,"Main-Bold",t).metrics?Ge(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===ae[t][e].font?Ge(e,"Main-Regular",t,r,n):Ge(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Xe,makeSvgSpan:We,makeLineSpan:function(e,t,r){var n=Xe([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=V(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){var a=new _(e,t,r,n);return Ye(a),a},makeFragment:_e,wrapFragment:function(e,t){return e instanceof A?Xe([],[e],t):e},makeVList:function(e,t){for(var r=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,a=n,i=1;i0&&(o.push(kt(s,t)),s=[]),o.push(a[l]));s.length>0&&o.push(kt(s,t)),r?((i=kt(ft(r,t,!0))).classes=["tag"],o.push(i)):n&&o.push(n);var m=mt(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=V(m.height+m.depth),m.depth&&(c.style.verticalAlign=V(-m.depth))}return m}function Mt(e){return new A(e)}var zt=function(){function e(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(var r=0;r0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(var r=0;r"},t.toText=function(){return this.children.map((function(e){return e.toText()})).join("")},e}(),At=function(){function e(e){this.text=void 0,this.text=e}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.text)},t.toMarkup=function(){return l.escape(this.toText())},t.toText=function(){return this.text},e}(),Tt={MathNode:zt,TextNode:At,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",V(this.width)),e},t.toMarkup=function(){return this.character?""+this.character+"":''},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:Mt},Bt=function(e,t,r){return!ae[t][e]||!ae[t][e].replace||55349===e.charCodeAt(0)||we.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(e=ae[t][e].replace),new Tt.TextNode(e)},Ct=function(e){return 1===e.length?e[0]:new Tt.MathNode("mrow",e)},qt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var a=e.text;return l.contains(["\\imath","\\jmath"],a)?null:(ae[n][a]&&ae[n][a].replace&&(a=ae[n][a].replace),q(a,Ke.fontMap[r].fontName,n)?Ke.fontMap[r].variant:null)},Nt=function(e,t,r){if(1===e.length){var n=Rt(e[0],t);return r&&n instanceof zt&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var a,i=[],o=0;o0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),a=s}return i},It=function(e,t,r){return Ct(Nt(e,t,r))},Rt=function(e,t){if(!e)return new Tt.MathNode("mrow");if(it[e.type])return it[e.type](e,t);throw new n("Got group of unknown type: '"+e.type+"'")};function Ot(e,t,r,n,a){var i,o=Nt(e,r);i=1===o.length&&o[0]instanceof zt&&l.contains(["mrow","mtable"],o[0].type)?o[0]:new Tt.MathNode("mrow",o);var s=new Tt.MathNode("annotation",[new Tt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var h=new Tt.MathNode("semantics",[i,s]),m=new Tt.MathNode("math",[h]);m.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&m.setAttribute("display","block");var c=a?"katex":"katex-mathml";return Ke.makeSpan([c],[m])}var Ht=function(e){return new E({style:e.displayMode?x.DISPLAY:x.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Et=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Ke.makeSpan(r,[e])}return e},Lt=function(e,t,r){var n,a=Ht(r);if("mathml"===r.output)return Ot(e,t,a,r.displayMode,!0);if("html"===r.output){var i=St(e,a);n=Ke.makeSpan(["katex"],[i])}else{var o=Ot(e,t,a,r.displayMode,!1),s=St(e,a);n=Ke.makeSpan(["katex"],[o,s])}return Et(n,r)},Dt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Pt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ft=function(e,t,r,n,a){var i,o=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(i=Ke.makeSpan(["stretchy",t],[],a),"fbox"===t){var s=a.color&&a.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new K(l,{width:"100%",height:V(o)});i=Ke.makeSvgSpan([],[h],a)}return i.height=o,i.style.height=V(o),i},Vt=function(e){var t=new Tt.MathNode("mo",[new Tt.TextNode(Dt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Gt=function(e,t){var r=function(){var r=4e5,n=e.label.substr(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){var a,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===n||"widecheck"===n?(a=420,r=2364,o=.42,i=n+"4"):(a=312,r=2340,o=.34,i="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][h],a=[0,239,300,360,420][h],o=[0,.24,.3,.3,.36,.42][h],i=n+h):(r=[0,600,1033,2339,2340][h],a=[0,260,286,306,312][h],o=[0,.26,.286,.3,.306,.34][h],i="tilde"+h)}var m=new J(i),c=new K([m],{width:"100%",height:V(o),viewBox:"0 0 "+r+" "+a,preserveAspectRatio:"none"});return{span:Ke.makeSvgSpan([],[c],t),minWidth:0,height:o}}var u,p,d,f=[],g=Pt[n],v=g[0],b=g[1],y=g[2],x=y/1e3,w=v.length;if(1===w)u=["hide-tail"],p=[g[3]];else if(2===w)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k0&&(n.style.minWidth=V(a)),n};function Ut(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Yt(e){var t=Xt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Xt(e){return e&&("atom"===e.type||re.hasOwnProperty(e.type))?e:null}var Wt=function(e,t){var r,n,a;e&&"supsub"===e.type?(r=(n=Ut(e.base,"accent")).base,e.base=r,a=function(e){if(e instanceof W)return e;throw new Error("Expected span but got "+String(e)+".")}(wt(e,t)),e.base=n):r=(n=Ut(e,"accent")).base;var i=wt(r,t.havingCrampedStyle()),o=0;if(n.isShifty&&l.isCharacterBox(r)){var s=l.getBaseElem(r);o=ee(wt(s,t.havingCrampedStyle())).skew}var h,m="\\c"===n.label,c=m?i.height+i.depth:Math.min(i.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Gt(n,t),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+V(2*o)+")",marginLeft:V(2*o)}:void 0}]},t);else{var u,p;"\\vec"===n.label?(u=Ke.staticSvg("vec",t),p=Ke.svgData.vec[1]):((u=ee(u=Ke.makeOrd({mode:n.mode,text:n.label},t,"textord"))).italic=0,p=u.width,m&&(c+=u.depth)),h=Ke.makeSpan(["accent-body"],[u]);var d="\\textcircled"===n.label;d&&(h.classes.push("accent-full"),c=i.height);var f=o;d||(f-=p/2),h.style.left=V(f),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}var g=Ke.makeSpan(["mord","accent"],[h],t);return a?(a.children[0]=g,a.height=Math.max(g.height,a.height),a.classes[0]="mord",a):g},_t=function(e,t){var r=e.isStretchy?Vt(e.label):new Tt.MathNode("mo",[Bt(e.label,e.mode)]),n=new Tt.MathNode("mover",[Rt(e.base,t),r]);return n.setAttribute("accent","true"),n},jt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((function(e){return"\\"+e})).join("|"));ot({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var r=lt(t[0]),n=!jt.test(e.funcName),a=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:a,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:function(e,t){var r=t[0],n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:a}},htmlBuilder:function(e,t){var r=wt(e.base,t),n=Gt(e,t),a="\\utilde"===e.label?.12:0,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:function(e,t){var r=Vt(e.label),n=new Tt.MathNode("munder",[Rt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});var $t=function(e){var t=new Tt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};ot({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,a=e.funcName;return{type:"xArrow",mode:n.mode,label:a,body:t[0],below:r[0]}},htmlBuilder:function(e,t){var r,n=t.style,a=t.havingStyle(n.sup()),i=Ke.wrapFragment(wt(e.body,a,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(a=t.havingStyle(n.sub()),(r=Ke.wrapFragment(wt(e.below,a,t),t)).classes.push(o+"-arrow-pad"));var s,l=Gt(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),Ke.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder:function(e,t){var r,n=Vt(e.label);if(n.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var a=$t(Rt(e.body,t));if(e.below){var i=$t(Rt(e.below,t));r=new Tt.MathNode("munderover",[n,i,a])}else r=new Tt.MathNode("mover",[n,a])}else if(e.below){var o=$t(Rt(e.below,t));r=new Tt.MathNode("munder",[n,o])}else r=$t(),r=new Tt.MathNode("mover",[n,r]);return r}});var Zt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Kt=function(e){return"textord"===e.type&&"@"===e.text};function Jt(e,t,r){var n=Zt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var a={type:"atom",text:n,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[a],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}ot({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder:function(e,t){var r=t.havingStyle(t.style.sup()),n=Ke.wrapFragment(wt(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=V(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mrow",[Rt(e.label,t)]);return(r=new Tt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Tt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),ot({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(e,t){return{type:"cdlabelparent",mode:e.parser.mode,fragment:t[0]}},htmlBuilder:function(e,t){var r=Ke.wrapFragment(wt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:function(e,t){return new Tt.MathNode("mrow",[Rt(e.fragment,t)])}}),ot({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var r=e.parser,a=Ut(t[0],"ordgroup").body,i="",o=0;o=1114111)throw new n("\\@char with invalid code point "+i);return l<=65535?s=String.fromCharCode(l):(l-=65536,s=String.fromCharCode(55296+(l>>10),56320+(1023&l))),{type:"textord",mode:r.mode,text:s}}});var Qt=function(e,t){var r=ft(e.body,t.withColor(e.color),!1);return Ke.makeFragment(r)},er=function(e,t){var r=Nt(e.body,t.withColor(e.color)),n=new Tt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};ot({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler:function(e,t){var r=e.parser,n=Ut(t[0],"color-token").color,a=t[1];return{type:"color",mode:r.mode,color:n,body:ht(a)}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler:function(e,t){var r=e.parser,n=e.breakOnTokenText,a=Ut(t[0],"color-token").color;r.gullet.macros.set("\\current@color",a);var i=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:a,body:i}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=r[0],i=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:i,size:a&&Ut(a,"size").value}},htmlBuilder:function(e,t){var r=Ke.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=V(F(e.size,t)))),r},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",V(F(e.size,t)))),r}});var tr={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},rr=function(e){var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},nr=function(e,t,r,n){var a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)};ot({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(e){var t=e.parser,r=e.funcName;t.consumeSpaces();var a=t.fetch();if(tr[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=tr[a.text]),Ut(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",a)}}),ot({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,a=t.gullet.popToken(),i=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new n("Expected a control sequence",a);for(var o,s=0,l=[[]];"{"!==t.gullet.future().text;)if("#"===(a=t.gullet.popToken()).text){if("{"===t.gullet.future().text){o=t.gullet.future(),l[s].push("{");break}if(a=t.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new n('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new n('Argument number "'+a.text+'" out of order');s++,l.push([])}else{if("EOF"===a.text)throw new n("Expected a macro definition");l[s].push(a.text)}var h=t.gullet.consumeArg().tokens;return o&&h.unshift(o),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h)).reverse(),t.gullet.macros.set(i,{tokens:h,numArgs:s,delimiters:l},r===tr[r]),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken());t.gullet.consumeSpaces();var a=function(e){var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text&&(t=e.gullet.popToken()),t}(t);return nr(t,n,a,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken()),a=t.gullet.popToken(),i=t.gullet.popToken();return nr(t,n,i,"\\\\globalfuture"===r),t.gullet.pushToken(i),t.gullet.pushToken(a),{type:"internal",mode:t.mode}}});var ar=function(e,t,r){var n=q(ae.math[e]&&ae.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},ir=function(e,t,r,n){var a=r.havingBaseStyle(t),i=Ke.makeSpan(n.concat(a.sizingClasses(r)),[e],r),o=a.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=a.sizeMultiplier,i},or=function(e,t,r){var n=t.havingBaseStyle(r),a=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=V(a),e.height-=a,e.depth+=a},sr=function(e,t,r,n,a,i){var o=function(e,t,r,n){return Ke.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,a,n),s=ir(Ke.makeSpan(["delimsizing","size"+t],[o],n),x.TEXT,n,i);return r&&or(s,n,x.TEXT),s},lr=function(e,t,r){var n;return n="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:Ke.makeSpan(["delimsizinginner",n],[Ke.makeSpan([],[Ke.makeSymbol(e,t,r)])])}},hr=function(e,t,r){var n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],a=new J("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),i=new K([a],{width:V(n),height:V(t),style:"width:"+V(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),o=Ke.makeSvgSpan([],[i],r);return o.height=t,o.style.height=V(t),o.style.width=V(n),{type:"elem",elem:o}},mr={type:"kern",size:-.008},cr=["|","\\lvert","\\rvert","\\vert"],ur=["\\|","\\lVert","\\rVert","\\Vert"],pr=function(e,t,r,n,a,i){var o,s,h,m;o=h=m=e,s=null;var c="Size1-Regular";"\\uparrow"===e?h=m="\u23d0":"\\Uparrow"===e?h=m="\u2016":"\\downarrow"===e?o=h="\u23d0":"\\Downarrow"===e?o=h="\u2016":"\\updownarrow"===e?(o="\\uparrow",h="\u23d0",m="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",h="\u2016",m="\\Downarrow"):l.contains(cr,e)?h="\u2223":l.contains(ur,e)?h="\u2225":"["===e||"\\lbrack"===e?(o="\u23a1",h="\u23a2",m="\u23a3",c="Size4-Regular"):"]"===e||"\\rbrack"===e?(o="\u23a4",h="\u23a5",m="\u23a6",c="Size4-Regular"):"\\lfloor"===e||"\u230a"===e?(h=o="\u23a2",m="\u23a3",c="Size4-Regular"):"\\lceil"===e||"\u2308"===e?(o="\u23a1",h=m="\u23a2",c="Size4-Regular"):"\\rfloor"===e||"\u230b"===e?(h=o="\u23a5",m="\u23a6",c="Size4-Regular"):"\\rceil"===e||"\u2309"===e?(o="\u23a4",h=m="\u23a5",c="Size4-Regular"):"("===e||"\\lparen"===e?(o="\u239b",h="\u239c",m="\u239d",c="Size4-Regular"):")"===e||"\\rparen"===e?(o="\u239e",h="\u239f",m="\u23a0",c="Size4-Regular"):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",m="\u23a9",h="\u23aa",c="Size4-Regular");var u=ar(o,c,a),p=u.height+u.depth,d=ar(h,c,a),f=d.height+d.depth,g=ar(m,c,a),v=g.height+g.depth,b=0,y=1;if(null!==s){var w=ar(s,c,a);b=w.height+w.depth,y=2}var k=p+v+b,S=k+Math.max(0,Math.ceil((t-k)/(y*f)))*y*f,M=n.fontMetrics().axisHeight;r&&(M*=n.sizeMultiplier);var z=S/2-M,A=[];if(A.push(lr(m,c,a)),A.push(mr),null===s){var T=S-p-v+.016;A.push(hr(h,T,n))}else{var B=(S-p-v-b)/2+.016;A.push(hr(h,B,n)),A.push(mr),A.push(lr(s,c,a)),A.push(mr),A.push(hr(h,B,n))}A.push(mr),A.push(lr(o,c,a));var C=n.havingBaseStyle(x.TEXT),q=Ke.makeVList({positionType:"bottom",positionData:z,children:A},C);return ir(Ke.makeSpan(["delimsizing","mult"],[q],C),x.TEXT,n,i)},dr=.08,fr=function(e,t,r,n,a){var i=function(e,t,r){t*=1e3;var n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),o=new J(e,i),s=new K([o],{width:"400em",height:V(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Ke.makeSvgSpan(["hide-tail"],[s],a)},gr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],vr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],br=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],yr=[0,1.2,1.8,2.4,3],xr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],wr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"stack"}],kr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Sr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},Mr=function(e,t,r,n){for(var a=Math.min(2,3-n.style.size);at)return r[a]}return r[r.length-1]},zr=function(e,t,r,n,a,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=l.contains(br,e)?xr:l.contains(gr,e)?kr:wr;var s=Mr(e,t,o,n);return"small"===s.type?function(e,t,r,n,a,i){var o=Ke.makeSymbol(e,"Main-Regular",a,n),s=ir(o,t,n,i);return r&&or(s,n,t),s}(e,s.style,r,n,a,i):"large"===s.type?sr(e,s.size,r,n,a,i):pr(e,t,r,n,a,i)},Ar={sqrtImage:function(e,t){var r,n,a=t.havingBaseSizing(),i=Mr("\\surd",e*a.sizeMultiplier,kr,a),o=a.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=fr("sqrtMain",l=(1+s+dr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",n=.833/o):"large"===i.type?(m=1080*yr[i.size],h=(yr[i.size]+s)/o,l=(yr[i.size]+s+dr)/o,(r=fr("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",n=1/o):(l=e+s+dr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=fr("sqrtTall",l,m,s,t)).style.minWidth="0.742em",n=1.056),r.height=h,r.style.height=V(l),{span:r,advanceWidth:n,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,a,i){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(gr,e)||l.contains(br,e))return sr(e,t,!1,r,a,i);if(l.contains(vr,e))return pr(e,yr[t],!1,r,a,i);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:yr,customSizedDelim:zr,leftRightDelim:function(e,t,r,n,a,i){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return zr(e,h,!0,n,a,i)}},Tr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Br=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Cr(e,t){var r=Xt(e);if(r&&l.contains(Br,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function qr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}ot({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(e,t){var r=Cr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Tr[e.funcName].size,mclass:Tr[e.funcName].mclass,delim:r.text}},htmlBuilder:function(e,t){return"."===e.delim?Ke.makeSpan([e.mclass]):Ar.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(Bt(e.delim,e.mode));var r=new Tt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=V(Ar.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),ot({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Cr(t[0],e).text,color:r}}}),ot({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=Cr(t[0],e),n=e.parser;++n.leftrightDepth;var a=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var i=Ut(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:a,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(e,t){qr(e);for(var r,n,a=ft(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l-1?"mpadded":"menclose",[Rt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var a=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+a+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};ot({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:n.mode,label:a,backgroundColor:i,body:o}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=Ut(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:a,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),ot({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"enclose",mode:r.mode,label:n,body:a}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\angl",body:t[0]}}});var Rr={};function Or(e){for(var t=e.type,r=e.names,n=e.props,a=e.handler,i=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:a},l=0;l1||!c)&&g.pop(),b.length0&&(y+=.25),m.push({pos:y,isDashed:e[t]})}for(w(o[0]),r=0;r0&&(M<(B+=b)&&(M=B),B=0),e.addJot&&(M+=f),z.height=S,z.depth=M,y+=S,z.pos=y,y+=M+B,h[r]=z,w(o[r+1])}var C,q,N=y/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],O=[];if(e.tags&&e.tags.some((function(e){return e})))for(r=0;r=s)){var W=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(W=l.deflt(P.pregap,p))&&((C=Ke.makeSpan(["arraycolsep"],[])).style.width=V(W),R.push(C));var _=[];for(r=0;r0){for(var K=Ke.makeLineSpan("hline",t,c),J=Ke.makeLineSpan("hdashline",t,c),Q=[{type:"elem",elem:h,shift:0}];m.length>0;){var ee=m.pop(),te=ee.pos-N;ee.isDashed?Q.push({type:"elem",elem:J,shift:te}):Q.push({type:"elem",elem:K,shift:te})}h=Ke.makeVList({positionType:"individualShift",children:Q},t)}if(0===O.length)return Ke.makeSpan(["mord"],[h],t);var re=Ke.makeVList({positionType:"individualShift",children:O},t);return re=Ke.makeSpan(["tag"],[re],t),Ke.makeFragment([h,re])},Xr={c:"center ",l:"left ",r:"right "},Wr=function(e,t){for(var r=[],n=new Tt.MathNode("mtd",[],["mtr-glue"]),a=new Tt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i0){var p=e.cols,d="",f=!1,g=0,v=p.length;"separator"===p[0].type&&(c+="top ",g=1),"separator"===p[p.length-1].type&&(c+="bottom ",v-=1);for(var b=g;b0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M-1?"alignat":"align",o="split"===e.envName,s=Gr(e.parser,{cols:a,addJot:!0,autoTag:o?void 0:Vr(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:o?2:void 0,leqno:e.parser.settings.leqno},"display"),l=0,h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var m="",c=0;c0&&u&&(f=1),a[p]={type:"align",align:d,pregap:f,postgap:0}}return s.colSeparationType=u?"align":"alignat",s};Or({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Gr(e.parser,a,Ur(e.envName))},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var i=e.parser;if(i.consumeSpaces(),"["===i.fetch().text){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),a.cols=[{type:"align",align:r}]}}var o=Gr(e.parser,a,Ur(e.envName)),s=Math.max.apply(Math,[0].concat(o.body.map((function(e){return e.length}))));return o.cols=new Array(s).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["subarray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=Gr(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new n("{subarray} can contain only one column");return a},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Ur(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(e){l.contains(["gather","gather*"],e.envName)&&Fr(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Vr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(e){Fr(e);var t={autoTag:Vr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["CD"],props:{numArgs:0},handler:function(e){return Fr(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a,i,o=[],s=[o],l=0;l-1);else{if(!("<>AV".indexOf(u)>-1))throw new n('Expected one of "<>AV=|." after @',h[c]);for(var d=0;d<2;d++){for(var f=!0,g=c+1;g=x.SCRIPT.id?r.text():x.DISPLAY:"text"===e&&r.size===x.DISPLAY.size?r=x.TEXT:"script"===e?r=x.SCRIPT:"scriptscript"===e&&(r=x.SCRIPTSCRIPT),r},nn=function(e,t){var r,n=rn(e.size,t.style),a=n.fracNum(),i=n.fracDen();r=t.havingStyle(a);var o=wt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(u=t.fontMetrics().num2,p=c):(u=t.fontMetrics().num3,p=3*c),d=t.fontMetrics().denom2),h){var w=t.fontMetrics().axisHeight;u-o.depth-(w+.5*m)0&&(t="."===(t=e)?null:t),t};ot({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var r,n=e.parser,a=t[4],i=t[5],o=lt(t[0]),s="atom"===o.type&&"open"===o.family?sn(o.text):null,l=lt(t[1]),h="atom"===l.type&&"close"===l.family?sn(l.text):null,m=Ut(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var u="auto",p=t[3];if("ordgroup"===p.type){if(p.body.length>0){var d=Ut(p.body[0],"textord");u=on[Number(d.text)]}}else p=Ut(p,"textord"),u=on[Number(p.text)];return{type:"genfrac",mode:n.mode,numer:a,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:u}},htmlBuilder:nn,mathmlBuilder:an}),ot({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var r=e.parser,n=(e.funcName,e.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ut(t[0],"size").value,token:n}}}),ot({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var r=e.parser,n=(e.funcName,t[0]),a=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Ut(t[1],"infix").size),i=t[2],o=a.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:o,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:nn,mathmlBuilder:an});var ln=function(e,t){var r,n,a=t.style;"supsub"===e.type?(r=e.sup?wt(e.sup,t.havingStyle(a.sup()),t):wt(e.sub,t.havingStyle(a.sub()),t),n=Ut(e.base,"horizBrace")):n=Ut(e,"horizBrace");var i,o=wt(n.base,t.havingBaseStyle(x.DISPLAY)),s=Gt(n,t);if(n.isOver?(i=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=Ke.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t);i=n.isOver?Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Ke.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t)};ot({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:ln,mathmlBuilder:function(e,t){var r=Vt(e.label);return new Tt.MathNode(e.isOver?"mover":"munder",[Rt(e.base,t),r])}}),ot({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[1],a=Ut(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:a})?{type:"href",mode:r.mode,href:a,body:ht(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(e,t){var r=ft(e.body,t,!1);return Ke.makeAnchor(e.href,[],r,t)},mathmlBuilder:function(e,t){var r=It(e.body,t);return r instanceof zt||(r=new zt("mrow",[r])),r.setAttribute("href",e.href),r}}),ot({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=Ut(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var a=[],i=0;i0&&(n=F(e.totalheight,t)-r);var a=0;e.width.number>0&&(a=F(e.width,t));var i={height:V(r+n)};a>0&&(i.width=V(a)),n>0&&(i.verticalAlign=V(-n));var o=new j(e.src,e.alt,i);return o.height=r,o.depth=n,o},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var n=F(e.height,t),a=0;if(e.totalheight.number>0&&(a=F(e.totalheight,t)-n,r.setAttribute("valign",V(-a))),r.setAttribute("height",V(n+a)),e.width.number>0){var i=F(e.width,t);r.setAttribute("width",V(i))}return r.setAttribute("src",e.src),r}}),ot({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=Ut(t[0],"size");if(r.settings.strict){var i="m"===n[1],o="mu"===a.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+a.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:a.value}},htmlBuilder:function(e,t){return Ke.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var r=F(e.dimension,t);return new Tt.SpaceNode(r)}}),ot({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:a}},htmlBuilder:function(e,t){var r;"clap"===e.alignment?(r=Ke.makeSpan([],[wt(e.body,t)]),r=Ke.makeSpan(["inner"],[r],t)):r=Ke.makeSpan(["inner"],[wt(e.body,t)]);var n=Ke.makeSpan(["fix"],[]),a=Ke.makeSpan([e.alignment],[r,n],t),i=Ke.makeSpan(["strut"]);return i.style.height=V(a.height+a.depth),a.depth&&(i.style.verticalAlign=V(-a.depth)),a.children.unshift(i),a=Ke.makeSpan(["thinbox"],[a],t),Ke.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mpadded",[Rt(e.body,t)]);if("rlap"!==e.alignment){var n="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}}),ot({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var r=e.funcName,n=e.parser,a=n.mode;n.switchMode("math");var i="\\("===r?"\\)":"$",o=n.parseExpression(!1,i);return n.expect(i),n.switchMode(a),{type:"styling",mode:n.mode,style:"text",body:o}}}),ot({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new n("Mismatched "+e.funcName)}});var mn=function(e,t){switch(t.style.size){case x.DISPLAY.size:return e.display;case x.TEXT.size:return e.text;case x.SCRIPT.size:return e.script;case x.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};ot({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:ht(t[0]),text:ht(t[1]),script:ht(t[2]),scriptscript:ht(t[3])}},htmlBuilder:function(e,t){var r=mn(e,t),n=ft(r,t,!1);return Ke.makeFragment(n)},mathmlBuilder:function(e,t){var r=mn(e,t);return It(r,t)}});var cn=function(e,t,r,n,a,i,o){e=Ke.makeSpan([],[e]);var s,h,m,c=r&&l.isCharacterBox(r);if(t){var u=wt(t,n.havingStyle(a.sup()),n);h={elem:u,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-u.depth)}}if(r){var p=wt(r,n.havingStyle(a.sub()),n);s={elem:p,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-p.height)}}if(h&&s){var d=n.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:d,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(s){var f=e.height-o;m=Ke.makeVList({positionType:"top",positionData:f,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e}]},n)}else{if(!h)return e;var g=e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:g,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}var v=[m];if(s&&0!==i&&!c){var b=Ke.makeSpan(["mspace"],[],n);b.style.marginRight=V(i),v.unshift(b)}return Ke.makeSpan(["mop","op-limits"],v,n)},un=["\\smallint"],pn=function(e,t){var r,n,a,i=!1;"supsub"===e.type?(r=e.sup,n=e.sub,a=Ut(e.base,"op"),i=!0):a=Ut(e,"op");var o,s=t.style,h=!1;if(s.size===x.DISPLAY.size&&a.symbol&&!l.contains(un,a.name)&&(h=!0),a.symbol){var m=h?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(c=a.name.substr(1),a.name="oiint"===c?"\\iint":"\\iiint"),o=Ke.makeSymbol(a.name,m,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),c.length>0){var u=o.italic,p=Ke.staticSvg(c+"Size"+(h?"2":"1"),t);o=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:h?.08:0}]},t),a.name="\\"+c,o.classes.unshift("mop"),o.italic=u}}else if(a.body){var d=ft(a.body,t,!0);1===d.length&&d[0]instanceof Z?(o=d[0]).classes[0]="mop":o=Ke.makeSpan(["mop"],d,t)}else{for(var f=[],g=1;g0){for(var s=a.body.map((function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),l=ft(s,t.withFont("mathrm"),!0),h=0;h=0?s.setAttribute("height",V(a)):(s.setAttribute("height",V(a)),s.setAttribute("depth",V(-a))),s.setAttribute("voffset",V(a)),s}});var yn=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];ot({type:"sizing",names:yn,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!1,r);return{type:"sizing",mode:a.mode,size:yn.indexOf(n)+1,body:i}},htmlBuilder:function(e,t){var r=t.havingSize(e.size);return bn(e.body,r,t)},mathmlBuilder:function(e,t){var r=t.havingSize(e.size),n=Nt(e.body,r),a=new Tt.MathNode("mstyle",n);return a.setAttribute("mathsize",V(r.sizeMultiplier)),a}}),ot({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=!1,i=!1,o=r[0]&&Ut(r[0],"ordgroup");if(o)for(var s="",l=0;lr.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=V(m);var p=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},t);if(e.index){var d=t.havingStyle(x.SCRIPTSCRIPT),f=wt(e.index,d,t),g=.6*(p.height-p.depth),v=Ke.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},t),b=Ke.makeSpan(["root"],[v]);return Ke.makeSpan(["mord","sqrt"],[b,p],t)}return Ke.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder:function(e,t){var r=e.body,n=e.index;return n?new Tt.MathNode("mroot",[Rt(r,t),Rt(n,t)]):new Tt.MathNode("msqrt",[Rt(r,t)])}});var xn={display:x.DISPLAY,text:x.TEXT,script:x.SCRIPT,scriptscript:x.SCRIPTSCRIPT};ot({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!0,r),o=n.slice(1,n.length-5);return{type:"styling",mode:a.mode,style:o,body:i}},htmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r).withFont("");return bn(e.body,n,t)},mathmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r),a=Nt(e.body,n),i=new Tt.MathNode("mstyle",a),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});var wn=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===x.DISPLAY.size||r.alwaysHandleSupSub)?pn:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===x.DISPLAY.size||r.limits)?vn:null:"accent"===r.type?l.isCharacterBox(r.base)?Wt:null:"horizBrace"===r.type&&!e.sub===r.isOver?ln:null:null};st({type:"supsub",htmlBuilder:function(e,t){var r=wn(e,t);if(r)return r(e,t);var n,a,i,o=e.base,s=e.sup,h=e.sub,m=wt(o,t),c=t.fontMetrics(),u=0,p=0,d=o&&l.isCharacterBox(o);if(s){var f=t.havingStyle(t.style.sup());n=wt(s,f,t),d||(u=m.height-f.fontMetrics().supDrop*f.sizeMultiplier/t.sizeMultiplier)}if(h){var g=t.havingStyle(t.style.sub());a=wt(h,g,t),d||(p=m.depth+g.fontMetrics().subDrop*g.sizeMultiplier/t.sizeMultiplier)}i=t.style===x.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,b=t.sizeMultiplier,y=V(.5/c.ptPerEm/b),w=null;if(a){var k=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(m instanceof Z||k)&&(w=V(-m.italic))}if(n&&a){u=Math.max(u,i,n.depth+.25*c.xHeight),p=Math.max(p,c.sub2);var S=4*c.defaultRuleThickness;if(u-n.depth-(a.height-p)0&&(u+=M,p-=M)}var z=[{type:"elem",elem:a,shift:p,marginRight:y,marginLeft:w},{type:"elem",elem:n,shift:-u,marginRight:y}];v=Ke.makeVList({positionType:"individualShift",children:z},t)}else if(a){p=Math.max(p,c.sub1,a.height-.8*c.xHeight);var A=[{type:"elem",elem:a,marginLeft:w,marginRight:y}];v=Ke.makeVList({positionType:"shift",positionData:p,children:A},t)}else{if(!n)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,n.depth+.25*c.xHeight),v=Ke.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:n,marginRight:y}]},t)}var T=yt(m,"right")||"mord";return Ke.makeSpan([T],[m,Ke.makeSpan(["msupsub"],[v])],t)},mathmlBuilder:function(e,t){var r,n=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(n=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var a,i=[Rt(e.base,t)];if(e.sub&&i.push(Rt(e.sub,t)),e.sup&&i.push(Rt(e.sup,t)),n)a=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;a=o&&"op"===o.type&&o.limits&&t.style===x.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===x.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;a=s&&"op"===s.type&&s.limits&&(t.style===x.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===x.DISPLAY)?"munder":"msub"}else{var l=e.base;a=l&&"op"===l.type&&l.limits&&(t.style===x.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===x.DISPLAY)?"mover":"msup"}return new Tt.MathNode(a,i)}}),st({type:"atom",htmlBuilder:function(e,t){return Ke.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[Bt(e.text,e.mode)]);if("bin"===e.family){var n=qt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var kn={mi:"italic",mn:"normal",mtext:"normal"};st({type:"mathord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mi",[Bt(e.text,e.mode,t)]),n=qt(e,t)||"italic";return n!==kn[r.type]&&r.setAttribute("mathvariant",n),r}}),st({type:"textord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var r,n=Bt(e.text,e.mode,t),a=qt(e,t)||"normal";return r="text"===e.mode?new Tt.MathNode("mtext",[n]):/[0-9]/.test(e.text)?new Tt.MathNode("mn",[n]):"\\prime"===e.text?new Tt.MathNode("mo",[n]):new Tt.MathNode("mi",[n]),a!==kn[r.type]&&r.setAttribute("mathvariant",a),r}});var Sn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Mn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};st({type:"spacing",htmlBuilder:function(e,t){if(Mn.hasOwnProperty(e.text)){var r=Mn[e.text].className||"";if("text"===e.mode){var a=Ke.makeOrd(e,t,"textord");return a.classes.push(r),a}return Ke.makeSpan(["mspace",r],[Ke.mathsym(e.text,e.mode,t)],t)}if(Sn.hasOwnProperty(e.text))return Ke.makeSpan(["mspace",Sn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if(!Mn.hasOwnProperty(e.text)){if(Sn.hasOwnProperty(e.text))return new Tt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return new Tt.MathNode("mtext",[new Tt.TextNode("\xa0")])}});var zn=function(){var e=new Tt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};st({type:"tag",mathmlBuilder:function(e,t){var r=new Tt.MathNode("mtable",[new Tt.MathNode("mtr",[zn(),new Tt.MathNode("mtd",[It(e.body,t)]),zn(),new Tt.MathNode("mtd",[It(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var An={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Tn={"\\textbf":"textbf","\\textmd":"textmd"},Bn={"\\textit":"textit","\\textup":"textup"},Cn=function(e,t){var r=e.font;return r?An[r]?t.withTextFontFamily(An[r]):Tn[r]?t.withTextFontWeight(Tn[r]):t.withTextFontShape(Bn[r]):t};ot({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"text",mode:r.mode,body:ht(a),font:n}},htmlBuilder:function(e,t){var r=Cn(e,t),n=ft(e.body,r,!0);return Ke.makeSpan(["mord","text"],n,r)},mathmlBuilder:function(e,t){var r=Cn(e,t);return It(e.body,r)}}),ot({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=Ke.makeLineSpan("underline-line",t),a=t.fontMetrics().defaultRuleThickness,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a},{type:"elem",elem:n},{type:"kern",size:3*a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","underline"],[i],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[new Tt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Tt.MathNode("munder",[Rt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),ot({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(e,t){return{type:"vcenter",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=t.fontMetrics().axisHeight,a=.5*(r.height-n-(r.depth+n));return Ke.makeVList({positionType:"shift",positionData:a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){return new Tt.MathNode("mpadded",[Rt(e.body,t)],["vcenter"])}}),ot({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var r=qn(e),n=[],a=t.havingStyle(t.style.text()),i=0;i0;)this.endGroup()},t.has=function(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)},t.get=function(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]},t.set=function(e,t,r){if(void 0===r&&(r=!1),r){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t},e}(),Hn=Hr;Er("\\noexpand",(function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Er("\\expandafter",(function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Er("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Er("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Er("\\@ifnextchar",(function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Er("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Er("\\TextOrMath",(function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));var En={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Er("\\char",(function(e){var t,r=e.popToken(),a="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");a=r.text.charCodeAt(0)}else t=10;if(t){if(null==(a=En[r.text])||a>=t)throw new n("Invalid base-"+t+" digit "+r.text);for(var i;null!=(i=En[e.future().text])&&i":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Er("\\dots",(function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in Dn?t=Dn[r]:("\\not"===r.substr(0,4)||r in ae.math&&l.contains(["bin","rel"],ae.math[r].group))&&(t="\\dotsb"),t}));var Pn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Er("\\dotso",(function(e){return e.future().text in Pn?"\\ldots\\,":"\\ldots"})),Er("\\dotsc",(function(e){var t=e.future().text;return t in Pn&&","!==t?"\\ldots\\,":"\\ldots"})),Er("\\cdots",(function(e){return e.future().text in Pn?"\\@cdots\\,":"\\@cdots"})),Er("\\dotsb","\\cdots"),Er("\\dotsm","\\cdots"),Er("\\dotsi","\\!\\cdots"),Er("\\dotsx","\\ldots\\,"),Er("\\DOTSI","\\relax"),Er("\\DOTSB","\\relax"),Er("\\DOTSX","\\relax"),Er("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Er("\\,","\\tmspace+{3mu}{.1667em}"),Er("\\thinspace","\\,"),Er("\\>","\\mskip{4mu}"),Er("\\:","\\tmspace+{4mu}{.2222em}"),Er("\\medspace","\\:"),Er("\\;","\\tmspace+{5mu}{.2777em}"),Er("\\thickspace","\\;"),Er("\\!","\\tmspace-{3mu}{.1667em}"),Er("\\negthinspace","\\!"),Er("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Er("\\negthickspace","\\tmspace-{5mu}{.277em}"),Er("\\enspace","\\kern.5em "),Er("\\enskip","\\hskip.5em\\relax"),Er("\\quad","\\hskip1em\\relax"),Er("\\qquad","\\hskip2em\\relax"),Er("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Er("\\tag@paren","\\tag@literal{({#1})}"),Er("\\tag@literal",(function(e){if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Er("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Er("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Er("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Er("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Er("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),Er("\\newline","\\\\\\relax"),Er("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Fn=V(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Er("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Er("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Er("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Er("\\@hspace","\\hskip #1\\relax"),Er("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Er("\\ordinarycolon",":"),Er("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Er("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Er("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Er("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Er("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Er("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Er("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Er("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Er("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Er("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Er("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Er("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Er("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Er("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Er("\u2237","\\dblcolon"),Er("\u2239","\\eqcolon"),Er("\u2254","\\coloneqq"),Er("\u2255","\\eqqcolon"),Er("\u2a74","\\Coloneqq"),Er("\\ratio","\\vcentcolon"),Er("\\coloncolon","\\dblcolon"),Er("\\colonequals","\\coloneqq"),Er("\\coloncolonequals","\\Coloneqq"),Er("\\equalscolon","\\eqqcolon"),Er("\\equalscoloncolon","\\Eqqcolon"),Er("\\colonminus","\\coloneq"),Er("\\coloncolonminus","\\Coloneq"),Er("\\minuscolon","\\eqcolon"),Er("\\minuscoloncolon","\\Eqcolon"),Er("\\coloncolonapprox","\\Colonapprox"),Er("\\coloncolonsim","\\Colonsim"),Er("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Er("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Er("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Er("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Er("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Er("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Er("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Er("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Er("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Er("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Er("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Er("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Er("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Er("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Er("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Er("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Er("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Er("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Er("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Er("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Er("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Er("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Er("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Er("\\imath","\\html@mathml{\\@imath}{\u0131}"),Er("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Er("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Er("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Er("\u27e6","\\llbracket"),Er("\u27e7","\\rrbracket"),Er("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Er("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Er("\u2983","\\lBrace"),Er("\u2984","\\rBrace"),Er("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Er("\u29b5","\\minuso"),Er("\\darr","\\downarrow"),Er("\\dArr","\\Downarrow"),Er("\\Darr","\\Downarrow"),Er("\\lang","\\langle"),Er("\\rang","\\rangle"),Er("\\uarr","\\uparrow"),Er("\\uArr","\\Uparrow"),Er("\\Uarr","\\Uparrow"),Er("\\N","\\mathbb{N}"),Er("\\R","\\mathbb{R}"),Er("\\Z","\\mathbb{Z}"),Er("\\alef","\\aleph"),Er("\\alefsym","\\aleph"),Er("\\Alpha","\\mathrm{A}"),Er("\\Beta","\\mathrm{B}"),Er("\\bull","\\bullet"),Er("\\Chi","\\mathrm{X}"),Er("\\clubs","\\clubsuit"),Er("\\cnums","\\mathbb{C}"),Er("\\Complex","\\mathbb{C}"),Er("\\Dagger","\\ddagger"),Er("\\diamonds","\\diamondsuit"),Er("\\empty","\\emptyset"),Er("\\Epsilon","\\mathrm{E}"),Er("\\Eta","\\mathrm{H}"),Er("\\exist","\\exists"),Er("\\harr","\\leftrightarrow"),Er("\\hArr","\\Leftrightarrow"),Er("\\Harr","\\Leftrightarrow"),Er("\\hearts","\\heartsuit"),Er("\\image","\\Im"),Er("\\infin","\\infty"),Er("\\Iota","\\mathrm{I}"),Er("\\isin","\\in"),Er("\\Kappa","\\mathrm{K}"),Er("\\larr","\\leftarrow"),Er("\\lArr","\\Leftarrow"),Er("\\Larr","\\Leftarrow"),Er("\\lrarr","\\leftrightarrow"),Er("\\lrArr","\\Leftrightarrow"),Er("\\Lrarr","\\Leftrightarrow"),Er("\\Mu","\\mathrm{M}"),Er("\\natnums","\\mathbb{N}"),Er("\\Nu","\\mathrm{N}"),Er("\\Omicron","\\mathrm{O}"),Er("\\plusmn","\\pm"),Er("\\rarr","\\rightarrow"),Er("\\rArr","\\Rightarrow"),Er("\\Rarr","\\Rightarrow"),Er("\\real","\\Re"),Er("\\reals","\\mathbb{R}"),Er("\\Reals","\\mathbb{R}"),Er("\\Rho","\\mathrm{P}"),Er("\\sdot","\\cdot"),Er("\\sect","\\S"),Er("\\spades","\\spadesuit"),Er("\\sub","\\subset"),Er("\\sube","\\subseteq"),Er("\\supe","\\supseteq"),Er("\\Tau","\\mathrm{T}"),Er("\\thetasym","\\vartheta"),Er("\\weierp","\\wp"),Er("\\Zeta","\\mathrm{Z}"),Er("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Er("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Er("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Er("\\bra","\\mathinner{\\langle{#1}|}"),Er("\\ket","\\mathinner{|{#1}\\rangle}"),Er("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Er("\\Bra","\\left\\langle#1\\right|"),Er("\\Ket","\\left|#1\\right\\rangle"),Er("\\angln","{\\angl n}"),Er("\\blue","\\textcolor{##6495ed}{#1}"),Er("\\orange","\\textcolor{##ffa500}{#1}"),Er("\\pink","\\textcolor{##ff00af}{#1}"),Er("\\red","\\textcolor{##df0030}{#1}"),Er("\\green","\\textcolor{##28ae7b}{#1}"),Er("\\gray","\\textcolor{gray}{#1}"),Er("\\purple","\\textcolor{##9d38bd}{#1}"),Er("\\blueA","\\textcolor{##ccfaff}{#1}"),Er("\\blueB","\\textcolor{##80f6ff}{#1}"),Er("\\blueC","\\textcolor{##63d9ea}{#1}"),Er("\\blueD","\\textcolor{##11accd}{#1}"),Er("\\blueE","\\textcolor{##0c7f99}{#1}"),Er("\\tealA","\\textcolor{##94fff5}{#1}"),Er("\\tealB","\\textcolor{##26edd5}{#1}"),Er("\\tealC","\\textcolor{##01d1c1}{#1}"),Er("\\tealD","\\textcolor{##01a995}{#1}"),Er("\\tealE","\\textcolor{##208170}{#1}"),Er("\\greenA","\\textcolor{##b6ffb0}{#1}"),Er("\\greenB","\\textcolor{##8af281}{#1}"),Er("\\greenC","\\textcolor{##74cf70}{#1}"),Er("\\greenD","\\textcolor{##1fab54}{#1}"),Er("\\greenE","\\textcolor{##0d923f}{#1}"),Er("\\goldA","\\textcolor{##ffd0a9}{#1}"),Er("\\goldB","\\textcolor{##ffbb71}{#1}"),Er("\\goldC","\\textcolor{##ff9c39}{#1}"),Er("\\goldD","\\textcolor{##e07d10}{#1}"),Er("\\goldE","\\textcolor{##a75a05}{#1}"),Er("\\redA","\\textcolor{##fca9a9}{#1}"),Er("\\redB","\\textcolor{##ff8482}{#1}"),Er("\\redC","\\textcolor{##f9685d}{#1}"),Er("\\redD","\\textcolor{##e84d39}{#1}"),Er("\\redE","\\textcolor{##bc2612}{#1}"),Er("\\maroonA","\\textcolor{##ffbde0}{#1}"),Er("\\maroonB","\\textcolor{##ff92c6}{#1}"),Er("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Er("\\maroonD","\\textcolor{##ca337c}{#1}"),Er("\\maroonE","\\textcolor{##9e034e}{#1}"),Er("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Er("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Er("\\purpleC","\\textcolor{##aa87ff}{#1}"),Er("\\purpleD","\\textcolor{##7854ab}{#1}"),Er("\\purpleE","\\textcolor{##543b78}{#1}"),Er("\\mintA","\\textcolor{##f5f9e8}{#1}"),Er("\\mintB","\\textcolor{##edf2df}{#1}"),Er("\\mintC","\\textcolor{##e0e5cc}{#1}"),Er("\\grayA","\\textcolor{##f6f7f7}{#1}"),Er("\\grayB","\\textcolor{##f0f1f2}{#1}"),Er("\\grayC","\\textcolor{##e3e5e6}{#1}"),Er("\\grayD","\\textcolor{##d6d8da}{#1}"),Er("\\grayE","\\textcolor{##babec2}{#1}"),Er("\\grayF","\\textcolor{##888d93}{#1}"),Er("\\grayG","\\textcolor{##626569}{#1}"),Er("\\grayH","\\textcolor{##3b3e40}{#1}"),Er("\\grayI","\\textcolor{##21242c}{#1}"),Er("\\kaBlue","\\textcolor{##314453}{#1}"),Er("\\kaGreen","\\textcolor{##71B307}{#1}");var Vn={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Gn=function(){function e(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new On(Hn,t.macros),this.mode=r,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new Rn(e,this.settings)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.endGroups=function(){this.macros.endGroups()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.scanArgument=function(e){var t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken();var a=this.consumeArg(["]"]);n=a.tokens,r=a.end}else{var i=this.consumeArg();n=i.tokens,t=i.start,r=i.end}return this.pushToken(new Dr("EOF",r.loc)),this.pushTokens(n),t.range(r,"")},t.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},t.consumeArg=function(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,i=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new n("Extra }",a)}else if("EOF"===a.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===i.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:i,end:a}},t.consumeArgs=function(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;athis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting");var i=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(i=i.slice()).length-1;s>=0;--s){var l=i[s];if("#"===l.text){if(0===s)throw new n("Incomplete placeholder at end of macro body",l);if("#"===(l=i[--s]).text)i.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new n("Not a valid argument number",l);var h;(h=i).splice.apply(h,[s,2].concat(o[+l.text-1]))}}}return this.pushTokens(i),i},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof Dr)return e.treatAsRelax&&(e.text="\\relax"),this.stack.pop()}throw new Error},t.expandMacro=function(e){return this.macros.has(e)?this.expandTokens([new Dr(e)]):void 0},t.expandTokens=function(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;){var n=this.expandOnce(!0);n instanceof Dr&&(n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(this.stack.pop()))}return t},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map((function(e){return e.text})).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var n="function"==typeof t?t(this):t;if("string"==typeof n){var a=0;if(-1!==n.indexOf("#"))for(var i=n.replace(/##/g,"");-1!==i.indexOf("#"+(a+1));)++a;for(var o=new Rn(n,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:a}}return n},t.isDefined=function(e){return this.macros.has(e)||Nn.hasOwnProperty(e)||ae.math.hasOwnProperty(e)||ae.text.hasOwnProperty(e)||Vn.hasOwnProperty(e)},t.isExpandable=function(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Nn.hasOwnProperty(e)&&!Nn[e].primitive},e}(),Un={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Yn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Xn=function(){function e(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Gn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var t=e.prototype;return t.expect=function(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()},t.consume=function(){this.nextToken=null},t.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},t.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},t.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}},t.subparse=function(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new Dr("}")),this.gullet.pushTokens(e);var r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r},t.parseExpression=function(t,r){for(var n=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==e.endOfExpression.indexOf(a.text))break;if(r&&a.text===r)break;if(t&&Nn[a.text]&&Nn[a.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&n.push(i)}return"text"===this.mode&&this.formLigatures(n),this.handleInfixNodes(n)},t.handleInfixNodes=function(e){for(var t,r=-1,a=0;a=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var s,l=ae[this.mode][t].group,h=Lr.range(e);if(te.hasOwnProperty(l)){var m=l;s={type:"atom",mode:this.mode,family:m,loc:h,text:t}}else s={type:l,mode:this.mode,loc:h,text:t};i=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),i={type:"textord",mode:"text",loc:Lr.range(e),text:t}}if(this.consume(),o)for(var c=0;c *:first-child { + /* This make the first thing in the preamble align with the sidebar */ + padding-top: 0; + margin-top: 0; +} + +header { + margin-bottom: 30px; +} + +header.odoc-preamble { + grid-column: 2; + grid-row: 3; +} + +nav { + font-family: "Fira Sans", sans-serif; +} + +nav.odoc-nav { + grid-column: 2; + grid-row: 2; +} + +/* Basic markup elements */ + +b, strong { + font-weight: bold; +} + +i { + font-style: italic; +} + +em, i em.odd{ + font-style: italic; +} + +em.odd, i em { + font-style: normal; +} + +sup { + vertical-align: super; +} + +sub { + vertical-align: sub; +} + +sup, sub { + font-size: 12px; + line-height: 0; + margin-left: 0.2ex; +} + +ul, ol { + list-style-position: outside +} + +ul>li { + margin-left: 22px; +} + +ol>li { + margin-left: 27.2px; +} + +li>*:first-child { + margin-top: 0 +} + +/* Text alignements, this should be forbidden. */ + +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +/* Links and anchors */ + +a { + text-decoration: none; + color: var(--link-color); +} + +.odoc-src pre a { + color: inherit; +} + +a:hover { + box-shadow: 0 1px 0 0 var(--link-color); +} + +/* Linked highlight */ +*:target { + background-color: var(--target-background) !important; + box-shadow: 0 0px 0 1px var(--target-shadow) !important; + border-radius: 1px; +} + +*:hover > a.anchor { + visibility: visible; +} + +a.anchor:before { + content: "#"; +} + +a.anchor:hover { + box-shadow: none; + text-decoration: none; + color: var(--anchor-hover); +} + +a.anchor { + visibility: hidden; + position: absolute; + /* top: 0px; */ + /* margin-left: -3ex; */ + margin-left: -1.3em; + font-weight: normal; + font-style: normal; + padding-right: 0.4em; + padding-left: 0.4em; + /* To remain selectable */ + color: var(--anchor-color); +} + +.spec > a.anchor { + margin-left: -2.3em; + padding-right: 0.9em; +} + +.xref-unresolved { + color: #2C94BD; +} +.xref-unresolved:hover { + box-shadow: 0 1px 0 0 var(--xref-shadow); +} + +/* Source links float inside preformated text or headings. */ +a.source_link { + float: right; + color: var(--source-color); + font-family: "Fira Sans", sans-serif; + font-size: initial; +} + +/* Section and document divisions. + Until at least 4.03 many of the modules of the stdlib start at .h7, + we restart the sequence there like h2 */ + +h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 { + font-family: "Fira Sans", sans-serif; + font-weight: 400; + padding-top: 0.1em; + line-height: 1.2; + overflow-wrap: break-word; +} + +.odoc-preamble h1 { + margin-top: 10px; +} + +h1 { + font-weight: 500; + font-size: 2.441em; +} + +h1 { + font-weight: 500; + font-size: 1.953em; + box-shadow: 0 1px 0 0 var(--header-shadow); +} + +h2 { + font-size: 1.563em; +} + +h3 { + font-size: 1.25em; +} + +small, .font_small { + font-size: 0.8em; +} + +h1 code, h1 tt { + font-size: inherit; + font-weight: inherit; +} + +h2 code, h2 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h4 { + font-size: 1.12em; +} + +/* Comment delimiters, hidden but accessible to screen readers and + selected for copy/pasting */ + +/* Taken from bootstrap */ +/* See also https://stackoverflow.com/a/27769435/4220738 */ +.comment-delim { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Preformatted and code */ + +tt, code, pre { + font-family: "Fira Mono", monospace; + font-weight: 400; +} + +.odoc pre { + padding: 0.1em; + border: 1px solid var(--pre-border-color); + border-radius: 5px; + overflow-x: auto; +} + +.odoc p code, +.odoc li code { + background-color: var(--li-code-background); + color: var(--li-code-color); + border-radius: 3px; + padding: 0 0.3ex; +} + +p a > code, li a > code { + color: var(--link-color); +} + +.odoc code { + white-space: pre-wrap; +} + +/* Code blocks (e.g. Examples) */ + +.odoc pre code { + font-size: 0.893rem; +} + +/* Code lexemes */ + +.keyword { + font-weight: 500; +} + +.arrow { white-space: nowrap } + +/* Module member specification */ + +.spec { + background-color: var(--spec-summary-background); + border-radius: 3px; + border-left: 4px solid var(--spec-summary-border-color); + border-right: 5px solid transparent; + padding: 0.35em 0.5em; +} + +.spec .label, .spec .optlabel { + color: var(--spec-label-color); +} + +li:not(:last-child) > .def-doc { + margin-bottom: 15px; +} + +/* Spacing between items */ +div.odoc-spec,.odoc-include { + margin-bottom: 2em; +} + +.spec.type .variant p, .spec.type .record p { + margin: 5px; +} + +.spec.type .variant, .spec.type .record { + margin-left: 2ch; +} + +.spec.type li.variant, .spec.type li.record { + list-style: none; +} + +.spec.type .record > code, .spec.type .variant > code { + min-width: 40%; +} + +.spec.type > ol { + margin-top: 0; + margin-bottom: 0; +} + +.spec.type .record > .def-doc, .spec.type .variant > .def-doc { + min-width:50%; + padding: 0.25em 0.5em; + margin-left: 10%; + border-radius: 3px; + background: var(--main-background); + box-shadow: 1px 1px 2px lightgrey; +} + +div.def { + margin-top: 0; + text-indent: -2ex; + padding-left: 2ex; +} + +div.def-doc>*:first-child { + margin-top: 0; +} + +/* Collapsible inlined include and module */ + +.odoc-include details { + position: relative; +} + +.odoc-include.shadowed-include { + display: none; +} + +.odoc-include details:after { + z-index: -100; + display: block; + content: " "; + position: absolute; + border-radius: 0 1ex 1ex 0; + right: -20px; + top: 1px; + bottom: 1px; + width: 15px; + background: var(--spec-details-after-background, rgba(0, 4, 15, 0.05)); + box-shadow: 0 0px 0 1px var(--spec-details-after-shadow, rgba(204, 204, 204, 0.53)); +} + +.odoc-include summary { + position: relative; + margin-bottom: 1em; + cursor: pointer; + outline: none; +} + +.odoc-include summary:hover { + background-color: var(--spec-summary-hover-background); +} + +/* FIXME: Does not work in Firefox. */ +.odoc-include summary::-webkit-details-marker { + color: #888; + transform: scaleX(-1); + position: absolute; + top: calc(50% - 5px); + height: 11px; + right: -29px; +} + +/* Records and variants FIXME */ + +div.def table { + text-indent: 0em; + padding: 0; + margin-left: -2ex; +} + +td.def { + padding-left: 2ex; +} + +td.def-doc *:first-child { + margin-top: 0em; +} + +/* Lists of @tags */ + +.at-tags { list-style-type: none; margin-left: -3ex; } +.at-tags li { padding-left: 3ex; text-indent: -3ex; } +.at-tags .at-tag { text-transform: capitalize } + +/* Alert emoji */ + +.alert::before, .deprecated::before { + content: '⚠️ '; +} + +/* Lists of modules */ + +.modules { list-style-type: none; margin-left: -3ex; } +.modules li { padding-left: 3ex; text-indent: -3ex; margin-top: 5px } +.modules .synopsis { padding-left: 1ch; } + +/* Odig package index */ + +.packages { list-style-type: none; margin-left: -3ex; } +.packages li { padding-left: 3ex; text-indent: -3ex } +.packages li a.anchor { padding-right: 0.5ch; padding-left: 3ch; } +.packages .version { font-size: 10px; color: var(--by-name-version-color); } +.packages .synopsis { padding-left: 1ch } + +.by-name nav a { + text-transform: uppercase; + font-size: 18px; + margin-right: 1ex; + color: var(--by-name-nav-link-color,); + display: inline-block; +} + +.by-tag nav a { + margin-right: 1ex; + color: var(--by-name-nav-link-color); + display: inline-block; +} + +.by-tag ol { list-style-type: none; } +.by-tag ol.tags li { margin-left: 1ch; display: inline-block } +.by-tag td:first-child { text-transform: uppercase; } + +/* Odig package page */ + +.package nav { + display: inline; + font-size: 14px; + font-weight: normal; +} + +.package .version { + font-size: 14px; +} + +.package.info { + margin: 0; +} + +.package.info td:first-child { + font-style: italic; + padding-right: 2ex; +} + +.package.info ul { + list-style-type: none; + display: inline; + margin: 0; +} + +.package.info li { + display: inline-block; + margin: 0; + margin-right: 1ex; +} + +#info-authors li, #info-maintainers li { + display: block; +} + +/* Sidebar and TOC */ + +.odoc-toc:before { + display: block; + content: "Contents"; + text-transform: uppercase; + font-size: 1em; + margin: 1.414em 0 0.5em; + font-weight: 500; + color: var(--toc-before-color); + line-height: 1.2; +} + +/* When a search bar is present, we need the sticky sidebar to be a bit lower, + so `top` is higher */ + +.odoc-search + * + .odoc-toc { + --toc-top: calc(var(--search-bar-height) + var(--search-padding-top) + 20px); + max-height: calc(100vh - 2 * var(--toc-top)); + top: var(--toc-top) +} + +.odoc-toc { + --toc-top: 20px; + width: 28ex; + background: var(--toc-background); + overflow: auto; + color: var(--toc-color); + padding-left: 2ex; + padding-right: 2ex; + grid-row-start: 3; + grid-row-end: 5; + grid-column: 1; + height: fit-content; + border: solid 1px var(--border); + border-radius: 5px; + position:sticky; + max-height: calc(100vh - 2 * var(--toc-top)); + top: var(--toc-top) +} + +.odoc-toc ul li a { + font-family: "Fira Sans", sans-serif; + font-size: 0.95em; + color: var(--color); + font-weight: 400; + line-height: 1.2em; + display: block; +} + +.odoc-sidebar ul li a:hover { + box-shadow: none; + text-decoration: underline; +} + +:root { + --search-bar-height: 25px; + --search-padding-top: 1rem; +} + +.odoc-search { + position: sticky; + top: 0; + background: var(--main-background); + /* This amounts to fit-content when the search is not active, but when you + have the search results displayed, you do not want the height of the search + container to change. */ + height: calc(var(--search-bar-height) + var(--search-padding-top)); + width: 100%; + padding-top: var(--search-padding-top); + z-index: 1; + grid-row: 1; + grid-column-start: 1; + grid-column-end: 3; +} + + +.odoc-search .search-inner { + width: 100%; + position: relative; + left: 0; + display: grid; + /* The second column is for the search snake, which has 0 width */ + grid-template-columns: 1fr 0fr; + grid-row-gap: 1rem; + /* The second row is for the search results. It has a width, but only */ + grid-template-rows: min-content 0px; + background: transparent; +} + +.odoc-search .search-bar { + position: relative; + z-index: 2; + font-size: 1em; + transition: font-size 0.3s; + box-shadow: 0px 0px 0.2rem 0.3em var(--main-background); + height: var(--search-bar-height); +} + +.odoc-search:focus-within .search-bar { + font-size: 1.1em; +} + +.odoc-search:not(:focus-within) .search-result { + display: none; +} + +.odoc-search .search-result:empty { + display: none; +} + +.odoc-search .search-result { + grid-row: 2; + background: var(--toc-background); + position: absolute; + left: 0; + right: 0; + border: solid; + border-color: var(--search-results-border); + border-width: 1px; + border-radius: 6px; + box-shadow: 0 3px 10px 2px var(--search-results-shadow), 0 0 3px 4px var(--main-background), 0px -1rem 0px 0px var(--main-background); + /* Works better on smallish screens with this */ + max-height: calc(min(40rem, 50vh)); + overflow-y: auto; +} + +.search-bar { + /* inputs are of fixed size by default, even if you display:block them */ + width: 100%; +} + + +.odoc-search .search-no-result { + color: var(--color); + border-bottom: var(--search-results-border) solid 1px; + background-color: inherit; + outline: 0; + padding: 10px; + padding-right: 0.5rem; +} + +.search-bar-container { + display: flex; + align-items: stretch; + border-bottom: 1rem solid var(--main-background); +} + +.search-snake { + grid-row: 1; + grid-column: 2; + display: flex; + align-items: center; + width: 0; + z-index: 2; + position: relative; + left: 0; + margin-top: 4px; + margin-bottom: 4px; + /* Otherwise the search snake flickers for very fast searches. */ + transition: opacity 0.2s; + opacity: 0; +} + +.search-snake.search-busy { + opacity: 1; +} + +.search-snake:before { + content: " "; + display: block; + aspect-ratio: 1 / 1; + height: 100%; + margin-right: 4px; + border-radius: 50%; + border: 3px solid #aaa; + border-color: var(--search-snake) transparent var(--search-snake) transparent; + animation: search-snake 1.2s linear infinite; + position: absolute; + right: 0; +} + +@keyframes search-snake { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +:root { + --kind-font-size-factor: 0.8; +} + +.odoc-search .search-entry { + color: var(--color); + display: grid; + /* Possible kinds are the following : + "doc" "type" "mod" "exn" "class" "meth" "cons" "sig" "cons" "field" "val" + and "ext". + As the longest is 5 characters (and the font monospace), we give 5 + character size to the column. However the font used for kind is a little + smaller, so we adjust by this factor. + */ + grid-template-columns: [kinds] calc(var(--kind-font-size-factor) * 5ch) [titles] 1fr; + column-gap: 0.5rem; + border-bottom: var(--search-results-border) solid 1px; + background-color: inherit; + outline: 0; + padding: 0.4rem 0.4rem 0.7rem 0.7rem; +} +.odoc-search .search-entry p { + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.odoc-search .search-entry:focus-visible { + box-shadow: none; + background-color: var(--target-background); +} + +.odoc-search .search-entry:hover { + box-shadow: none; + background-color: var(--toc-background-emph); +} + +.odoc-search .search-entry .entry-kind { + grid-row: 1/2; + grid-column: 1/2; + line-height: 1.4rem; + font-size: calc(var(--kind-font-size-factor) * 1em); + font-weight: bold; + text-align: right; + position: relative; + bottom: 0; +} + +.odoc-search .search-entry pre { + border: none; + margin: 0; +} + +.odoc-search .search-entry pre code { + font-size: 1em; + background-color: var(--li-code-background); + color: var(--li-code-color); + border-radius: 3px; + padding: 0 0.3ex; +} + +.odoc-search .search-entry .entry-title { + width: 100%; + display: block; + grid-column: 2/2; + grid-row: 1/2; + align-self: end; + line-height: 1.4rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.odoc-search .entry-name { + font-weight: bold; +} + +.odoc-search .prefix-name { + font-weight: bold; +} + +.odoc-search .search-entry .prefix-name { + opacity: 0.7; +} + +.odoc-search .entry-rhs { + white-space: nowrap; +} + +.odoc-search .search-entry .entry-content { + flex-grow: 1; + flex-shrink: 1; + min-width: 0; +} + +.odoc-search .search-entry .entry-comment { + max-height: 1.5em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.95em; + grid-row: 2/2; + grid-column: 2/2; +} + +.odoc-search .search-entry .entry-comment ul { + white-space: nowrap; + display: inline; +} + +.odoc-search .search-entry .entry-comment li { + display: inline; + white-space: nowrap; +} + +.odoc-search .search-entry .entry-comment ul>li::before { + content: '•'; +} + +.odoc-search .search-entry .entry-comment div { + display: inline; + white-space: nowrap; +} + +.odoc-search .search-entry .entry-comment p { + display: inline; + white-space: nowrap; +} + +.odoc-search .search-entry .entry-comment code { + display: inline; + white-space: nowrap; +} + +/* First level titles */ + +.odoc-toc>ul>li>a { + font-weight: 500; +} + +.odoc-toc li ul { + margin: 0px; + padding-top: 0.25em; +} + +.odoc-toc ul { + list-style-type: none; +} + +.odoc-toc ul li { + padding: 0.25em 0; +} + +.odoc-toc>ul>li { + margin-bottom: 0.3em; +} + +.odoc-toc ul li li { + border-left: 1px solid var(--toc-list-border); + margin-left: 5px; + padding-left: 12px; +} + +/* Tables */ + +.odoc-table { + margin: 1em; +} + +.odoc-table td, +.odoc-table th { + padding-left: 0.5em; + padding-right: 0.5em; + border: 1px solid black; +} + +.odoc-table th { + font-weight: bold; +} + +/* Mobile adjustements. */ + +@media only screen and (max-width: 110ex) { + body { + margin: 2em; + padding: 0; + } + + body.odoc { + display: block; + } + + .odoc-toc { + position: static; + width: auto; + min-width: unset; + max-width: unset; + border: none; + padding: 0.2em 1em; + border-radius: 5px; + margin-bottom: 2em; + } +} + +/* Print adjustements. */ + +@media print { + body { + color: black; + background: white; + } + + body nav:first-child { + visibility: hidden; + } +} + +/* Source code. */ + +.source_container { + display: flex; +} + +.source_line_column { + padding-right: 0.5em; + text-align: right; + background: #eee8d5; +} + +.source_line { + padding: 0 1em; +} + +.source_code { + flex-grow: 1; + background: #fdf6e3; + padding: 0 0.3em; + color: #657b83; +} + +/* Source directories */ + +.odoc-directory::before { + content: "📁"; + margin: 0.3em; + font-size: 1.3em; +} + +.odoc-file::before { + content: "📄"; + margin: 0.3em; + font-size: 1.3em; +} + +.odoc-folder-list { + list-style: none; +} + +/* Syntax highlighting (based on github-gist) */ + +.hljs { + display: block; + background: var(--code-background); + padding: 0.5em; + color: var(--color); + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #a71d5d; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: 500; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +.VAL, +.TYPE, +.LET, +.REC, +.IN, +.OPEN, +.NONREC, +.MODULE, +.METHOD, +.LETOP, +.INHERIT, +.INCLUDE, +.FUNCTOR, +.EXTERNAL, +.CONSTRAINT, +.ASSERT, +.AND, +.END, +.CLASS, +.STRUCT, +.SIG { + color: #859900; + ; +} + +.WITH, +.WHILE, +.WHEN, +.VIRTUAL, +.TRY, +.TO, +.THEN, +.PRIVATE, +.OF, +.NEW, +.MUTABLE, +.MATCH, +.LAZY, +.IF, +.FUNCTION, +.FUN, +.FOR, +.EXCEPTION, +.ELSE, +.TO, +.DOWNTO, +.DO, +.DONE, +.BEGIN, +.AS { + color: #cb4b16; +} + +.TRUE, +.FALSE { + color: #b58900; +} + +.failwith, +.INT, +.SEMISEMI, +.LIDENT { + color: #2aa198; +} + +.STRING, +.CHAR, +.UIDENT { + color: #b58900; +} + +.DOCSTRING { + color: #268bd2; +} + +.COMMENT { + color: #93a1a1; +} + +/*--------------------------------------------------------------------------- + Copyright (c) 2016 The odoc contributors + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + ---------------------------------------------------------------------------*/ \ No newline at end of file diff --git a/odoc.support/odoc_search.js b/odoc.support/odoc_search.js new file mode 100644 index 000000000..0dc659d27 --- /dev/null +++ b/odoc.support/odoc_search.js @@ -0,0 +1,66 @@ +/* The browsers interpretation of the CORS origin policy prevents to run + webworkers from javascript files fetched from the file:// protocol. This hack + is to workaround this restriction. */ +function createWebWorker() { + var searchs = search_urls.map((search_url) => { + let parts = document.location.href.split("/"); + parts[parts.length - 1] = search_url; + return '"' + parts.join("/") + '"'; + }); + blobContents = ["importScripts(" + searchs.join(",") + ");"]; + var blob = new Blob(blobContents, { type: "application/javascript" }); + var blobUrl = URL.createObjectURL(blob); + + var worker = new Worker(blobUrl); + URL.revokeObjectURL(blobUrl); + + return worker; +} + +var worker; +var waiting = 0; + +function wait() { + waiting = waiting + 1; + document.querySelector(".search-snake").classList.add("search-busy"); +} + +function stop_waiting() { + if (waiting > 0) waiting = waiting - 1; + else waiting = 0; + if (waiting == 0) { + document.querySelector(".search-snake").classList.remove("search-busy"); + } +} + +document.querySelector(".search-bar").addEventListener("focus", (ev) => { + if (typeof worker == "undefined") { + worker = createWebWorker(); + worker.onmessage = (e) => { + stop_waiting(); + let results = e.data; + let search_results = document.querySelector(".search-result"); + search_results.innerHTML = ""; + let f = (entry) => { + let search_result = document.createElement("a"); + search_result.classList.add("search-entry"); + search_result.href = base_url + entry.url; + search_result.innerHTML = entry.html; + search_results.appendChild(search_result); + }; + results.forEach(f); + let search_request = document.querySelector(".search-bar").value; + if (results.length == 0 && search_request != "") { + let no_result = document.createElement("div"); + no_result.classList.add("search-no-result"); + no_result.innerText = "No result..."; + search_results.appendChild(no_result); + } + }; + } +}); + +document.querySelector(".search-bar").addEventListener("input", (ev) => { + wait(); + worker.postMessage(ev.target.value); +}); diff --git a/stanc/Analysis_and_optimization/Dataflow_types/index.html b/stanc/Analysis_and_optimization/Dataflow_types/index.html new file mode 100644 index 000000000..9f8ac9d00 --- /dev/null +++ b/stanc/Analysis_and_optimization/Dataflow_types/index.html @@ -0,0 +1,19 @@ + +Dataflow_types (stanc.Analysis_and_optimization.Dataflow_types)

Module Analysis_and_optimization.Dataflow_types

type label = int

A label is a unique identifier for a node in the dataflow/dependency graph, and often corresponds to one node in the Mir.

val label_of_sexp : Sexplib0.Sexp.t -> label
val sexp_of_label : label -> Sexplib0.Sexp.t
val hash_fold_label : + Ppx_hash_lib.Std.Hash.state -> + label -> + Ppx_hash_lib.Std.Hash.state
val hash_label : label -> Ppx_hash_lib.Std.Hash.hash_value
val compare_label : label -> label -> int
type vexpr =
  1. | VVar of string

Representation of an expression that can be assigned to. This should also be able to represent indexed variables, but we don't support that yet.

val vexpr_of_sexp : Sexplib0.Sexp.t -> vexpr
val sexp_of_vexpr : vexpr -> Sexplib0.Sexp.t
val hash_fold_vexpr : + Ppx_hash_lib.Std.Hash.state -> + vexpr -> + Ppx_hash_lib.Std.Hash.state
val hash_vexpr : vexpr -> Ppx_hash_lib.Std.Hash.hash_value
val compare_vexpr : vexpr -> vexpr -> int
type reaching_defn = vexpr * label

A 'reaching definition' (or reaching_defn or RD) statement (v, l) says that the variable v could have been affected at the label l.

val reaching_defn_of_sexp : Sexplib0.Sexp.t -> reaching_defn
val sexp_of_reaching_defn : reaching_defn -> Sexplib0.Sexp.t
val hash_fold_reaching_defn : + Ppx_hash_lib.Std.Hash.state -> + reaching_defn -> + Ppx_hash_lib.Std.Hash.state
val hash_reaching_defn : reaching_defn -> Ppx_hash_lib.Std.Hash.hash_value
val compare_reaching_defn : reaching_defn -> reaching_defn -> int
type source_loc =
  1. | MirNode of Middle.Location_span.t
  2. | StartOfBlock
  3. | TargetTerm of {
    1. term : Middle.Expr.Typed.t;
    2. assignment_label : label;
    }

Description of where a node in the dependency graph came from, where MirNode is the location from an Middle.loc_stmt

val source_loc_of_sexp : Sexplib0.Sexp.t -> source_loc
val sexp_of_source_loc : source_loc -> Sexplib0.Sexp.t
type 'rd_info node_info = {
  1. rd_sets : 'rd_info;
  2. possible_previous : label Core.Set.Poly.t;
  3. rhs_set : vexpr Core.Set.Poly.t;
  4. controlflow : label Core.Set.Poly.t;
  5. loc : source_loc;
}

Information to be collected about each node * rd_sets: Information about how the label effects the reaching definition sets * possible_previous: The set of nodes that could have immediately preceded this node under some execution of the program * rhs_set: The 'right hand side' set of variables that affect the value or behavior of this node * controlflow: The set of control flow nodes that are immediate parents of this node: * The most recent nested if/then or loop, * or the beginning of the function or block if there are no containing branches, * plus the set of relevant continue/return statements, * plus, for loops, any break statements they contain * loc: The location of the Mir node that this node corresponds to, or a description if there is none

val node_info_of_sexp : + 'rd_info. (Sexplib0.Sexp.t -> 'rd_info) -> + Sexplib0.Sexp.t -> + 'rd_info node_info
val sexp_of_node_info : + 'rd_info. ('rd_info -> Sexplib0.Sexp.t) -> + 'rd_info node_info -> + Sexplib0.Sexp.t
type node_info_update = + (reaching_defn Core.Set.Poly.t -> reaching_defn Core.Set.Poly.t) node_info

A node_info, where the reaching definition information takes the form of an update function that maps from the 'entry' set to the 'exit' set, where the entry set is what's true before executing this node and the exit set is true after.

type node_info_fixedpoint = + (reaching_defn Core.Set.Poly.t * reaching_defn Core.Set.Poly.t) node_info

A node_info where the reaching definition information is explicitly written as the entry and exit sets, as after finding the fixed-point solution.

val node_info_fixedpoint_of_sexp : Sexplib0.Sexp.t -> node_info_fixedpoint
val sexp_of_node_info_fixedpoint : node_info_fixedpoint -> Sexplib0.Sexp.t
type traversal_state = {
  1. label_ix : label;
  2. node_info_map : (int, node_info_update) Core.Map.Poly.t;
  3. possible_previous : label Core.Set.Poly.t;
  4. target_terms : label Core.Set.Poly.t;
  5. continues : label Core.Set.Poly.t;
  6. breaks : label Core.Set.Poly.t;
  7. returns : label Core.Set.Poly.t;
  8. rejects : label Core.Set.Poly.t;
}

The state that will be maintained throughout the traversal of the Mir * label_ix: The next label that's free to use * node_info_map: The label information that's been built so far * possible_previous: The set of nodes that could have immediately preceded this point under some execution of the program * target_terms: The set of nodes that correspond to terms added to the target variable * continues: A set of the continue nodes that have been encountered since exiting a loop * breaks: A set of the break nodes that have been encountered since exiting a loop * returns: A set of the return nodes that have been encountered

type cf_state = label

The most recently nested control flow (block start, if/then, or loop)

This isn't included in the traversal_state because it only flows downward through the tree, not across and up like everything else

type dataflow_graph = {
  1. node_info_map : (int, node_info_fixedpoint) Core.Map.Poly.t;
  2. possible_exits : label Core.Set.Poly.t;
  3. probabilistic_nodes : label Core.Set.Poly.t;
}

Everything we need to know to do dependency analysis * node_info_map: Collection of node information * possible_exits: Set of nodes that could be the last to execute under some execution * probabilistic_nodes: Set of nodes corresponding to which can only introduce probabilistic dependencies, such as target terms and reject statements, to be excluded for non-statistical dependency analysis

val dataflow_graph_of_sexp : Sexplib0.Sexp.t -> dataflow_graph
val sexp_of_dataflow_graph : dataflow_graph -> Sexplib0.Sexp.t
type prog_df_graphs = {
  1. tdatab : dataflow_graph;
  2. modelb : dataflow_graph;
  3. gqb : dataflow_graph;
}

Represents the dataflow graphs for each interesting block in the program MIR.

See Middle.prog for block descriptions.

val prog_df_graphs_of_sexp : Sexplib0.Sexp.t -> prog_df_graphs
val sexp_of_prog_df_graphs : prog_df_graphs -> Sexplib0.Sexp.t
diff --git a/stanc/Analysis_and_optimization/Dataflow_utils/index.html b/stanc/Analysis_and_optimization/Dataflow_utils/index.html new file mode 100644 index 000000000..fa12f11f2 --- /dev/null +++ b/stanc/Analysis_and_optimization/Dataflow_utils/index.html @@ -0,0 +1,48 @@ + +Dataflow_utils (stanc.Analysis_and_optimization.Dataflow_utils)

Module Analysis_and_optimization.Dataflow_utils

val union_maps_left : + ('a, 'b) Core.Map.Poly.t -> + ('a, 'b) Core.Map.Poly.t -> + ('a, 'b) Core.Map.Poly.t

Union maps, preserving the left element in a collision

val build_cf_graphs : + ?flatten_loops:bool -> + ?blocks_after_body:bool -> + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * 'm) + Core.Map.Poly.t -> + Dataflow_types.label Core.Set.Poly.t + * (Dataflow_types.label, Dataflow_types.label Core.Set.Poly.t) + Core.Map.Poly.t + * (Dataflow_types.label, Dataflow_types.label Core.Set.Poly.t) + Core.Map.Poly.t

Simultaneously builds the controlflow parent graph, the predecessor graph and the exit set of a statement. It's advantageous to build them together because they both rely on some of the same Break, Continue and Return bookkeeping.

Takes a statement map and returns the triple: (exit set, predecessor graph, controlflow parent graph) where * (exit set, predecessor graph) is the return value of build_predecessor_graph * (controlflow parent graph) is the return value of build_cf_graph

val build_cf_graph : + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * 'm) + Core.Map.Poly.t -> + (Dataflow_types.label, Dataflow_types.label Core.Set.Poly.t) Core.Map.Poly.t

Building the controlflow graph requires a traversal with state that includes continues, breaks, returns and the controlflow graph accumulator. The traversal should be a branching traversal with set unions rather than a forward traversal because continue and return statements shouldn't affect other branches of execution.

val build_predecessor_graph : + ?flatten_loops:bool -> + ?blocks_after_body:bool -> + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * 'm) + Core.Map.Poly.t -> + Dataflow_types.label Core.Set.Poly.t + * (Dataflow_types.label, Dataflow_types.label Core.Set.Poly.t) + Core.Map.Poly.t

Building the predecessor graph requires a traversal with state that includes the current previous nodes and the predecessor graph accumulator. Special cases are made for loops, because they should include the body exits as predecessors to the body, and they should include loop predecessors in their exit sets. I'm not sure if the single re-traversal of the loop body is sufficient or this requires finding a fixed-point.

val build_recursive_statement : + (('e, 's) Middle.Stmt.Fixed.Pattern.t -> 'm -> 's) -> + (Dataflow_types.label, + ('e, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t * 'm) + Core.Map.Poly.t -> + Dataflow_types.label -> + 's

Build a fixed-point data type representation of a statement given a label-map representation.

val is_ctrl_flow : ('a, 'b) Middle.Stmt.Fixed.Pattern.t -> bool

Check if the statement controls the execution of its substatements.

val merge_set_maps : + ('a, 'b Core.Set.Poly.t) Core.Map.Poly.t -> + ('a, 'b Core.Set.Poly.t) Core.Map.Poly.t -> + ('a, 'b Core.Set.Poly.t) Core.Map.Poly.t

Merge two maps whose values are sets, and union the sets when there's a collision.

val generate_map : + 'a Core.Set.Poly.t -> + f:('a -> 'b) -> + ('a, 'b) Core.Map.Poly.t

Generate a Map by applying a function to each element of a key set.

val build_statement_map : + ('s -> ('e, 's) Middle.Stmt.Fixed.Pattern.t) -> + ('s -> 'm) -> + 's -> + (Dataflow_types.label, + ('e, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t * 'm) + Core.Map.Poly.t

The statement map is built by traversing substatements recursively to replace substatements with their labels while building up the substatements' statement maps. Then, the result is the union of the substatement maps with this statement's singleton pair, which is expressed in terms of the new label-containing statement.

diff --git a/stanc/Analysis_and_optimization/Debug_data_generation/index.html b/stanc/Analysis_and_optimization/Debug_data_generation/index.html new file mode 100644 index 000000000..e6bb99740 --- /dev/null +++ b/stanc/Analysis_and_optimization/Debug_data_generation/index.html @@ -0,0 +1,12 @@ + +Debug_data_generation (stanc.Analysis_and_optimization.Debug_data_generation)

Module Analysis_and_optimization.Debug_data_generation

val json_to_mir : + (Middle.Expr.Typed.t Middle.SizedType.t * 'a * string) list -> + Yojson.Basic.t -> + (string, Middle.Expr.Typed.t) Core.Map.Poly.t

Translates Yojson object into a data type that `gen_values_json` understands.

val gen_values_json : + ?new_only:bool -> + ?context:(string, Middle.Expr.Typed.t) Core.Map.Poly.t -> + (Middle.Expr.Typed.t Middle.SizedType.t + * Middle.Expr.Typed.t Middle.Transformation.t + * string) + list -> + (string, Middle.Location_span.t * string) Core.result

Generates values matching the given declarations and formats them as a JSON string. The declarations may depend on additional values supplied in `context`. If `new_only` is true (defaults to false) the output does not include the values in `context`

diff --git a/stanc/Analysis_and_optimization/Dependence_analysis/index.html b/stanc/Analysis_and_optimization/Dependence_analysis/index.html new file mode 100644 index 000000000..274d26ae6 --- /dev/null +++ b/stanc/Analysis_and_optimization/Dependence_analysis/index.html @@ -0,0 +1,46 @@ + +Dependence_analysis (stanc.Analysis_and_optimization.Dependence_analysis)

Module Analysis_and_optimization.Dependence_analysis

~~~~~ TODO ~~~~~ * The interfaces are currently messed up. I think part of the solution is to change the signature of reaching_definitions_mfp in Monotone_framework, which currently requires the full program but shouldn't need the full program. As it stands, stmt_map_dependency_graph does not include data dependencies at all, since it can't use reaching deps, and prog_dependency graph only builds the graph for log_prob, but the user isn't guaranteed to be using the same labeling scheme. * Currently, dependencies on global or uninitialized data are written as depending on node '0'. This should probably be option or some type that indicates global dependence. * Indexed variables are currently handled as monoliths * No probabilistic dependency, I'll do that elsewhere *

type node_dep_info = {
  1. predecessors : Dataflow_types.label Core.Set.Poly.t;
  2. parents : Dataflow_types.label Core.Set.Poly.t;
  3. reaching_defn_entry : Dataflow_types.reaching_defn Core.Set.Poly.t;
  4. reaching_defn_exit : Dataflow_types.reaching_defn Core.Set.Poly.t;
  5. meta : Middle.Location_span.t;
}

Sufficient information about each node to build the dependency graph.

Label dependence doesn't need the exit RD set, but variable dependence does.

val node_immediate_dependencies : + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * node_dep_info) + Core.Map.Poly.t -> + ?blockers:Dataflow_types.vexpr Core.Set.Poly.t -> + Dataflow_types.label -> + Dataflow_types.label Core.Set.Poly.t

Given dependency information for each node, find the 'immediate' dependencies of a node, where 'immediate' means the first-degree control flow parents and the reachable definitions of RHS variables.

Given dependency information for each node, find all of the dependencies of a single node.

val node_vars_dependencies : + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * node_dep_info) + Core.Map.Poly.t -> + ?blockers:Dataflow_types.vexpr Core.Set.Poly.t -> + Dataflow_types.vexpr Core.Set.Poly.t -> + Dataflow_types.label -> + Dataflow_types.label Core.Set.Poly.t

Given dependency information for each node, find all of the dependencies of a set of variables at single node.

'blockers' are variables which will not be traversed.

Build the dependency information for each node in the log_prob section of a program

Build the dependency information for each node in the log_prob section of a program

val all_node_dependencies : + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * node_dep_info) + Core.Map.Poly.t -> + (Dataflow_types.label, Dataflow_types.label Core.Set.Poly.t) Core.Map.Poly.t

Given dependency information for each node, find all of the dependencies of all nodes, effectively building the dependency graph.

This is more efficient than calling node_dependencies on each node individually.

val log_prob_dependency_graph : + Middle.Program.Typed.t -> + (Dataflow_types.label, Dataflow_types.label Core.Set.Poly.t) Core.Map.Poly.t

Build the dependency graph for the log_prob section of a program, where labels correspond to the labels built by statement_map.

val reaching_defn_lookup : + Dataflow_types.reaching_defn Core.Set.Poly.t -> + Dataflow_types.vexpr -> + Dataflow_types.label Core.Set.Poly.t
val mir_uninitialized_variables : + Middle.Program.Typed.t -> + (Middle.Location_span.t * string) Core.Set.Poly.t

Produce a list of uninitialized variables and their label locations, from the flowgraph starting at the given statement

diff --git a/stanc/Analysis_and_optimization/Factor_graph/index.html b/stanc/Analysis_and_optimization/Factor_graph/index.html new file mode 100644 index 000000000..c5f15c2ae --- /dev/null +++ b/stanc/Analysis_and_optimization/Factor_graph/index.html @@ -0,0 +1,56 @@ + +Factor_graph (stanc.Analysis_and_optimization.Factor_graph)

Module Analysis_and_optimization.Factor_graph

type factor =
  1. | TargetTerm of Middle.Expr.Typed.t
  2. | Reject
  3. | LPFunction of string * Middle.Expr.Typed.t list
val factor_of_sexp : Sexplib0.Sexp.t -> factor
val sexp_of_factor : factor -> Sexplib0.Sexp.t
val hash_fold_factor : + Ppx_hash_lib.Std.Hash.state -> + factor -> + Ppx_hash_lib.Std.Hash.state
val hash_factor : factor -> Ppx_hash_lib.Std.Hash.hash_value
val compare_factor : factor -> factor -> int
type factor_graph = {
  1. factor_map : (factor * Dataflow_types.label, + Dataflow_types.vexpr Core.Set.Poly.t) + Core.Map.Poly.t;
  2. var_map : (Dataflow_types.vexpr, + (factor * Dataflow_types.label) Core.Set.Poly.t) + Core.Map.Poly.t;
}
val factor_graph_of_sexp : Sexplib0.Sexp.t -> factor_graph
val sexp_of_factor_graph : factor_graph -> Sexplib0.Sexp.t
val compare_factor_graph : factor_graph -> factor_graph -> int
val extract_factors_statement : + (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t -> + factor list
val extract_factors : + ('a, (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t * 'b) + Core.Map.Poly.t -> + 'a -> + ('a * factor) list
val factor_rhs : factor -> Dataflow_types.vexpr Core.Set.Poly.t
val factor_var_dependencies : + (Dataflow_types.label, + (Middle.Expr.Typed.t, Dataflow_types.label) Middle.Stmt.Fixed.Pattern.t + * Dependence_analysis.node_dep_info) + Core.Map.Poly.t -> + Dataflow_types.vexpr Core.Set.Poly.t -> + (Dataflow_types.label * factor) -> + (Dataflow_types.vexpr, Core__.Comparator.Poly.comparator_witness) Core.Set.t
val build_adjacency_maps : + (Dataflow_types.label * factor * Dataflow_types.vexpr Core.Set.Poly.t) + Core.List.t -> + factor_graph

Helper function to generate the factor graph adjacency map representation from a factor-adjacency list

val fg_remove_fac : + (factor * Dataflow_types.cf_state) -> + factor_graph -> + factor_graph
val remove_touching : + Dataflow_types.vexpr Core.Set.Poly.t -> + factor_graph -> + factor_graph
val prog_factor_graph : + ?exclude_data_facs:bool -> + Middle.Program.Typed.t -> + factor_graph

Build a factor graph from prog.log_prob using dependency analysis

val fg_reaches : + Dataflow_types.vexpr Core.Set.Poly.t -> + Dataflow_types.vexpr Core.Set.Poly.t -> + factor_graph -> + bool

BFS on 'fg' with initial frontier 'starts' and terminating at any element of 'goals'

val fg_factor_reaches : + (factor * Dataflow_types.label) -> + Dataflow_types.vexpr Core.Set.Poly.t -> + factor_graph -> + bool
val fg_factor_is_prior : + Dataflow_types.vexpr -> + (factor * Dataflow_types.label) -> + Dataflow_types.vexpr Core.Set.Poly.t -> + factor_graph -> + bool
val fg_var_priors : + Dataflow_types.vexpr -> + Dataflow_types.vexpr Core.Set.Poly.t -> + factor_graph -> + (factor * Dataflow_types.label) Core.Set.Poly.t option

Priors of V are neighbors of V which have no connection to any data except though V So for graph G and each parameter V: G' = G\V; For each neighbor F: Use BFS starting from F in G' and search for any data, if there is none, F is a prior

val list_priors : + ?factor_graph:factor_graph option -> + Middle.Program.Typed.t -> + (Dataflow_types.vexpr, + (factor * Dataflow_types.label) Core.Set.Poly.t option) + Core.Map.Poly.t
val string_of_factor : factor -> string
val string_of_vexpr : Dataflow_types.vexpr -> string
val factor_graph_to_dot : factor_graph -> string

Utility to print a factor graph to the Graphviz dot language for visualization

diff --git a/stanc/Analysis_and_optimization/Memory_patterns/index.html b/stanc/Analysis_and_optimization/Memory_patterns/index.html new file mode 100644 index 000000000..e59157468 --- /dev/null +++ b/stanc/Analysis_and_optimization/Memory_patterns/index.html @@ -0,0 +1,60 @@ + +Memory_patterns (stanc.Analysis_and_optimization.Memory_patterns)

Module Analysis_and_optimization.Memory_patterns

Return a Var expression of the name for each type containing an eigen matrix

val query_var_eigen_names : Middle.Expr.Typed.t -> string Core.Set.Poly.t

Return a set of all types containing autodiffable Eigen matrices in an expression.

val is_nonzero_subset : + set:('a, 'b) Core.Set.t -> + subset:('a, 'b) Core.Set.t -> + bool

Check whether one set is a nonzero subset of another set.

val count_single_idx : int -> Middle.Expr.Typed.t Middle.Index.t -> int

Check an Index to count how many times we see a single index.

  • parameter acc

    An accumulator from previous folds of multiple expressions.

  • parameter idx

    An Index to match. For Single types this adds 1 to the acc. For Upfrom and MultiIndex types we check the inner expression for a Single index. All and Between cannot be Single cell access and so pass acc along.

val is_uni_eigen_loop_indexing : + bool -> + Middle.UnsizedType.t -> + Middle.Expr.Typed.t Middle.Index.t list -> + bool

Find indices on Matrix and Vector types that perform single cell access. Returns true if it finds a vector, row vector, matrix, or matrix with single cell access as well as an array of any of the above that is accessing the inner matrix types cell.

  • parameter ut

    An UnsizedType to match against.

  • parameter index

    This list is checked for Single cell access either at the top level or within the Index types of the list.

val query_stan_math_mem_pattern_support : + string -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + bool
val is_fun_soa_supported : string -> Middle.Expr.Typed.t list -> bool
val query_initial_demotable_expr : + bool -> + acc:string Core.Set.Poly.t -> + Middle.Expr.Typed.t -> + string Core.Set.Poly.t

Query to find the initial set of objects that cannot be SoA. This is mostly recursing over expressions, with the exceptions being functions and indexing expressions. For the logic on functions see the docs for query_initial_demotable_funs.

  • parameter in_loop

    a boolean to signify if the expression exists inside of a loop. If so, the names of matrix and vector like objects will be returned if the matrix or vector is accessed by single cell indexing.

val query_initial_demotable_funs : + bool -> + string Core.Set.Poly.t -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Middle.Fun_kind.t -> + Middle.Expr.Typed.t list -> + string Core.Set.Poly.t

Query a function to detect if it or any of its used expression's objects or expressions should be demoted to AoS. * The logic here demotes the expressions in a function to AoS if the function's inner expression returns has a meta type containing a matrix and either of : (1) The function is user defined and the UDFs inputs are matrices. (2) The Stan math function cannot support AoS

  • parameter in_loop

    A boolean to specify the logic of indexing expressions. See query_initial_demotable_expr for an explanation of the logic.

  • parameter kind

    The function type, for StanLib functions we check if the function supports SoA and for UserDefined functions we always fail and return back all of the names of the objects passed in expressions to the UDF. exprs The expression list passed to the functions.

val extract_nonderived_admatrix_types : + Middle.Expr.Typed.t -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list

* Recurse through subexpressions and return a list of Unsized types. * Recursion continues until * 1. A non-autodiffable type is found * 2. An autodiffable scalar is found * 3. A `Var` type is found that is an autodiffable matrix

* Recurse through functions to find nonderived ad matrix types. * Special cases for StanLib functions are for * - `check_matching_dims`: compiler function that has no effect on optimization * - `rep_*vector` These are templated in the C++ to cast up to `Var<Matrix>` types * - `rep_matrix`. When it's only a scalar being propogated an math library overload can upcast to `Var<Matrix>`

val contains_at_least_one_ad_matrix_or_all_data : + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + bool

Checks if a list of types contains at least on ad matrix or if everything is derived from data

val query_initial_demotable_stmt : + bool -> + string Core.Set.Poly.t -> + (Middle.Expr.Typed.Meta.t, Middle.Stmt.Located.Meta.t) Middle.Stmt.Fixed.t -> + string Core.Set.Poly.t

Query to find the initial set of objects in statements that cannot be SoA. This is mostly recursive over expressions and statements, with the exception of functions and Assignments. * For assignments: We demote the LHS variable if any of the following are true: 1. A single cell of the LHS is being assigned within a loop. 2. The top level expression on the RHS is a combination of only data matrices and scalar types. Operations on data matrix and scalar values in Stan math will return a AoS matrix. We currently have no way to tell Stan math to return a SoA matrix. 3. None of the RHS's functions are able to accept SoA matrices and the rhs is not an internal compiler function. * We demote RHS variables if any of the following are true: 1. The LHS variable has previously or through this iteration been marked AoS. 2. The LHS is a tuple projection * For functions see the documentation for query_initial_demotable_funs for the logic on demotion rules.

  • parameter in_loop

    A boolean to specify the logic of indexing expressions. See query_initial_demotable_expr for an explanation of the logic.

val query_demotable_stmt : + string Core.Set.Poly.t -> + (Middle.Expr.Typed.t, int) Middle.Stmt.Fixed.Pattern.t -> + string Core.Set.Poly.t

Look through a statement to see whether the objects used in it need to be modified from SoA to AoS. Returns the set of object names that need demoted in a statement, if any. This function looks at Assignment statements, and returns back the set of top level object names given: 1. If the name of the lhs assignee is in the aos_exits, all the names of the expressions with a type containing a matrix are returned. 2. If the names of the rhs objects containing matrix types are in the subset of aos_exits.

  • parameter aos_exits

    A set of variables that can be demoted.

  • parameter pattern

    The Stmt pattern to query.

val modify_kind : + ?force_demotion:bool -> + string Core.Set.Poly.t -> + Middle.Expr.Typed.t Middle.Fun_kind.t -> + Middle.Expr.Typed.t list -> + Middle.Expr.Typed.t Middle.Fun_kind.t * Middle.Expr.Typed.t list

Modify a function and it's subexpressions from SoA <-> AoS and vice versa. This performs demotion for sub expressions recursively. The top level expression and it's sub expressions are demoted to SoA if 1. The names of the variables in the subexpressions returning objects holding matrices are all in the modifiable set. 2. The function does not support SoA 3. The force argument is true

  • parameter force_demotion

    If true, forces an expression and it's sub-expressions to be AoS.

  • parameter modifiable_set

    The set of names that are either demotable to AoS or promotable to SoA.

  • parameter kind

    A Fun_kind.t

  • parameter exprs

    A list of expressions going into the function. *

val modify_expr_pattern : + ?force_demotion:bool -> + string Core.Set.Poly.t -> + Middle.Expr.Typed.t Middle.Expr.Fixed.Pattern.t -> + Middle.Expr.Typed.t Middle.Expr.Fixed.Pattern.t

Modify an expression and it's subexpressions from SoA <-> AoS and vice versa. The only real paths in the below is on the functions and ternary expressions. * The logic for functions is defined in modify_kind. TernaryIf is forcefully demoted to AoS if the type of the expression contains a matrix.

  • parameter force_demotion

    If true, forces an expression and it's sub-expressions to be AoS.

  • parameter modifiable_set

    The name of the variables whose associated expressions we want to modify.

  • parameter pattern

    The expression to modify.

val modify_expr : + ?force_demotion:bool -> + string Core.Set.Poly.t -> + Middle.Expr.Typed.t -> + Middle.Expr.Typed.t

Given a Set of strings containing the names of objects that can be modified from AoS <-> SoA and vice versa, modify them within the expression.

  • parameter mem_pattern

    The memory pattern to change expressions to.

  • parameter modifiable_set

    The name of the variables whose associated expressions we want to modify.

  • parameter expr

    the expression to modify.

Modify statement patterns in the MIR from AoS <-> SoA and vice versa For Decl and Assignment's reading in parameters, we demote to AoS if the decl_id (or assign name) is in the modifiable set and otherwise promote the statement to SoA. For general Assignment statements, we check if the assignee is in the demotable set. If so, we force demotion of all of the rhs expressions. All other statements recurse over their statements and expressions. *

  • parameter pattern

    The statement pattern to modify

  • parameter modifiable_set

    The name of the variable we are searching for.

val modify_stmt : + Middle.Stmt.Located.t -> + string Core.Set.Poly.t -> + Middle.Stmt.Located.t

Modify statement patterns in the MIR from AoS <-> SoA and vice versa

  • parameter mem_pattern

    A mem_pattern to modify expressions to. For the given memory pattern, this modifies statement patterns and expressions to it.

  • parameter stmt

    The statement to modify.

  • parameter modifiable_set

    The name of the variable we are searching for.

val collect_mem_pattern_variables : + Middle.Stmt.Located.t Core.List.t -> + (string + * Middle.Expr.Typed.Meta.t Middle.Stmt.Fixed.First.t Middle.SizedType.t) + list
val pp_mem_patterns : Stdlib.Format.formatter -> Middle.Program.Typed.t -> unit
diff --git a/stanc/Analysis_and_optimization/Mir_utils/index.html b/stanc/Analysis_and_optimization/Mir_utils/index.html new file mode 100644 index 000000000..9e54e266b --- /dev/null +++ b/stanc/Analysis_and_optimization/Mir_utils/index.html @@ -0,0 +1,104 @@ + +Mir_utils (stanc.Analysis_and_optimization.Mir_utils)

Module Analysis_and_optimization.Mir_utils

val var_declarations : ('a, 'b) Middle.Stmt.Fixed.t -> string Core.Set.Poly.t
val num_expr_value : Middle.Expr.Typed.t -> (float * string) option
type bound_values = {
  1. lower : [ `None | `Nonlit | `Lit of float ];
  2. upper : [ `None | `Nonlit | `Lit of float ];
}
val chop_dist_name : string -> string Core.Option.t
val top_var_declarations : Middle.Stmt.Located.t -> string Core.Set.Poly.t
val data_set : + ?exclude_transformed:bool -> + ?exclude_ints:bool -> + Middle.Program.Typed.t -> + string Core.Set.Poly.t
val parameter_set : + ?include_transformed:bool -> + Middle.Program.Typed.t -> + (string * Middle.Expr.Typed.t Middle.Transformation.t) Core.Set.Poly.t
val parameter_names_set : + ?include_transformed:bool -> + Middle.Program.Typed.t -> + string Core.Set.Poly.t
val fold_expr : + take_expr:('c -> Middle.Expr.Typed.t -> 'c) -> + init:'c -> + Middle.Expr.Typed.t -> + 'c
val fold_stmts : + take_expr:('c -> Middle.Expr.Typed.t -> 'c) -> + take_stmt:('c -> Middle.Stmt.Located.t -> 'c) -> + init:'c -> + Middle.Stmt.Located.t Core.List.t -> + 'c
val stmt_loc_of_stmt_loc_num : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + Middle.Stmt.Located.Non_recursive.t -> + Middle.Stmt.Located.t
val statement_stmt_loc_of_statement_stmt_loc_num : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (Middle.Expr.Typed.t, int) Middle.Stmt.Fixed.Pattern.t -> + (Middle.Expr.Typed.t, Middle.Stmt.Located.t) Middle.Stmt.Fixed.Pattern.t
val unnumbered_prog_of_numbered_prog : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + ('a -> 'b) -> + (Middle.Stmt.Located.Non_recursive.t, 'a, 'c) Middle.Program.t -> + (Middle.Stmt.Located.t, 'b, 'c) Middle.Program.t
val fwd_traverse_statement : + ('e, 'a) Middle.Stmt.Fixed.Pattern.t -> + init:'f -> + f:('f -> 'a -> 'f * 'c) -> + 'f * ('e, 'c) Middle.Stmt.Fixed.Pattern.t

A traversal that simultaneously accumulates a state (type 'f) and replaces the substatement values from ('a to 'c). Traversal is done in-order but ignores branching, e.g., and if's then block is followed by the else block rather than branching.

val vexpr_of_expr_exn : Middle.Expr.Typed.t -> Dataflow_types.vexpr

Take a LHS expression from a general expression, throwing an exception if it can't be a LHS expression.

val expr_var_set : + Middle.Expr.Typed.t -> + (Dataflow_types.vexpr * Middle.Expr.Typed.Meta.t) Core.Set.Poly.t

The set of variables in an expression, including inside an index. For use in RHS sets, not LHS assignment sets, except in a target term.

The set of variables in an index. For use in RHS sets, not LHS assignment sets, except in a target term

val expr_var_names_set : Middle.Expr.Typed.t -> string Core.Set.Poly.t

Return the names of the variables in an expression.

val stmt_rhs : + (Middle.Expr.Typed.t, 's) Middle.Stmt.Fixed.Pattern.t -> + Middle.Expr.Typed.t Core.Set.Poly.t

The set of variables that can affect the value or behavior of the expression, i.e. rhs. Using Set.Poly instead of ExprSet so that 'e can be polymorphic, it usually doesn't matter if there's duplication.

val union_map : + 'a Core.Set.Poly.t -> + f:('a -> 'b Core.Set.Poly.t) -> + 'b Core.Set.Poly.t

This is a helper function equivalent to List.concat_map but for Sets

The set of variables in an expression, including inside an index. For use in RHS sets, not LHS assignment sets, except in a target term.

val expr_assigned_var : Middle.Expr.Typed.t -> Dataflow_types.vexpr

The variable being assigned to when the expression is the LHS

val summation_terms : Middle.Expr.Typed.t -> Middle.Expr.Typed.t list

The list of terms in expression separated by a +

val subst_expr : + (string, Middle.Expr.Typed.t) Core.Map.Poly.t -> + Middle.Expr.Typed.t -> + Middle.Expr.Typed.t

Substitute variables in an expression according to the provided Map.

val subst_stmt_base : + (string, Middle.Expr.Typed.t) Core.Map.Poly.t -> + (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t -> + (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t

Substitute variables occurring at the top level in statements according to the provided Map.

val subst_stmt : + (string, Middle.Expr.Typed.t) Core.Map.Poly.t -> + Middle.Stmt.Located.t -> + Middle.Stmt.Located.t

Substitute variables occurring anywhere in a statement according to the provided Map.

val name_subst_stmt : + (string, string) Core.Map.Poly.t -> + Middle.Stmt.Located.t -> + Middle.Stmt.Located.t

Substitute subexpressions occurring anywhere in a statement according to the provided Map.

Substitute subexpressions in an expression according to the provided Map, trying to match on larger subexpressions before smaller ones.

Substitute subexpressions occurring at the top level in statements according to the provided Map.

val expr_depth : Middle.Expr.Typed.t -> int

Calculate how deeply nested an expression is.

val update_expr_ad_levels : + string Core.Set.Poly.t -> + Middle.Expr.Typed.t -> + Middle.Expr.Typed.t

Recompute all AD-levels in the metadata of an expression from the bottom up, making the variables in the first argument autodiffable

val cleanup_empty_stmts : + ('e, 's) Middle.Stmt.Fixed.t list -> + ('e, 's) Middle.Stmt.Fixed.t list
val unsafe_unsized_to_sized_type : + Middle.Expr.Typed.t Middle.Type.t -> + Middle.Expr.Typed.t Middle.Type.t
diff --git a/stanc/Analysis_and_optimization/Monotone_framework/index.html b/stanc/Analysis_and_optimization/Monotone_framework/index.html new file mode 100644 index 000000000..8056bd42f --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework/index.html @@ -0,0 +1,279 @@ + +Monotone_framework (stanc.Analysis_and_optimization.Monotone_framework)

Module Analysis_and_optimization.Monotone_framework

The common elements of a monotone framework

val print_mfp : + ('a -> Core__.Import.string) -> + (int, ('a, 'b) Core__Set.t Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + unit

Debugging tool to print out MFP sets *

val free_vars_expr : Middle.Expr.Typed.t -> string Core.Set.Poly.t

Calculate the free (non-bound) variables in an expression

val free_vars_idx : + Middle.Expr.Typed.t Middle.Index.t -> + string Core.Set.Poly.t

Calculate the free (non-bound) variables in an index

val free_vars_fnapp : + Middle.Expr.Typed.t Middle.Fun_kind.t -> + Middle.Expr.Typed.t Base__List.t -> + string Core.Set.Poly.t
val free_vars_lval : + Middle.Expr.Typed.t Middle.Stmt.Fixed.Pattern.lvalue -> + string Core.Set.Poly.t
val free_vars_stmt : + (Middle.Expr.Typed.t, Middle.Stmt.Located.t) Middle.Stmt.Fixed.Pattern.t -> + string Core.Set.Poly.t

Calculate the free (non-bound) variables in a statement

val top_free_vars_stmt : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (Middle.Expr.Typed.t, int) Middle.Stmt.Fixed.Pattern.t -> + string Core.Set.Poly.t

A variation on free_vars_stmt, where we do not recursively count free variables in sub statements

val inverse_flowgraph_of_stmt : + ?flatten_loops:bool -> + ?blocks_after_body:bool -> + Middle.Stmt.Located.t -> + (module Monotone_framework_sigs.FLOWGRAPH + with type labels = int) + * (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t

Compute the inverse flowgraph of a Stan statement (for reverse analyses)

val reverse : + (module Monotone_framework_sigs.FLOWGRAPH with type labels = 'l) -> + (module Monotone_framework_sigs.FLOWGRAPH + with type labels = 'l)

Reverse flowgraphs to be used for reverse analyses. Observe that this respects the invariants listed for a FLOWGRAPH

val make_circular_flowgraph : + (module Monotone_framework_sigs.FLOWGRAPH with type labels = 'l) -> + (module Monotone_framework_sigs.FLOWGRAPH with type labels = 'l) -> + (module Monotone_framework_sigs.FLOWGRAPH + with type labels = 'l)

Modify the end nodes of a flowgraph to depend on its inits To force the monotone framework to run until the program never changes this function modifies the input Flowgraph so that it's end nodes depend on it's initial nodes. The inits of the reverse flowgraph are used for this since we normally have both the forward and reverse flowgraphs available.

  • parameter l

    Type of the label for each flowgraph, most commonly an int

  • parameter Flowgraph

    The flowgraph to modify

  • parameter RevFlowgraph

    The same flowgraph as Flowgraph but reversed. *

val forward_flowgraph_of_stmt : + ?flatten_loops:bool -> + ?blocks_after_body:bool -> + Middle.Stmt.Located.t -> + (module Monotone_framework_sigs.FLOWGRAPH + with type labels = int) + * (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t

Compute the forward flowgraph of a Stan statement (for forward analyses)

val powerset_lattice : + (module Monotone_framework_sigs.INITIALTYPE with type vals = 'v) -> + (module Monotone_framework_sigs.LATTICE + with type properties = 'v Core.Set.Poly.t)

The lattice of sets of some values, with the inclusion order, set union and the empty set

val dual_powerset_lattice : + (module Monotone_framework_sigs.INITIALTOTALTYPE with type vals = 'v) -> + (module Monotone_framework_sigs.LATTICE + with type properties = 'v Core.Set.Poly.t)

The lattice of subsets of some set, with the inverse inclusion order, set intersection and the total set

val powerset_lattice_expressions : + Middle.Expr.Typed.Set.t -> + (module Monotone_framework_sigs.LATTICE + with type properties = Middle.Expr.Typed.Set.t)
val dual_powerset_lattice_expressions : + Middle.Expr.Typed.Set.t -> + Middle.Expr.Typed.Set.t -> + (module Monotone_framework_sigs.LATTICE + with type properties = Middle.Expr.Typed.Set.t)
val new_bot : + (module Monotone_framework_sigs.LATTICE_NO_BOT with type properties = 'p) -> + (module Monotone_framework_sigs.LATTICE + with type properties = 'p option)

Add a fresh bottom element to a lattice (possibly without bottom)

val dual_partial_function_lattice : + (module Monotone_framework_sigs.TOTALTYPE with type vals = 'dv) -> + (module Monotone_framework_sigs.TYPE with type vals = 'cv) -> + (module Monotone_framework_sigs.LATTICE_NO_BOT + with type properties = ('dv, 'cv) Core.Map.Poly.t)

The lattice (without bottom) of partial functions, ordered under inverse graph inclusion, with intersection

val dual_partial_function_lattice_with_bot : + (module Monotone_framework_sigs.TOTALTYPE with type vals = 'dv) -> + (module Monotone_framework_sigs.TYPE with type vals = 'cv) -> + (module Monotone_framework_sigs.LATTICE + with type properties = ('dv, 'cv) Core.Map.Poly.t option)

The lattice of partial functions, where we add a fresh bottom element, to represent an inconsistent combination of functions

val dual_powerset_lattice_empty_initial : + (module Monotone_framework_sigs.TOTALTYPE with type vals = 'v) -> + (module Monotone_framework_sigs.LATTICE + with type properties = 'v Core.Set.Poly.t)

A dual powerset lattice, where we set the initial set to be empty

val powerset_lattice_empty_initial : + (module Monotone_framework_sigs.TYPE with type vals = 'v) -> + (module Monotone_framework_sigs.LATTICE + with type properties = 'v Core.Set.Poly.t)

A powerset lattice, where we set the initial set to be empty

val reaching_definitions_lattice : + (module Monotone_framework_sigs.INITIALTYPE with type vals = 'v) -> + (module Monotone_framework_sigs.TYPE with type vals = 'l) -> + (module Monotone_framework_sigs.LATTICE + with type properties = ('v * 'l option) Core.Set.Poly.t)

The specific powerset lattice we use for reaching definitions analysis

val minimal_variables_lattice : + string Core.Set.Poly.t -> + (module Monotone_framework_sigs.LATTICE + with type properties = string Core.Set.Poly.t)

Lattice for finding the smallest set that satisfies some criterion

val constant_propagation_transfer : + ?preserve_stability:bool -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = (string, Middle.Expr.Typed.t) Core.Map.Poly.t option)
val label_top_decls : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + int -> + string Core.Set.Poly.t
val expression_propagation_transfer : + ?preserve_stability:bool -> + (Middle.Expr.Typed.t -> bool) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = (string, Middle.Expr.Typed.t) Core.Map.Poly.t option)

The transfer function for an expression propagation analysis, AKA forward substitution (see page 396 of Muchnick)

val copy_propagation_transfer : + string Core.Set.Poly.t -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = (string, Middle.Expr.Typed.t) Core.Map.Poly.t option)

The transfer function for a copy propagation analysis

val transfer_gen_kill : + ('a, 'b) Core.Set.t -> + ('a, 'b) Core.Set.t -> + ('a, 'b) Core.Set.t -> + ('a, 'b) Core.Set.t

A helper function for building transfer functions from gen and kill sets

val assigned_vars_stmt : + (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t -> + string Core.Set.Poly.t

Calculate the set of variables that a statement can assign to

val declared_vars_stmt : + (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t -> + string Core.Set.Poly.t

Calculate the set of variables that a statement can declare

val assigned_or_declared_vars_stmt : + (Middle.Expr.Typed.t, 'a) Middle.Stmt.Fixed.Pattern.t -> + (string, Core__.Comparator.Poly.comparator_witness) Core.Set.t

Calculate the set of variables that a statement can assign to or declare

val reaching_definitions_transfer : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = (string * int option) Core.Set.Poly.t)

The transfer function for a reaching definitions analysis

val initialized_vars_transfer : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = string Core.Set.Poly.t)

The transfer function for an initialized variables analysis

val live_variables_transfer : + string Core.Set.Poly.t -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = string Core.Set.Poly.t)

The transfer function for a live variables analysis

Calculate the set of sub-expressions of an expression

val used_expressions_expr : + Middle.Expr.Typed.Set.Elt.t -> + Middle.Expr.Typed.Set.t

Calculate the set of expressions of an expression

Calculate the set of sub-expressions in a statement

Calculate the set of expressions in a statement

Calculate the set of sub-expressions at the top level in a statement

Calculate the set of expressions at the top level in a statement

Calculate the subset (of p) of expressions that will need to be recomputed as a consequence of evaluating the statement s (because of writes to variables performed by s)

val used : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, + (Middle.Expr.Typed.Set.Elt.t, Middle.Expr.Typed.Set.Elt.comparator_witness) + Core.Set.t) + Core.Map.Poly.t

Calculate the set of subexpressions that needs to be computed at each node in the flowgraph

val anticipated_expressions_transfer : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = Middle.Expr.Typed.Set.t)

The transfer function for an anticipated expressions analysis (as a part of lazy code motion)

val transfer_gen_kill_alt : + ('a, 'b) Core.Set.t -> + ('a, 'b) Core.Set.t -> + ('a, 'b) Core.Set.t -> + ('a, 'b) Core.Set.t

A helper function for defining transfer functions in terms of gen and kill sets in an alternative way, that is used in some of the subanalyses of lazy code motion

val available_expressions_transfer : + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = Middle.Expr.Typed.Set.t)

An available expressions analysis, to be used in lazy code motion

val earliest : + (int, Middle.Expr.Typed.Set.t Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t -> + (int, + (Middle.Expr.Typed.Set.Elt.t, Middle.Expr.Typed.Set.Elt.comparator_witness) + Core.Set.t) + Core.Map.Poly.t

Calculates the set of expressions that can be calculated for the first time at each node in the flow graph

val postponable_expressions_transfer : + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = Middle.Expr.Typed.Set.t)

The transfer function for a postponable expressions analysis (as a part of lazy code motion)

val latest : + (int, int Core.Set.Poly.t) Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (int, + (Middle.Expr.Typed.Set.Elt.t, Middle.Expr.Typed.Set.Elt.comparator_witness) + Core.Set.t) + Core.Map.Poly.t

Calculates the set of expressions that can be computed at the latest at each node

val used_not_latest_expressions_transfer : + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (int, Middle.Expr.Typed.Set.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = Middle.Expr.Typed.Set.t)

The transfer function for a used-not-latest expressions analysis, as a part of lazy code motion

val minimal_variables_fwd_transfer : + ((int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + int -> + string Core.Set.Poly.t -> + string Core.Set.Poly.t) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = string Core.Set.Poly.t)

The transfer function for the first forward analysis part of determining optimal ad-levels for variables

val monotone_framework : + (module Monotone_framework_sigs.FLOWGRAPH with type labels = 'l) -> + (module Monotone_framework_sigs.LATTICE with type properties = 'p) -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = 'l + and type properties = 'p) -> + (module Monotone_framework_sigs.MONOTONE_FRAMEWORK + with type labels = 'l + and type properties = 'p)

The central definition of a monotone dataflow analysis framework. Given a compatible flowgraph, lattice and transfer function, we can run the mfp (maximal fixed point) algorithm, which computes a maximal fixed point (MFP) for the set of equations/inequalities of properties at the entry and exit of each node in the flow graph, as defined by the triple. Note that this gives a safe approximation to the MOP (meet over all paths) solution that we would really be interested in, but which is often incomputable. In case of a distributive lattice of properties, the MFP and MOP solutions coincide.

val declared_variables_stmt : + (Middle.Expr.Typed.t, Middle.Stmt.Located.t) Middle.Stmt.Fixed.Pattern.t -> + string Core.Set.Poly.t
val propagation_mfp : + Middle.Program.Typed.t -> + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + ((int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (module Monotone_framework_sigs.TRANSFER_FUNCTION + with type labels = int + and type properties = (string, Middle.Expr.Typed.t) Core.Map.Poly.t option)) -> + (int, + (string, Middle.Expr.Typed.t) Core.Map.Poly.t option + Analysis_and_optimization__Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t
val reaching_definitions_mfp : + Middle.Program.Typed.t -> + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, + (string * int option) Core.Set.Poly.t + Analysis_and_optimization__Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t
val initialized_vars_mfp : + string Core.Set.Poly.t -> + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, + string Core.Set.Poly.t + Analysis_and_optimization__Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t
val globals : Middle.Program.Typed.t -> string Core.Set.Poly.t
val live_variables_mfp : + Middle.Program.Typed.t -> + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, + string Core.Set.Poly.t + Analysis_and_optimization__Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t

Monotone framework instance for live_variables analysis. Expects reverse flowgraph.

val lazy_expressions_mfp : + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + (int, + (Middle.Expr.Typed.Set.Elt.t, Middle.Expr.Typed.Set.Elt.comparator_witness) + Core.Set.t) + Core.Map.Poly.t + * (int, + Middle.Expr.Typed.Set.t + Analysis_and_optimization__Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t

Instantiate all four instances of the monotone framework for lazy code motion, reusing code between them

val minimal_variables_mfp : + (module Monotone_framework_sigs.FLOWGRAPH with type labels = int) -> + (int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + string Core.Set.Poly.t -> + ((int, Middle.Stmt.Located.Non_recursive.t) Core.Map.Poly.t -> + int -> + string Core.Set.Poly.t -> + string Core.Set.Poly.t) -> + (int, + string Core.Set.Poly.t + Analysis_and_optimization__Monotone_framework_sigs.entry_exit) + Core.Map.Poly.t

Run the minimal fixed point algorithm to deduce the smallest set of variables that satisfy a set of conditions.

  • parameter Flowgraph

    The set of nodes to analyze

  • parameter flowgraph_to_mir

    Map of nodes to their actual values in the MIR

  • parameter initial_variables

    The set of variables to start in the set

  • parameter gen_variable

    Used in the transfer function to deduce variables that should be in the set *

diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/index.html new file mode 100644 index 000000000..677bec24d --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/index.html @@ -0,0 +1,2 @@ + +Monotone_framework_sigs (stanc.Analysis_and_optimization.Monotone_framework_sigs)

Module Analysis_and_optimization.Monotone_framework_sigs

The API for a monotone framework, as described in 2.3-2.4 of Nielson, Nielson, and Hankin or 9.3 of Aho et al.. This gives a modular way of implementing many static analyses.

module type FLOWGRAPH = sig ... end

The API for a flowgraph, needed for the mfp algorithm in the monotone framework. Assumed invariants: successors contains all graph nodes as keys initials is a subset of the graph nodes

module type TYPE = sig ... end

The minimal data we need to use a type in forming a lattice of various kinds

module type INITIALTYPE = sig ... end

The data we need to form a powerset lattice

module type TOTALTYPE = sig ... end

The data we need to form e.g. an available xpressions lattice

module type INITIALTOTALTYPE = sig ... end

The data we need to form a dual powerset lattice

module type LATTICE_NO_BOT = sig ... end
module type LATTICE = sig ... end

The API for a complete (possibly non-distributive) lattice, needed for the mfp algorithm in the monotone framework

module type TRANSFER_FUNCTION = sig ... end

The API for a transfer function, needed for the mfp algorithm in the monotone framework. This describes how output properties are computed from input properties at a given node in the flow graph.

type 'a entry_exit = {
  1. entry : 'a;
  2. exit : 'a;
}
module type MONOTONE_FRAMEWORK = sig ... end

The API for a monotone framework. mfp computes the minimal fixed point of the equations/inequalities defined between property lattice elements at the entry and exit of different flowgraph nodes, where these equations/inequalities are generated from the transfer function. Returns a map of the (input_properties, output_properties) for each node l in the flow graph. The analysis performed is always a forward analysis. For a reverse analysis, supply the reverse flow graph.

diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-FLOWGRAPH/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-FLOWGRAPH/index.html new file mode 100644 index 000000000..fcdc28d4b --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-FLOWGRAPH/index.html @@ -0,0 +1,2 @@ + +FLOWGRAPH (stanc.Analysis_and_optimization.Monotone_framework_sigs.FLOWGRAPH)

Module type Monotone_framework_sigs.FLOWGRAPH

The API for a flowgraph, needed for the mfp algorithm in the monotone framework. Assumed invariants: successors contains all graph nodes as keys initials is a subset of the graph nodes

type labels
type t = labels
val compare : t Base__Ppx_compare_lib.compare
val sexp_of_t : t -> Sexplib0.Sexp.t
val hash : t -> int
val initials : labels Core.Set.Poly.t
val successors : (labels, labels Core.Set.Poly.t) Core.Map.Poly.t
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTOTALTYPE/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTOTALTYPE/index.html new file mode 100644 index 000000000..b4bb3e6a2 --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTOTALTYPE/index.html @@ -0,0 +1,2 @@ + +INITIALTOTALTYPE (stanc.Analysis_and_optimization.Monotone_framework_sigs.INITIALTOTALTYPE)

Module type Monotone_framework_sigs.INITIALTOTALTYPE

The data we need to form a dual powerset lattice

include INITIALTYPE
include TYPE
type vals
val initial : vals Core.Set.Poly.t
include TOTALTYPE with type vals := vals
include TYPE with type vals := vals
val total : vals Core.Set.Poly.t
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTYPE/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTYPE/index.html new file mode 100644 index 000000000..d2d5c1e61 --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-INITIALTYPE/index.html @@ -0,0 +1,2 @@ + +INITIALTYPE (stanc.Analysis_and_optimization.Monotone_framework_sigs.INITIALTYPE)

Module type Monotone_framework_sigs.INITIALTYPE

The data we need to form a powerset lattice

include TYPE
type vals
val initial : vals Core.Set.Poly.t
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE/index.html new file mode 100644 index 000000000..05cfe36ff --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE/index.html @@ -0,0 +1,2 @@ + +LATTICE (stanc.Analysis_and_optimization.Monotone_framework_sigs.LATTICE)

Module type Monotone_framework_sigs.LATTICE

The API for a complete (possibly non-distributive) lattice, needed for the mfp algorithm in the monotone framework

include LATTICE_NO_BOT
type properties
val leq : properties -> properties -> bool
val initial : properties

An initial value, which might not be the top element. The idea is that this is the property that you start with (you assume to be true at the start of your analysis).

val bottom : properties
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE_NO_BOT/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE_NO_BOT/index.html new file mode 100644 index 000000000..42aa8d82e --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-LATTICE_NO_BOT/index.html @@ -0,0 +1,2 @@ + +LATTICE_NO_BOT (stanc.Analysis_and_optimization.Monotone_framework_sigs.LATTICE_NO_BOT)

Module type Monotone_framework_sigs.LATTICE_NO_BOT

type properties
val leq : properties -> properties -> bool
val initial : properties

An initial value, which might not be the top element. The idea is that this is the property that you start with (you assume to be true at the start of your analysis).

diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-MONOTONE_FRAMEWORK/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-MONOTONE_FRAMEWORK/index.html new file mode 100644 index 000000000..b17fbaa11 --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-MONOTONE_FRAMEWORK/index.html @@ -0,0 +1,2 @@ + +MONOTONE_FRAMEWORK (stanc.Analysis_and_optimization.Monotone_framework_sigs.MONOTONE_FRAMEWORK)

Module type Monotone_framework_sigs.MONOTONE_FRAMEWORK

The API for a monotone framework. mfp computes the minimal fixed point of the equations/inequalities defined between property lattice elements at the entry and exit of different flowgraph nodes, where these equations/inequalities are generated from the transfer function. Returns a map of the (input_properties, output_properties) for each node l in the flow graph. The analysis performed is always a forward analysis. For a reverse analysis, supply the reverse flow graph.

type labels
type properties
val mfp : unit -> (labels, properties entry_exit) Core.Map.Poly.t
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TOTALTYPE/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TOTALTYPE/index.html new file mode 100644 index 000000000..e35845b32 --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TOTALTYPE/index.html @@ -0,0 +1,2 @@ + +TOTALTYPE (stanc.Analysis_and_optimization.Monotone_framework_sigs.TOTALTYPE)

Module type Monotone_framework_sigs.TOTALTYPE

The data we need to form e.g. an available xpressions lattice

include TYPE
type vals
val total : vals Core.Set.Poly.t
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TRANSFER_FUNCTION/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TRANSFER_FUNCTION/index.html new file mode 100644 index 000000000..136f7c1e2 --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TRANSFER_FUNCTION/index.html @@ -0,0 +1,2 @@ + +TRANSFER_FUNCTION (stanc.Analysis_and_optimization.Monotone_framework_sigs.TRANSFER_FUNCTION)

Module type Monotone_framework_sigs.TRANSFER_FUNCTION

The API for a transfer function, needed for the mfp algorithm in the monotone framework. This describes how output properties are computed from input properties at a given node in the flow graph.

type labels
type properties
val transfer_function : labels -> properties -> properties
diff --git a/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TYPE/index.html b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TYPE/index.html new file mode 100644 index 000000000..9498a4236 --- /dev/null +++ b/stanc/Analysis_and_optimization/Monotone_framework_sigs/module-type-TYPE/index.html @@ -0,0 +1,2 @@ + +TYPE (stanc.Analysis_and_optimization.Monotone_framework_sigs.TYPE)

Module type Monotone_framework_sigs.TYPE

The minimal data we need to use a type in forming a lattice of various kinds

type vals
diff --git a/stanc/Analysis_and_optimization/Optimize/index.html b/stanc/Analysis_and_optimization/Optimize/index.html new file mode 100644 index 000000000..f3efdc4bf --- /dev/null +++ b/stanc/Analysis_and_optimization/Optimize/index.html @@ -0,0 +1,16 @@ + +Optimize (stanc.Analysis_and_optimization.Optimize)

Module Analysis_and_optimization.Optimize

Inline all functions except for ones with forward declarations (e.g. recursive functions, mutually recursive functions, and functions without a definition

val static_loop_unrolling : Middle.Program.Typed.t -> Middle.Program.Typed.t

Unroll all for-loops with constant bounds, as long as they do not contain break or continue statements in their body at the top level

val one_step_loop_unrolling : Middle.Program.Typed.t -> Middle.Program.Typed.t

Unroll all loops for one iteration, as long as they do not contain break or continue statements in their body at the top level

Remove redundant SList constructors from the Mir that might have been introduced by other optimizations

Make sure that SList constructors directly under if, for, while or fundef constructors are replaced with Block constructors. This should probably be run before we generate code.

val constant_propagation : + ?preserve_stability:bool -> + Middle.Program.Typed.t -> + Middle.Program.Typed.t

Propagate constant values through variable assignments

val expression_propagation : + ?preserve_stability:bool -> + Middle.Program.Typed.t -> + Middle.Program.Typed.t

Propagate arbitrary expressions through variable assignments. This can be useful for opening up new possibilities for partial evaluation. It should be followed by some CSE or lazy code motion pass, however.

Propagate copies of variables through assignments.

val dead_code_elimination : Middle.Program.Typed.t -> Middle.Program.Typed.t

Eliminate semantically redundant code branches. This includes removing redundant assignments (because they will be overwritten) and removing redundant code in program branches that will never be reached.

Partially evaluate expressions in the program. This includes simplification using algebraic identities of logical and arithmetic operators as well as Stan math functions.

val lazy_code_motion : + ?preserve_stability:bool -> + Middle.Program.Typed.t -> + Middle.Program.Typed.t

Perform partial redundancy elmination using the lazy code motion algorithm. This subsumes common subexpression elimination and loop-invariant code motion.

Assign the optimal ad-levels to local variables. That means, make sure that variables only ever get treated as autodiff variables if they have some dependency on a parameter

val allow_uninitialized_decls : + Middle.Program.Typed.t -> + Middle.Program.Typed.t

Marks Decl types such that, if the first assignment after the decl assigns to the full object, allow the object to be constructed but not uninitialized.

type optimization_settings = {
  1. function_inlining : bool;
  2. static_loop_unrolling : bool;
  3. one_step_loop_unrolling : bool;
  4. list_collapsing : bool;
  5. block_fixing : bool;
  6. allow_uninitialized_decls : bool;
  7. constant_propagation : bool;
  8. expression_propagation : bool;
  9. copy_propagation : bool;
  10. dead_code_elimination : bool;
  11. partial_evaluation : bool;
  12. lazy_code_motion : bool;
  13. optimize_ad_levels : bool;
  14. preserve_stability : bool;
  15. optimize_soa : bool;
}

Interface for turning individual optimizations on/off. Useful for testing and for top-level interface flags.

val all_optimizations : optimization_settings
val no_optimizations : optimization_settings
type optimization_level =
  1. | O0
  2. | O1
  3. | Oexperimental
val level_optimizations : optimization_level -> optimization_settings
val optimization_suite : + ?settings:optimization_settings -> + Middle.Program.Typed.t -> + Middle.Program.Typed.t

Perform all optimizations in this module on the MIR in an appropriate order.

diff --git a/stanc/Analysis_and_optimization/Partial_evaluator/index.html b/stanc/Analysis_and_optimization/Partial_evaluator/index.html new file mode 100644 index 000000000..88a20c763 --- /dev/null +++ b/stanc/Analysis_and_optimization/Partial_evaluator/index.html @@ -0,0 +1,36 @@ + +Partial_evaluator (stanc.Analysis_and_optimization.Partial_evaluator)

Module Analysis_and_optimization.Partial_evaluator

exception Rejected of Middle.Location_span.t * string
val is_int : int -> 'a Middle.Expr.Fixed.t -> bool
val apply_prefix_operator_int : + string -> + Core.Int.t -> + 'a Middle.Expr.Fixed.Pattern.t
val apply_prefix_operator_real : + string -> + Core.Float.t -> + 'a Middle.Expr.Fixed.Pattern.t
val apply_operator_int : + string -> + Core__.Int.t -> + Core__.Int.t -> + 'a Middle.Expr.Fixed.Pattern.t
val apply_arithmetic_operator_real : + string -> + float -> + float -> + 'a Middle.Expr.Fixed.Pattern.t
val apply_logical_operator_real : + string -> + 'a -> + 'a -> + 'b Middle.Expr.Fixed.Pattern.t
val is_multi_index : 'a Middle.Index.t -> bool
val eval_expr : + ?preserve_stability:bool -> + Middle.Expr.Typed.t -> + Middle.Expr.Typed.t
val remove_trailing_alls_expr : + 'a Middle.Expr.Fixed.Pattern.t -> + 'a Middle.Expr.Fixed.Pattern.t
diff --git a/stanc/Analysis_and_optimization/Pedantic_analysis/index.html b/stanc/Analysis_and_optimization/Pedantic_analysis/index.html new file mode 100644 index 000000000..bd5f3f4c4 --- /dev/null +++ b/stanc/Analysis_and_optimization/Pedantic_analysis/index.html @@ -0,0 +1,2 @@ + +Pedantic_analysis (stanc.Analysis_and_optimization.Pedantic_analysis)

Module Analysis_and_optimization.Pedantic_analysis

type warning_span = Middle.Location_span.t * string
val warn_pedantic : Middle.Program.Typed.t -> warning_span list

Collect all pedantic mode warnings and print to a string.

val warn_uninitialized : Middle.Program.Typed.t -> warning_span list

Collect warnings about each variable which is used before being initialized and print to a string.

diff --git a/stanc/Analysis_and_optimization/Pedantic_dist_warnings/index.html b/stanc/Analysis_and_optimization/Pedantic_dist_warnings/index.html new file mode 100644 index 000000000..55adb0875 --- /dev/null +++ b/stanc/Analysis_and_optimization/Pedantic_dist_warnings/index.html @@ -0,0 +1,24 @@ + +Pedantic_dist_warnings (stanc.Analysis_and_optimization.Pedantic_dist_warnings)

Module Analysis_and_optimization.Pedantic_dist_warnings

type compiletime_val =
  1. | Opaque
  2. | Number of float * string
  3. | Param of string * Middle.Expr.Typed.t Middle.Transformation.t
  4. | Data of string

Useful information about an expression. Opaque means we don't know anything.

type dist_info = {
  1. name : string;
  2. loc : Middle.Location_span.t;
  3. args : (compiletime_val * Middle.Expr.Typed.Meta.t) Core.List.t;
}

Info about a distribution occurrences that's useful for checking that distribution properties are met

type range = {
  1. lower : (float * bool) option;
  2. upper : (float * bool) option;
}

Value constraint as a range. The bools are true if the bound is inclusive

type var_constraint =
  1. | Range of range
  2. | Ordered
  3. | PositiveOrdered
  4. | Simplex
  5. | UnitVector
  6. | CholeskyCorr
  7. | CholeskyCov
  8. | Correlation
  9. | Covariance

Value constraint for an argument

type var_constraint_named = {
  1. name : string;
  2. constr : var_constraint;
}

Constraint paired with a name for user messages

val unit_range : var_constraint_named
val exclusive_unit_range : var_constraint_named
val positive_range : var_constraint_named
val nonnegative_range : var_constraint_named
val simplex : var_constraint_named
val ordered : var_constraint_named
val correlation : var_constraint_named
val cholesky_correlation : var_constraint_named
val covariance : var_constraint_named
val cholesky_covariance : var_constraint_named
val bounds_out_of_range : range -> Mir_utils.bound_values -> bool

Check for inconsistency between a distribution argument's value range and the declared bounds of a variable

val transform_mismatch_constraint : + var_constraint -> + Middle.Expr.Typed.t Middle.Transformation.t -> + bool

Check for inconsistency between a distribution argument's constraint and the constraint transformation of a variable

val value_out_of_range : range -> float -> bool

Check for inconsistency between a distribution argument's range and a literal value

val value_mismatch_constraint : var_constraint -> float -> bool

Check for inconsistency between a distribution argument's constraint and a literal value

type arg_info =
  1. | Arg of int * string
  2. | Variate
val arg_number : arg_info -> int
val constr_mismatch_message : string -> string -> arg_info -> string -> string
val constr_literal_mismatch_message : + string -> + string -> + arg_info -> + string -> + string
val constr_mismatch_warning : + var_constraint_named -> + arg_info -> + dist_info -> + (Middle.Location_span.t * string) option

Return a warning if the argn-th argument doesn't match its constraints

val uniform_dist_message : string -> string
val uniform_dist_warning : + dist_info -> + (Middle.Location_span.t * string) option

Warning for all uniform distributions with a parameter

val lkj_corr_message : string
val lkj_corr_dist_warning : + dist_info -> + (Middle.Location_span.t * string) option

Warn about all non-Cholesky lkj_corr distributions

val gamma_arg_dist_message : string
val gamma_arg_dist_warning : + dist_info -> + (Middle.Location_span.t * string) option

Warning particular to gamma and inv_gamma, when A=B<1

val distribution_warning : + dist_info -> + (Middle.Location_span.t * string) Core.List.t

Generate all of the warnings that are relevant to a given distribution

val distribution_warnings : + dist_info Core.Set.Poly.t -> + (Middle.Location_span.t * string) Core.Set.Poly.t

Generate the distribution warnings for a program

diff --git a/stanc/Analysis_and_optimization/index.html b/stanc/Analysis_and_optimization/index.html new file mode 100644 index 000000000..68aafec30 --- /dev/null +++ b/stanc/Analysis_and_optimization/index.html @@ -0,0 +1,2 @@ + +Analysis_and_optimization (stanc.Analysis_and_optimization)

Module Analysis_and_optimization

module Dataflow_types : sig ... end
module Dataflow_utils : sig ... end
module Debug_data_generation : sig ... end
module Dependence_analysis : sig ... end

~~~~~ TODO ~~~~~ * The interfaces are currently messed up. I think part of the solution is to change the signature of reaching_definitions_mfp in Monotone_framework, which currently requires the full program but shouldn't need the full program. As it stands, stmt_map_dependency_graph does not include data dependencies at all, since it can't use reaching deps, and prog_dependency graph only builds the graph for log_prob, but the user isn't guaranteed to be using the same labeling scheme. * Currently, dependencies on global or uninitialized data are written as depending on node '0'. This should probably be option or some type that indicates global dependence. * Indexed variables are currently handled as monoliths * No probabilistic dependency, I'll do that elsewhere *

module Factor_graph : sig ... end
module Memory_patterns : sig ... end
module Mir_utils : sig ... end
module Monotone_framework : sig ... end

The common elements of a monotone framework

module Monotone_framework_sigs : sig ... end
module Optimize : sig ... end
module Partial_evaluator : sig ... end
module Pedantic_analysis : sig ... end
module Pedantic_dist_warnings : sig ... end
diff --git a/stanc/Common/Fixed/Make/argument-1-Pattern/index.html b/stanc/Common/Fixed/Make/argument-1-Pattern/index.html new file mode 100644 index 000000000..375bcf1f2 --- /dev/null +++ b/stanc/Common/Fixed/Make/argument-1-Pattern/index.html @@ -0,0 +1,10 @@ + +Pattern (stanc.Common.Fixed.Make.Pattern)

Parameter Make.Pattern

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val map : ('a -> 'b) -> 'a t -> 'b t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Fixed/Make/index.html b/stanc/Common/Fixed/Make/index.html new file mode 100644 index 000000000..a7272a440 --- /dev/null +++ b/stanc/Common/Fixed/Make/index.html @@ -0,0 +1,16 @@ + +Make (stanc.Common.Fixed.Make)

Module Fixed.Make

Functor which creates the fixed-point of the type defined in the Pattern module argument

Parameters

Signature

type 'a t = {
  1. pattern : 'a t Pattern.t;
  2. meta : 'a;
}
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
val fold_pattern : f:(('a * 'r Pattern.t) -> 'r) -> 'a t -> 'r

fold_pattern traverses the data structure from the bottom up replacing the original meta data of type 'a with some result type 'r and combines the result values on the way back up. For example, given a pattern with the following type:

type 'a pattern = Leaf of string | Branch of 'a * 'a

we can use fold_pattern to calculate the maximum depth of data structure obtained by fixing the pattern type:

let max_depth t =
+  let f = function
+      | meta , Leaf _ -> 1
+      | meta , Branch(left_depth,right_depth) ->
+          1 + (max left_depth right_depth)
+  in
+  fold_pattern ~f t

Note that the function 'f' supplied to fold_pattern accepts a tuple rather than our type 'a t since the type of the pattern has been transformed to 'r t Pattern.t and is no longer 'compatible' with the original type of meta data 'a. That is, a tuple ('a * 'b t Pattern.t) has two type variables where as 'a t has one.

val rewrite_bottom_up : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_bottom_up specializes fold_pattern so that the result type 'r is equal to the type of our fixed-point data structure i.e. 'r = 'a t. This also means that the function f can be written with our fixed-point type 'a t as its argument.

val unfold_pattern : f:('r -> 'a * 'r Pattern.t) -> 'r -> 'a t

unfold builds a fixed-point data structure from the top down. Starting with a user-supplied seed of type 'r, unfold recursively applies the function f yielding a tuple of meta-data and pattern with elements of type 'r to which f is further applied.

The unfold terminates when a pattern element which does not carry an 'r is reached.

As with fold_pattern the function f returns a tuple of meta-data and pattern rather than our record type since, in general, 'r =/= 'a t.

val rewrite_top_down : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_top_down specializes unfold by requiring that r = 'a t. As a consequence the function f accepts our record type 'a t as its argument.

diff --git a/stanc/Common/Fixed/Make2/argument-1-First/Pattern/index.html b/stanc/Common/Fixed/Make2/argument-1-First/Pattern/index.html new file mode 100644 index 000000000..d5ac325ee --- /dev/null +++ b/stanc/Common/Fixed/Make2/argument-1-First/Pattern/index.html @@ -0,0 +1,10 @@ + +Pattern (stanc.Common.Fixed.Make2.First.Pattern)

Module First.Pattern

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val map : ('a -> 'b) -> 'a t -> 'b t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Fixed/Make2/argument-1-First/index.html b/stanc/Common/Fixed/Make2/argument-1-First/index.html new file mode 100644 index 000000000..420dd49d1 --- /dev/null +++ b/stanc/Common/Fixed/Make2/argument-1-First/index.html @@ -0,0 +1,16 @@ + +First (stanc.Common.Fixed.Make2.First)

Parameter Make2.First

type 'a t = {
  1. pattern : 'a t Pattern.t;
  2. meta : 'a;
}
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
val fold_pattern : f:(('a * 'r Pattern.t) -> 'r) -> 'a t -> 'r

fold_pattern traverses the data structure from the bottom up replacing the original meta data of type 'a with some result type 'r and combines the result values on the way back up. For example, given a pattern with the following type:

type 'a pattern = Leaf of string | Branch of 'a * 'a

we can use fold_pattern to calculate the maximum depth of data structure obtained by fixing the pattern type:

let max_depth t =
+  let f = function
+      | meta , Leaf _ -> 1
+      | meta , Branch(left_depth,right_depth) ->
+          1 + (max left_depth right_depth)
+  in
+  fold_pattern ~f t

Note that the function 'f' supplied to fold_pattern accepts a tuple rather than our type 'a t since the type of the pattern has been transformed to 'r t Pattern.t and is no longer 'compatible' with the original type of meta data 'a. That is, a tuple ('a * 'b t Pattern.t) has two type variables where as 'a t has one.

val rewrite_bottom_up : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_bottom_up specializes fold_pattern so that the result type 'r is equal to the type of our fixed-point data structure i.e. 'r = 'a t. This also means that the function f can be written with our fixed-point type 'a t as its argument.

val unfold_pattern : f:('r -> 'a * 'r Pattern.t) -> 'r -> 'a t

unfold builds a fixed-point data structure from the top down. Starting with a user-supplied seed of type 'r, unfold recursively applies the function f yielding a tuple of meta-data and pattern with elements of type 'r to which f is further applied.

The unfold terminates when a pattern element which does not carry an 'r is reached.

As with fold_pattern the function f returns a tuple of meta-data and pattern rather than our record type since, in general, 'r =/= 'a t.

val rewrite_top_down : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_top_down specializes unfold by requiring that r = 'a t. As a consequence the function f accepts our record type 'a t as its argument.

diff --git a/stanc/Common/Fixed/Make2/argument-2-Pattern/index.html b/stanc/Common/Fixed/Make2/argument-2-Pattern/index.html new file mode 100644 index 000000000..d3aa98f11 --- /dev/null +++ b/stanc/Common/Fixed/Make2/argument-2-Pattern/index.html @@ -0,0 +1,41 @@ + +Pattern (stanc.Common.Fixed.Make2.Pattern)

Parameter Make2.Pattern

type ('a, 'b) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Common/Fixed/Make2/index.html b/stanc/Common/Fixed/Make2/index.html new file mode 100644 index 000000000..8f869814a --- /dev/null +++ b/stanc/Common/Fixed/Make2/index.html @@ -0,0 +1,57 @@ + +Make2 (stanc.Common.Fixed.Make2)

Module Fixed.Make2

Parameters

module First : S

Signature

type ('a, 'b) t = {
  1. pattern : ('a First.t, ('a, 'b) t) Pattern.t;
  2. meta : 'b;
}
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
val fold_pattern : + f:(('a * 'r1 First.Pattern.t) -> 'r1) -> + g:(('b * ('r1, 'r2) Pattern.t) -> 'r2) -> + ('a, 'b) t -> + 'r2

fold_pattern traverses the data structure from the bottom up replacing the original meta data of First with type 'a with some result type 'r1 and the meta data at this level withtype 'b to another result type 'r2 and combines the result values on the way back up.

val rewrite_bottom_up : + f:('a First.t -> 'a First.t) -> + g:(('a, 'b) t -> ('a, 'b) t) -> + ('a, 'b) t -> + ('a, 'b) t

rewrite_bottom_up specializes fold_pattern so that the result type 'r1 is equal to the type of the nested fixed-point type i.e. 'r1 = 'a First.t and the result type 'r2 is equal to the top-level fixed-point type i.e. 'r2 = ('a,'b) t.

This also means that the function f can be written with our nested fixed-point type 'a First.t as its argument and g can be written with ('a,'b) t as its argument.

val unfold_pattern : + f:('r1 -> 'a * 'r1 First.Pattern.t) -> + g:('r2 -> 'b * ('r1, 'r2) Pattern.t) -> + 'r2 -> + ('a, 'b) t

unfold_pattern takes a seed value of type 'r2 and uses the function g to generate a tuple of meta-data and a pattern with types 'r1 and 'r2. The functions proceeds by recursively applying g to the contained values of type 'r2 and f to values of type 'r1 finishing when the pattern contains no values of type 'r1 or 'r2.

val rewrite_top_down : + f:('a First.t -> 'a First.t) -> + g:(('a, 'b) t -> ('a, 'b) t) -> + ('a, 'b) t -> + ('a, 'b) t

rewrite_top_down specializes unfold_pattern in a manner analogous to how rewrite_bottom_up specializes fold_pattern

diff --git a/stanc/Common/Fixed/index.html b/stanc/Common/Fixed/index.html new file mode 100644 index 000000000..8d51cd3ba --- /dev/null +++ b/stanc/Common/Fixed/index.html @@ -0,0 +1,5 @@ + +Fixed (stanc.Common.Fixed)

Module Common.Fixed

This module defines the signatures and Make functors for the 'fixed point' (or two-level) type we use for our intermediate representations

module type S = sig ... end

The fixed-point of Pattern.t annotated with some meta-data

module Make (Pattern : Pattern.S) : S with module Pattern := Pattern

Functor which creates the fixed-point of the type defined in the Pattern module argument

module type S2 = sig ... end

Nested fixed-point type where an element of the Pattern is itself a fixed-point type. We use this to represent statements which contain expressions.

module Make2 + (First : S) + (Pattern : Pattern.S2) : + S2 with module First := First and module Pattern := Pattern
diff --git a/stanc/Common/Fixed/module-type-S/Pattern/index.html b/stanc/Common/Fixed/module-type-S/Pattern/index.html new file mode 100644 index 000000000..43c31cf02 --- /dev/null +++ b/stanc/Common/Fixed/module-type-S/Pattern/index.html @@ -0,0 +1,10 @@ + +Pattern (stanc.Common.Fixed.S.Pattern)

Module S.Pattern

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val map : ('a -> 'b) -> 'a t -> 'b t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Fixed/module-type-S/index.html b/stanc/Common/Fixed/module-type-S/index.html new file mode 100644 index 000000000..5fef668a1 --- /dev/null +++ b/stanc/Common/Fixed/module-type-S/index.html @@ -0,0 +1,16 @@ + +S (stanc.Common.Fixed.S)

Module type Fixed.S

The fixed-point of Pattern.t annotated with some meta-data

type 'a t = {
  1. pattern : 'a t Pattern.t;
  2. meta : 'a;
}
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
val fold_pattern : f:(('a * 'r Pattern.t) -> 'r) -> 'a t -> 'r

fold_pattern traverses the data structure from the bottom up replacing the original meta data of type 'a with some result type 'r and combines the result values on the way back up. For example, given a pattern with the following type:

type 'a pattern = Leaf of string | Branch of 'a * 'a

we can use fold_pattern to calculate the maximum depth of data structure obtained by fixing the pattern type:

let max_depth t =
+  let f = function
+      | meta , Leaf _ -> 1
+      | meta , Branch(left_depth,right_depth) ->
+          1 + (max left_depth right_depth)
+  in
+  fold_pattern ~f t

Note that the function 'f' supplied to fold_pattern accepts a tuple rather than our type 'a t since the type of the pattern has been transformed to 'r t Pattern.t and is no longer 'compatible' with the original type of meta data 'a. That is, a tuple ('a * 'b t Pattern.t) has two type variables where as 'a t has one.

val rewrite_bottom_up : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_bottom_up specializes fold_pattern so that the result type 'r is equal to the type of our fixed-point data structure i.e. 'r = 'a t. This also means that the function f can be written with our fixed-point type 'a t as its argument.

val unfold_pattern : f:('r -> 'a * 'r Pattern.t) -> 'r -> 'a t

unfold builds a fixed-point data structure from the top down. Starting with a user-supplied seed of type 'r, unfold recursively applies the function f yielding a tuple of meta-data and pattern with elements of type 'r to which f is further applied.

The unfold terminates when a pattern element which does not carry an 'r is reached.

As with fold_pattern the function f returns a tuple of meta-data and pattern rather than our record type since, in general, 'r =/= 'a t.

val rewrite_top_down : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_top_down specializes unfold by requiring that r = 'a t. As a consequence the function f accepts our record type 'a t as its argument.

diff --git a/stanc/Common/Fixed/module-type-S2/First/Pattern/index.html b/stanc/Common/Fixed/module-type-S2/First/Pattern/index.html new file mode 100644 index 000000000..e76d9d1b0 --- /dev/null +++ b/stanc/Common/Fixed/module-type-S2/First/Pattern/index.html @@ -0,0 +1,10 @@ + +Pattern (stanc.Common.Fixed.S2.First.Pattern)

Module First.Pattern

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val map : ('a -> 'b) -> 'a t -> 'b t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Fixed/module-type-S2/First/index.html b/stanc/Common/Fixed/module-type-S2/First/index.html new file mode 100644 index 000000000..9ddb89fae --- /dev/null +++ b/stanc/Common/Fixed/module-type-S2/First/index.html @@ -0,0 +1,16 @@ + +First (stanc.Common.Fixed.S2.First)

Module S2.First

type 'a t = {
  1. pattern : 'a t Pattern.t;
  2. meta : 'a;
}
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
val fold_pattern : f:(('a * 'r Pattern.t) -> 'r) -> 'a t -> 'r

fold_pattern traverses the data structure from the bottom up replacing the original meta data of type 'a with some result type 'r and combines the result values on the way back up. For example, given a pattern with the following type:

type 'a pattern = Leaf of string | Branch of 'a * 'a

we can use fold_pattern to calculate the maximum depth of data structure obtained by fixing the pattern type:

let max_depth t =
+  let f = function
+      | meta , Leaf _ -> 1
+      | meta , Branch(left_depth,right_depth) ->
+          1 + (max left_depth right_depth)
+  in
+  fold_pattern ~f t

Note that the function 'f' supplied to fold_pattern accepts a tuple rather than our type 'a t since the type of the pattern has been transformed to 'r t Pattern.t and is no longer 'compatible' with the original type of meta data 'a. That is, a tuple ('a * 'b t Pattern.t) has two type variables where as 'a t has one.

val rewrite_bottom_up : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_bottom_up specializes fold_pattern so that the result type 'r is equal to the type of our fixed-point data structure i.e. 'r = 'a t. This also means that the function f can be written with our fixed-point type 'a t as its argument.

val unfold_pattern : f:('r -> 'a * 'r Pattern.t) -> 'r -> 'a t

unfold builds a fixed-point data structure from the top down. Starting with a user-supplied seed of type 'r, unfold recursively applies the function f yielding a tuple of meta-data and pattern with elements of type 'r to which f is further applied.

The unfold terminates when a pattern element which does not carry an 'r is reached.

As with fold_pattern the function f returns a tuple of meta-data and pattern rather than our record type since, in general, 'r =/= 'a t.

val rewrite_top_down : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_top_down specializes unfold by requiring that r = 'a t. As a consequence the function f accepts our record type 'a t as its argument.

diff --git a/stanc/Common/Fixed/module-type-S2/Pattern/index.html b/stanc/Common/Fixed/module-type-S2/Pattern/index.html new file mode 100644 index 000000000..54600e21c --- /dev/null +++ b/stanc/Common/Fixed/module-type-S2/Pattern/index.html @@ -0,0 +1,41 @@ + +Pattern (stanc.Common.Fixed.S2.Pattern)

Module S2.Pattern

type ('a, 'b) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Common/Fixed/module-type-S2/index.html b/stanc/Common/Fixed/module-type-S2/index.html new file mode 100644 index 000000000..09d11e031 --- /dev/null +++ b/stanc/Common/Fixed/module-type-S2/index.html @@ -0,0 +1,57 @@ + +S2 (stanc.Common.Fixed.S2)

Module type Fixed.S2

Nested fixed-point type where an element of the Pattern is itself a fixed-point type. We use this to represent statements which contain expressions.

module First : S
type ('a, 'b) t = {
  1. pattern : ('a First.t, ('a, 'b) t) Pattern.t;
  2. meta : 'b;
}
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
val fold_pattern : + f:(('a * 'r1 First.Pattern.t) -> 'r1) -> + g:(('b * ('r1, 'r2) Pattern.t) -> 'r2) -> + ('a, 'b) t -> + 'r2

fold_pattern traverses the data structure from the bottom up replacing the original meta data of First with type 'a with some result type 'r1 and the meta data at this level withtype 'b to another result type 'r2 and combines the result values on the way back up.

val rewrite_bottom_up : + f:('a First.t -> 'a First.t) -> + g:(('a, 'b) t -> ('a, 'b) t) -> + ('a, 'b) t -> + ('a, 'b) t

rewrite_bottom_up specializes fold_pattern so that the result type 'r1 is equal to the type of the nested fixed-point type i.e. 'r1 = 'a First.t and the result type 'r2 is equal to the top-level fixed-point type i.e. 'r2 = ('a,'b) t.

This also means that the function f can be written with our nested fixed-point type 'a First.t as its argument and g can be written with ('a,'b) t as its argument.

val unfold_pattern : + f:('r1 -> 'a * 'r1 First.Pattern.t) -> + g:('r2 -> 'b * ('r1, 'r2) Pattern.t) -> + 'r2 -> + ('a, 'b) t

unfold_pattern takes a seed value of type 'r2 and uses the function g to generate a tuple of meta-data and a pattern with types 'r1 and 'r2. The functions proceeds by recursively applying g to the contained values of type 'r2 and f to values of type 'r1 finishing when the pattern contains no values of type 'r1 or 'r2.

val rewrite_top_down : + f:('a First.t -> 'a First.t) -> + g:(('a, 'b) t -> ('a, 'b) t) -> + ('a, 'b) t -> + ('a, 'b) t

rewrite_top_down specializes unfold_pattern in a manner analogous to how rewrite_bottom_up specializes fold_pattern

diff --git a/stanc/Common/Foldable/Make/argument-1-X/index.html b/stanc/Common/Foldable/Make/argument-1-X/index.html new file mode 100644 index 000000000..5a744d1d9 --- /dev/null +++ b/stanc/Common/Foldable/Make/argument-1-X/index.html @@ -0,0 +1,2 @@ + +X (stanc.Common.Foldable.Make.X)

Parameter Make.X

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
diff --git a/stanc/Common/Foldable/Make/index.html b/stanc/Common/Foldable/Make/index.html new file mode 100644 index 000000000..681fcf23f --- /dev/null +++ b/stanc/Common/Foldable/Make/index.html @@ -0,0 +1,2 @@ + +Make (stanc.Common.Foldable.Make)

Module Foldable.Make

Parameters

module X : Basic

Signature

val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a X.t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a X.t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a X.t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a X.t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

diff --git a/stanc/Common/Foldable/Make2/argument-1-X/index.html b/stanc/Common/Foldable/Make2/argument-1-X/index.html new file mode 100644 index 000000000..a1e09652e --- /dev/null +++ b/stanc/Common/Foldable/Make2/argument-1-X/index.html @@ -0,0 +1,2 @@ + +X (stanc.Common.Foldable.Make2.X)

Parameter Make2.X

type ('a, 'b) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
diff --git a/stanc/Common/Foldable/Make2/index.html b/stanc/Common/Foldable/Make2/index.html new file mode 100644 index 000000000..2e305b30e --- /dev/null +++ b/stanc/Common/Foldable/Make2/index.html @@ -0,0 +1,22 @@ + +Make2 (stanc.Common.Foldable.Make2)

Module Foldable.Make2

Parameters

module X : Basic2

Signature

val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) X.t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) X.t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) X.t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) X.t -> + bool
diff --git a/stanc/Common/Foldable/index.html b/stanc/Common/Foldable/index.html new file mode 100644 index 000000000..0b55019f9 --- /dev/null +++ b/stanc/Common/Foldable/index.html @@ -0,0 +1,2 @@ + +Foldable (stanc.Common.Foldable)

Module Common.Foldable

This module follows the Jane Street organisation and naming conventions for 'standard interfaces' i.e. commonly used signatures; briefly:

  • Basic defines the _minimal_ set of type and function signatures that a user must provide
  • S defines the _complete_ set of type and functions signatures that will be exposed by any module supporting the standard interface associated with S
  • Make is a functor (i.e. a function from module to module) that takes the user supplied Basic module and returns a completed module with the signature defined by S

Where a standard interface is defined for difference arities of type constructors, the convention is to append the arity to the names of the signatures and functors e.g. Basic2, S2 and Make2

module type Basic = sig ... end

The Basic definition for type constructors with a single type variable.

module type S = sig ... end

The complete module signature for Foldable for types with a single type variable.

module Make (X : Basic) : S with type 'a t := 'a X.t
module type Basic2 = sig ... end

The Basic definition for type constructors with two type variables.

module type S2 = sig ... end

The complete module signature for Foldable for types with a single type variable.

module Make2 (X : Basic2) : S2 with type ('a, 'b) t := ('a, 'b) X.t
diff --git a/stanc/Common/Foldable/module-type-Basic/index.html b/stanc/Common/Foldable/module-type-Basic/index.html new file mode 100644 index 000000000..dd3140f8d --- /dev/null +++ b/stanc/Common/Foldable/module-type-Basic/index.html @@ -0,0 +1,2 @@ + +Basic (stanc.Common.Foldable.Basic)

Module type Foldable.Basic

The Basic definition for type constructors with a single type variable.

This signature just says that you have some type 'a t and a function fold with type:

fold: ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b

This function can be derived using ppx_deriving.

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
diff --git a/stanc/Common/Foldable/module-type-Basic2/index.html b/stanc/Common/Foldable/module-type-Basic2/index.html new file mode 100644 index 000000000..5861a0962 --- /dev/null +++ b/stanc/Common/Foldable/module-type-Basic2/index.html @@ -0,0 +1,2 @@ + +Basic2 (stanc.Common.Foldable.Basic2)

Module type Foldable.Basic2

The Basic definition for type constructors with two type variables.

type ('a, 'b) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
diff --git a/stanc/Common/Foldable/module-type-S/index.html b/stanc/Common/Foldable/module-type-S/index.html new file mode 100644 index 000000000..c1e492505 --- /dev/null +++ b/stanc/Common/Foldable/module-type-S/index.html @@ -0,0 +1,2 @@ + +S (stanc.Common.Foldable.S)

Module type Foldable.S

The complete module signature for Foldable for types with a single type variable.

type 'a t

A data structure which can be folded

val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

diff --git a/stanc/Common/Foldable/module-type-S2/index.html b/stanc/Common/Foldable/module-type-S2/index.html new file mode 100644 index 000000000..1814f6ab9 --- /dev/null +++ b/stanc/Common/Foldable/module-type-S2/index.html @@ -0,0 +1,22 @@ + +S2 (stanc.Common.Foldable.S2)

Module type Foldable.S2

The complete module signature for Foldable for types with a single type variable.

type ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
diff --git a/stanc/Common/Gensym/index.html b/stanc/Common/Gensym/index.html new file mode 100644 index 000000000..e9d81adc1 --- /dev/null +++ b/stanc/Common/Gensym/index.html @@ -0,0 +1,2 @@ + +Gensym (stanc.Common.Gensym)

Module Common.Gensym

Generate fresh (never before used) symbols.

Uses an internal (mutable) counter

val generate : ?prefix:string -> unit -> string
val enter : unit -> string * (unit -> unit)
val reset_danger_use_cautiously : unit -> unit
diff --git a/stanc/Common/ICE/index.html b/stanc/Common/ICE/index.html new file mode 100644 index 000000000..444ae4777 --- /dev/null +++ b/stanc/Common/ICE/index.html @@ -0,0 +1,2 @@ + +ICE (stanc.Common.ICE)

Module Common.ICE

Internal compiler errors

val internal_compiler_error : Base__.Sexp.t -> 'a

An alias of Core.raise_s. This used to do more processing, for now it is preserved just as a nicer marker in the code

val with_exn_message : (unit -> 'a) -> ('a, string) Core._result

Catch all exceptions at the top-level and convert them into a 'a, string result where the string contains the exception and a backtrace if present, followed by a link to our bugtracker.

diff --git a/stanc/Common/Pattern/index.html b/stanc/Common/Pattern/index.html new file mode 100644 index 000000000..7c94210a6 --- /dev/null +++ b/stanc/Common/Pattern/index.html @@ -0,0 +1,2 @@ + +Pattern (stanc.Common.Pattern)

Module Common.Pattern

A Pattern defines the signature of modules that may be fixed with Fixed.Make and Fixed.Make2.

These signatures ensure that all the operations we want to support on our top level intermediate representations can be defined by the Fixed.Make functors.

module type S = sig ... end
module type S2 = sig ... end
diff --git a/stanc/Common/Pattern/module-type-S/index.html b/stanc/Common/Pattern/module-type-S/index.html new file mode 100644 index 000000000..0476f3131 --- /dev/null +++ b/stanc/Common/Pattern/module-type-S/index.html @@ -0,0 +1,10 @@ + +S (stanc.Common.Pattern.S)

Module type Pattern.S

type 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val map : ('a -> 'b) -> 'a t -> 'b t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Pattern/module-type-S2/index.html b/stanc/Common/Pattern/module-type-S2/index.html new file mode 100644 index 000000000..465524e27 --- /dev/null +++ b/stanc/Common/Pattern/module-type-S2/index.html @@ -0,0 +1,41 @@ + +S2 (stanc.Common.Pattern.S2)

Module type Pattern.S2

type ('a, 'b) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Common/Pretty/index.html b/stanc/Common/Pretty/index.html new file mode 100644 index 000000000..fc378fece --- /dev/null +++ b/stanc/Common/Pretty/index.html @@ -0,0 +1,2 @@ + +Pretty (stanc.Common.Pretty)

Module Common.Pretty

Named signatures for types that can be pretty-printed.

module type S = sig ... end
module type S1 = sig ... end
module type S2 = sig ... end
diff --git a/stanc/Common/Pretty/module-type-S/index.html b/stanc/Common/Pretty/module-type-S/index.html new file mode 100644 index 000000000..078731b89 --- /dev/null +++ b/stanc/Common/Pretty/module-type-S/index.html @@ -0,0 +1,2 @@ + +S (stanc.Common.Pretty.S)

Module type Pretty.S

type t
val pp : Stdlib.Format.formatter -> t -> unit
diff --git a/stanc/Common/Pretty/module-type-S1/index.html b/stanc/Common/Pretty/module-type-S1/index.html new file mode 100644 index 000000000..ed0750e00 --- /dev/null +++ b/stanc/Common/Pretty/module-type-S1/index.html @@ -0,0 +1,6 @@ + +S1 (stanc.Common.Pretty.S1)

Module type Pretty.S1

type 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Pretty/module-type-S2/index.html b/stanc/Common/Pretty/module-type-S2/index.html new file mode 100644 index 000000000..a9313b411 --- /dev/null +++ b/stanc/Common/Pretty/module-type-S2/index.html @@ -0,0 +1,7 @@ + +S2 (stanc.Common.Pretty.S2)

Module type Pretty.S2

type ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Common/Specialized/Make/Map/Key/index.html b/stanc/Common/Specialized/Make/Map/Key/index.html new file mode 100644 index 000000000..3695288cf --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/Make/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Common/Specialized/Make/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..a58126d83 --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make/Map/Provide_bin_io/index.html b/stanc/Common/Specialized/Make/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..7741d9d8f --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.Make.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Common/Specialized/Make/Map/Provide_hash/argument-1-Key/index.html b/stanc/Common/Specialized/Make/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..422c15ee0 --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/Make/Map/Provide_hash/index.html b/stanc/Common/Specialized/Make/Map/Provide_hash/index.html new file mode 100644 index 000000000..e11b878ed --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Common.Specialized.Make.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Common/Specialized/Make/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Common/Specialized/Make/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..e07c51abc --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Common/Specialized/Make/Map/Provide_of_sexp/index.html b/stanc/Common/Specialized/Make/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..28aca4e3b --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.Make.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Common/Specialized/Make/Map/index.html b/stanc/Common/Specialized/Make/Map/index.html new file mode 100644 index 000000000..458bd2fdc --- /dev/null +++ b/stanc/Common/Specialized/Make/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Common.Specialized.Make.Map)

Module Make.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/Make/Replace_polymorphic_compare/index.html b/stanc/Common/Specialized/Make/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..052fd4e3a --- /dev/null +++ b/stanc/Common/Specialized/Make/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Common.Specialized.Make.Replace_polymorphic_compare)

Module Make.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Common/Specialized/Make/Set/Elt/index.html b/stanc/Common/Specialized/Make/Set/Elt/index.html new file mode 100644 index 000000000..3242af8d5 --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/Make/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Common/Specialized/Make/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..1d585d9d7 --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make/Set/Provide_bin_io/index.html b/stanc/Common/Specialized/Make/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..7ee0edc0d --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.Make.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Common/Specialized/Make/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..1dc5872a8 --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/Make/Set/Provide_hash/index.html b/stanc/Common/Specialized/Make/Set/Provide_hash/index.html new file mode 100644 index 000000000..88546c011 --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Common.Specialized.Make.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Common/Specialized/Make/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Common/Specialized/Make/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..7ceefc37d --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Common/Specialized/Make/Set/Provide_of_sexp/index.html b/stanc/Common/Specialized/Make/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..11d932539 --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.Make.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Common/Specialized/Make/Set/index.html b/stanc/Common/Specialized/Make/Set/index.html new file mode 100644 index 000000000..18256e21b --- /dev/null +++ b/stanc/Common/Specialized/Make/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Common.Specialized.Make.Set)

Module Make.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/Make/argument-1-X/index.html b/stanc/Common/Specialized/Make/argument-1-X/index.html new file mode 100644 index 000000000..373c012ae --- /dev/null +++ b/stanc/Common/Specialized/Make/argument-1-X/index.html @@ -0,0 +1,10 @@ + +X (stanc.Common.Specialized.Make.X)

Parameter Make.X

type 'a t
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Specialized/Make/argument-2-Meta/index.html b/stanc/Common/Specialized/Make/argument-2-Meta/index.html new file mode 100644 index 000000000..88cfb1bfb --- /dev/null +++ b/stanc/Common/Specialized/Make/argument-2-Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Common.Specialized.Make.Meta)

Parameter Make.Meta

type t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Common/Specialized/Make/index.html b/stanc/Common/Specialized/Make/index.html new file mode 100644 index 000000000..c14b756d9 --- /dev/null +++ b/stanc/Common/Specialized/Make/index.html @@ -0,0 +1,7 @@ + +Make (stanc.Common.Specialized.Make)

Module Specialized.Make

Parameters

module X : Unspecialized
module Meta : Meta

Signature

type t = Meta.t X.t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Common/Specialized/Make2/Map/Key/index.html b/stanc/Common/Specialized/Make2/Map/Key/index.html new file mode 100644 index 000000000..e7251f727 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/Make2/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Common/Specialized/Make2/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..b2561c59e --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make2/Map/Provide_bin_io/index.html b/stanc/Common/Specialized/Make2/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..30525c765 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.Make2.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Common/Specialized/Make2/Map/Provide_hash/argument-1-Key/index.html b/stanc/Common/Specialized/Make2/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..12f651df0 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/Make2/Map/Provide_hash/index.html b/stanc/Common/Specialized/Make2/Map/Provide_hash/index.html new file mode 100644 index 000000000..231b64a7c --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Common.Specialized.Make2.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Common/Specialized/Make2/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Common/Specialized/Make2/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..54097d677 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Common/Specialized/Make2/Map/Provide_of_sexp/index.html b/stanc/Common/Specialized/Make2/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..56c5a9eaa --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.Make2.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Common/Specialized/Make2/Map/index.html b/stanc/Common/Specialized/Make2/Map/index.html new file mode 100644 index 000000000..2537acc78 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Common.Specialized.Make2.Map)

Module Make2.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/Make2/Replace_polymorphic_compare/index.html b/stanc/Common/Specialized/Make2/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..6d1bc622e --- /dev/null +++ b/stanc/Common/Specialized/Make2/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Common.Specialized.Make2.Replace_polymorphic_compare)

Module Make2.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Common/Specialized/Make2/Set/Elt/index.html b/stanc/Common/Specialized/Make2/Set/Elt/index.html new file mode 100644 index 000000000..61c7defd1 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/Make2/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Common/Specialized/Make2/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..49e58270f --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make2/Set/Provide_bin_io/index.html b/stanc/Common/Specialized/Make2/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..8822f4764 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.Make2.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make2/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Common/Specialized/Make2/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..b2ea75e76 --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/Make2/Set/Provide_hash/index.html b/stanc/Common/Specialized/Make2/Set/Provide_hash/index.html new file mode 100644 index 000000000..7e0ba316b --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Common.Specialized.Make2.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Common/Specialized/Make2/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Common/Specialized/Make2/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..9b56c092f --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Common/Specialized/Make2/Set/Provide_of_sexp/index.html b/stanc/Common/Specialized/Make2/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..7d4723a3b --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.Make2.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Common/Specialized/Make2/Set/index.html b/stanc/Common/Specialized/Make2/Set/index.html new file mode 100644 index 000000000..966d527cf --- /dev/null +++ b/stanc/Common/Specialized/Make2/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Common.Specialized.Make2.Set)

Module Make2.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/Make2/argument-1-X/index.html b/stanc/Common/Specialized/Make2/argument-1-X/index.html new file mode 100644 index 000000000..171cce02d --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-1-X/index.html @@ -0,0 +1,21 @@ + +X (stanc.Common.Specialized.Make2.X)

Parameter Make2.X

type ('a, 'b) t
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Key/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Key/index.html new file mode 100644 index 000000000..72bda60ac --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.First.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..23fab89d1 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.First.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..989fe9bbc --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.Make2.First.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/argument-1-Key/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..ed66c06e7 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.First.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/index.html new file mode 100644 index 000000000..cb431fd36 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Common.Specialized.Make2.First.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..7f96d503d --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.Make2.First.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..bb65fc1fd --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.Make2.First.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Map/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Map/index.html new file mode 100644 index 000000000..20cb74d95 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Common.Specialized.Make2.First.Map)

Module First.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Meta/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Meta/index.html new file mode 100644 index 000000000..07bde0674 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Common.Specialized.Make2.First.Meta)

Module First.Meta

type t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Replace_polymorphic_compare/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..370ae7df8 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Common.Specialized.Make2.First.Replace_polymorphic_compare)

Module First.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Elt/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Elt/index.html new file mode 100644 index 000000000..ccdfe0984 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.First.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..6c8e2a3bb --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.First.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..9de3d9174 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.Make2.First.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..4a9c6a795 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.First.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/index.html new file mode 100644 index 000000000..3c7baf4c7 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Common.Specialized.Make2.First.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..6db93e33f --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.Make2.First.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..5709be155 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.Make2.First.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/Set/index.html b/stanc/Common/Specialized/Make2/argument-2-First/Set/index.html new file mode 100644 index 000000000..ae590f94b --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Common.Specialized.Make2.First.Set)

Module First.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/Make2/argument-2-First/index.html b/stanc/Common/Specialized/Make2/argument-2-First/index.html new file mode 100644 index 000000000..0fca7447c --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-2-First/index.html @@ -0,0 +1,7 @@ + +First (stanc.Common.Specialized.Make2.First)

Parameter Make2.First

type t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
module Meta : Meta
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Common/Specialized/Make2/argument-3-Meta/index.html b/stanc/Common/Specialized/Make2/argument-3-Meta/index.html new file mode 100644 index 000000000..d40215b90 --- /dev/null +++ b/stanc/Common/Specialized/Make2/argument-3-Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Common.Specialized.Make2.Meta)

Parameter Make2.Meta

type t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Common/Specialized/Make2/index.html b/stanc/Common/Specialized/Make2/index.html new file mode 100644 index 000000000..9f5d02816 --- /dev/null +++ b/stanc/Common/Specialized/Make2/index.html @@ -0,0 +1,7 @@ + +Make2 (stanc.Common.Specialized.Make2)

Module Specialized.Make2

Parameters

module X : Unspecialized2
module First : S
module Meta : Meta

Signature

type t = (First.Meta.t, Meta.t) X.t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Common/Specialized/index.html b/stanc/Common/Specialized/index.html new file mode 100644 index 000000000..3a95f8deb --- /dev/null +++ b/stanc/Common/Specialized/index.html @@ -0,0 +1,9 @@ + +Specialized (stanc.Common.Specialized)

Module Common.Specialized

This module defines signature and functors used to 'specialize' a fixed-point type that is polymorphic in the type of meta-data to a particular type of meta-data.

This specialization is useful since we end up with a concrete type of kind * (i.e. not a type _constructor_) allowing us to make the type Comparable. In the analysis and optimization code, we work with map's and sets of our IR types a lot and this approach makes the types much nicer to work with.

module type Meta = sig ... end

Signature of all meta data used to annotate IRs

module type Unspecialized = sig ... end
module type Unspecialized2 = sig ... end
module type S = sig ... end

Since the type t is now concrete (i.e. not a type _constructor_) we can construct a Comparable.S giving us Map and Set specialized to the type.

module Make + (X : Unspecialized) + (Meta : Meta) : + S with type t = Meta.t X.t and module Meta := Meta
module Make2 + (X : Unspecialized2) + (First : S) + (Meta : Meta) : + S with type t = (First.Meta.t, Meta.t) X.t and module Meta := Meta
diff --git a/stanc/Common/Specialized/module-type-Meta/index.html b/stanc/Common/Specialized/module-type-Meta/index.html new file mode 100644 index 000000000..a14dde51d --- /dev/null +++ b/stanc/Common/Specialized/module-type-Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Common.Specialized.Meta)

Module type Specialized.Meta

Signature of all meta data used to annotate IRs

type t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Common/Specialized/module-type-S/Map/Key/index.html b/stanc/Common/Specialized/module-type-S/Map/Key/index.html new file mode 100644 index 000000000..c614a6553 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.S.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..2beb62169 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.S.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/index.html b/stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..f9e484ef5 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.S.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Common/Specialized/module-type-S/Map/Provide_hash/argument-1-Key/index.html b/stanc/Common/Specialized/module-type-S/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..38dd2793b --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.S.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/module-type-S/Map/Provide_hash/index.html b/stanc/Common/Specialized/module-type-S/Map/Provide_hash/index.html new file mode 100644 index 000000000..f82bbf3ed --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Common.Specialized.S.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..731f4725f --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Common.Specialized.S.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/index.html b/stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..b45d97199 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.S.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Common/Specialized/module-type-S/Map/index.html b/stanc/Common/Specialized/module-type-S/Map/index.html new file mode 100644 index 000000000..122229dad --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Common.Specialized.S.Map)

Module S.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/module-type-S/Meta/index.html b/stanc/Common/Specialized/module-type-S/Meta/index.html new file mode 100644 index 000000000..15e48dac0 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Common.Specialized.S.Meta)

Module S.Meta

type t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Common/Specialized/module-type-S/Replace_polymorphic_compare/index.html b/stanc/Common/Specialized/module-type-S/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..83aac70bc --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Common.Specialized.S.Replace_polymorphic_compare)

Module S.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Common/Specialized/module-type-S/Set/Elt/index.html b/stanc/Common/Specialized/module-type-S/Set/Elt/index.html new file mode 100644 index 000000000..9df6f1b86 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.S.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..45ee133fb --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.S.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/index.html b/stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..add66dabc --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Common.Specialized.S.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Common/Specialized/module-type-S/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Common/Specialized/module-type-S/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..cc090cfc0 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.S.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Common/Specialized/module-type-S/Set/Provide_hash/index.html b/stanc/Common/Specialized/module-type-S/Set/Provide_hash/index.html new file mode 100644 index 000000000..20f7c7168 --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Common.Specialized.S.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..142c772bd --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Common.Specialized.S.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/index.html b/stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..15540639a --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Common.Specialized.S.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Common/Specialized/module-type-S/Set/index.html b/stanc/Common/Specialized/module-type-S/Set/index.html new file mode 100644 index 000000000..e916b6a8b --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Common.Specialized.S.Set)

Module S.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Common/Specialized/module-type-S/index.html b/stanc/Common/Specialized/module-type-S/index.html new file mode 100644 index 000000000..6df6ed16b --- /dev/null +++ b/stanc/Common/Specialized/module-type-S/index.html @@ -0,0 +1,7 @@ + +S (stanc.Common.Specialized.S)

Module type Specialized.S

Since the type t is now concrete (i.e. not a type _constructor_) we can construct a Comparable.S giving us Map and Set specialized to the type.

type t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
module Meta : Meta
include Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Common/Specialized/module-type-Unspecialized/index.html b/stanc/Common/Specialized/module-type-Unspecialized/index.html new file mode 100644 index 000000000..5ce0d0371 --- /dev/null +++ b/stanc/Common/Specialized/module-type-Unspecialized/index.html @@ -0,0 +1,10 @@ + +Unspecialized (stanc.Common.Specialized.Unspecialized)

Module type Specialized.Unspecialized

type 'a t
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Common/Specialized/module-type-Unspecialized2/index.html b/stanc/Common/Specialized/module-type-Unspecialized2/index.html new file mode 100644 index 000000000..fcaf864a5 --- /dev/null +++ b/stanc/Common/Specialized/module-type-Unspecialized2/index.html @@ -0,0 +1,21 @@ + +Unspecialized2 (stanc.Common.Specialized.Unspecialized2)

Module type Specialized.Unspecialized2

type ('a, 'b) t
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Common/index.html b/stanc/Common/index.html new file mode 100644 index 000000000..de3d9f017 --- /dev/null +++ b/stanc/Common/index.html @@ -0,0 +1,2 @@ + +Common (stanc.Common)

Module Common

module Fixed : sig ... end

This module defines the signatures and Make functors for the 'fixed point' (or two-level) type we use for our intermediate representations

module Foldable : sig ... end

This module follows the Jane Street organisation and naming conventions for 'standard interfaces' i.e. commonly used signatures; briefly:

module Gensym : sig ... end

Generate fresh (never before used) symbols.

module ICE : sig ... end

Internal compiler errors

module Pattern : sig ... end

A Pattern defines the signature of modules that may be fixed with Fixed.Make and Fixed.Make2.

module Pretty : sig ... end

Named signatures for types that can be pretty-printed.

module Specialized : sig ... end

This module defines signature and functors used to 'specialize' a fixed-point type that is polymorphic in the type of meta-data to a particular type of meta-data.

diff --git a/stanc/Frontend/Ast/index.html b/stanc/Frontend/Ast/index.html new file mode 100644 index 000000000..ba7fdf951 --- /dev/null +++ b/stanc/Frontend/Ast/index.html @@ -0,0 +1,388 @@ + +Ast (stanc.Frontend.Ast)

Module Frontend.Ast

Abstract syntax tree for Stan. Defined with the 'two-level types' pattern, where the variant types are not directly recursive, but rather parametric in some other type.

This type ends up being substituted for the fixpoint of the recursive type itself including metadata. So instead of recursively referencing expression you would instead reference type parameter 'e, which will later be filled in with something like type expr_with_meta = metadata expression

type identifier = {
  1. name : string;
  2. id_loc : Middle.Location_span.t;
}

Our type for identifiers, on which we record a location

val identifier_of_sexp : Sexplib0.Sexp.t -> identifier
val sexp_of_identifier : identifier -> Sexplib0.Sexp.t
val hash_fold_identifier : + Ppx_hash_lib.Std.Hash.state -> + identifier -> + Ppx_hash_lib.Std.Hash.state
val hash_identifier : identifier -> Ppx_hash_lib.Std.Hash.hash_value
val compare_identifier : identifier -> identifier -> int
type 'e index =
  1. | All
  2. | Single of 'e
  3. | Upfrom of 'e
  4. | Downfrom of 'e
  5. | Between of 'e * 'e

Indices for array access

val map_index : ('a -> 'b) -> 'a index -> 'b index
val fold_index : ('a -> 'b -> 'a) -> 'a -> 'b index -> 'a
val index_of_sexp : 'e. (Sexplib0.Sexp.t -> 'e) -> Sexplib0.Sexp.t -> 'e index
val sexp_of_index : 'e. ('e -> Sexplib0.Sexp.t) -> 'e index -> Sexplib0.Sexp.t
val hash_fold_index : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e index -> + Ppx_hash_lib.Std.Hash.state
val compare_index : 'e. ('e -> 'e -> int) -> 'e index -> 'e index -> int
type fun_kind =
  1. | StanLib of bool Middle.Fun_kind.suffix
  2. | UserDefined of bool Middle.Fun_kind.suffix

Front-end function kinds

val compare_fun_kind : fun_kind -> fun_kind -> int
val fun_kind_of_sexp : Sexplib0.Sexp.t -> fun_kind
val sexp_of_fun_kind : fun_kind -> Sexplib0.Sexp.t
val hash_fold_fun_kind : + Ppx_hash_lib.Std.Hash.state -> + fun_kind -> + Ppx_hash_lib.Std.Hash.state
val hash_fun_kind : fun_kind -> Ppx_hash_lib.Std.Hash.hash_value
type ('e, 'f) expression =
  1. | TernaryIf of 'e * 'e * 'e
  2. | BinOp of 'e * Middle.Operator.t * 'e
  3. | PrefixOp of Middle.Operator.t * 'e
  4. | PostfixOp of 'e * Middle.Operator.t
  5. | Variable of identifier
  6. | IntNumeral of string
  7. | RealNumeral of string
  8. | ImagNumeral of string
  9. | FunApp of 'f * identifier * 'e list
  10. | CondDistApp of 'f * identifier * 'e list
  11. | Promotion of 'e * Middle.UnsizedType.t * Middle.UnsizedType.autodifftype
  12. | GetTarget
  13. | ArrayExpr of 'e list
  14. | RowVectorExpr of 'e list
  15. | Paren of 'e
  16. | Indexed of 'e * 'e index list
  17. | TupleProjection of 'e * int
  18. | TupleExpr of 'e list

Expression shapes (used for both typed and untyped expressions, where we substitute untyped_expression or typed_expression for 'e

val map_expression : + ('a -> 'b) -> + ('c -> 'd) -> + ('a, 'c) expression -> + ('b, 'd) expression
val fold_expression : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + 'a -> + ('b, 'c) expression -> + 'a
val expression_of_sexp : + 'e 'f. (Sexplib0.Sexp.t -> 'e) -> + (Sexplib0.Sexp.t -> 'f) -> + Sexplib0.Sexp.t -> + ('e, 'f) expression
val sexp_of_expression : + 'e 'f. ('e -> Sexplib0.Sexp.t) -> + ('f -> Sexplib0.Sexp.t) -> + ('e, 'f) expression -> + Sexplib0.Sexp.t
val hash_fold_expression : + 'e 'f. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'f -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + ('e, 'f) expression -> + Ppx_hash_lib.Std.Hash.state
val compare_expression : + 'e 'f. ('e -> 'e -> Core__.Import.int) -> + ('f -> 'f -> Core__.Import.int) -> + ('e, 'f) expression -> + ('e, 'f) expression -> + Core__.Import.int
type ('m, 'f) expr_with = {
  1. expr : (('m, 'f) expr_with, 'f) expression;
  2. emeta : 'm;
}
val map_expr_with : + ('m -> 'a) -> + ('f -> 'b) -> + ('m, 'f) expr_with -> + ('a, 'b) expr_with
val fold_expr_with : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + 'a -> + ('b, 'c) expr_with -> + 'a
val expr_with_of_sexp : + 'm 'f. (Sexplib0.Sexp.t -> 'm) -> + (Sexplib0.Sexp.t -> 'f) -> + Sexplib0.Sexp.t -> + ('m, 'f) expr_with
val sexp_of_expr_with : + 'm 'f. ('m -> Sexplib0.Sexp.t) -> + ('f -> Sexplib0.Sexp.t) -> + ('m, 'f) expr_with -> + Sexplib0.Sexp.t
val compare_expr_with : + 'm 'f. ('m -> 'm -> Core__.Import.int) -> + ('f -> 'f -> Core__.Import.int) -> + ('m, 'f) expr_with -> + ('m, 'f) expr_with -> + Core__.Import.int
val hash_fold_expr_with : + 'm 'f. (Ppx_hash_lib.Std.Hash.state -> 'm -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'f -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + ('m, 'f) expr_with -> + Ppx_hash_lib.Std.Hash.state
type located_meta = {
  1. loc : Middle.Location_span.t;
}

Untyped expressions, which have location_spans as meta-data

val map_located_meta : located_meta -> located_meta
val fold_located_meta : 'a -> located_meta -> 'a
val located_meta_of_sexp : Sexplib0.Sexp.t -> located_meta
val sexp_of_located_meta : located_meta -> Sexplib0.Sexp.t
val compare_located_meta : located_meta -> located_meta -> int
val hash_fold_located_meta : + Ppx_hash_lib.Std.Hash.state -> + located_meta -> + Ppx_hash_lib.Std.Hash.state
val hash_located_meta : located_meta -> Ppx_hash_lib.Std.Hash.hash_value
type untyped_expression = (located_meta, unit) expr_with
val map_untyped_expression : 'a -> 'a
val fold_untyped_expression : 'a -> 'b -> 'a
val untyped_expression_of_sexp : Sexplib0.Sexp.t -> untyped_expression
val sexp_of_untyped_expression : untyped_expression -> Sexplib0.Sexp.t
val compare_untyped_expression : + untyped_expression -> + untyped_expression -> + int
val hash_fold_untyped_expression : + Ppx_hash_lib.Std.Hash.state -> + untyped_expression -> + Ppx_hash_lib.Std.Hash.state
val hash_untyped_expression : + untyped_expression -> + Ppx_hash_lib.Std.Hash.hash_value
type typed_expr_meta = {
  1. loc : Middle.Location_span.t;
  2. ad_level : Middle.UnsizedType.autodifftype;
  3. type_ : Middle.UnsizedType.t;
}

Typed expressions also have meta-data after type checking: a location_span, as well as a type and an origin block (lub of the origin blocks of the identifiers in it)

val map_typed_expr_meta : typed_expr_meta -> typed_expr_meta
val fold_typed_expr_meta : 'a -> typed_expr_meta -> 'a
val typed_expr_meta_of_sexp : Sexplib0.Sexp.t -> typed_expr_meta
val sexp_of_typed_expr_meta : typed_expr_meta -> Sexplib0.Sexp.t
val compare_typed_expr_meta : typed_expr_meta -> typed_expr_meta -> int
val hash_fold_typed_expr_meta : + Ppx_hash_lib.Std.Hash.state -> + typed_expr_meta -> + Ppx_hash_lib.Std.Hash.state
val hash_typed_expr_meta : typed_expr_meta -> Ppx_hash_lib.Std.Hash.hash_value
type typed_expression = (typed_expr_meta, fun_kind) expr_with
val map_typed_expression : 'a -> 'a
val fold_typed_expression : 'a -> 'b -> 'a
val typed_expression_of_sexp : Sexplib0.Sexp.t -> typed_expression
val sexp_of_typed_expression : typed_expression -> Sexplib0.Sexp.t
val compare_typed_expression : typed_expression -> typed_expression -> int
val hash_fold_typed_expression : + Ppx_hash_lib.Std.Hash.state -> + typed_expression -> + Ppx_hash_lib.Std.Hash.state
val hash_typed_expression : + typed_expression -> + Ppx_hash_lib.Std.Hash.hash_value
val mk_untyped_expression : + expr:((located_meta, 'a) expr_with, 'a) expression -> + loc:Middle.Location_span.t -> + (located_meta, 'a) expr_with
val mk_typed_expression : + expr:((typed_expr_meta, 'a) expr_with, 'a) expression -> + loc:Middle.Location_span.t -> + type_:Middle.UnsizedType.t -> + ad_level:Middle.UnsizedType.autodifftype -> + (typed_expr_meta, 'a) expr_with
val expr_loc_lub : + (typed_expr_meta, 'a) expr_with list -> + Middle.Location_span.t
val expr_ad_lub : + (typed_expr_meta, 'a) expr_with list -> + Middle.UnsizedType.autodifftype option

Least upper bound of expression autodiff types

type assignmentoperator =
  1. | Assign
  2. | OperatorAssign of Middle.Operator.t

Assignment operators

val assignmentoperator_of_sexp : Sexplib0.Sexp.t -> assignmentoperator
val sexp_of_assignmentoperator : assignmentoperator -> Sexplib0.Sexp.t
val hash_fold_assignmentoperator : + Ppx_hash_lib.Std.Hash.state -> + assignmentoperator -> + Ppx_hash_lib.Std.Hash.state
val hash_assignmentoperator : + assignmentoperator -> + Ppx_hash_lib.Std.Hash.hash_value
val compare_assignmentoperator : + assignmentoperator -> + assignmentoperator -> + int
type 'e truncation =
  1. | NoTruncate
  2. | TruncateUpFrom of 'e
  3. | TruncateDownFrom of 'e
  4. | TruncateBetween of 'e * 'e

Truncations

val map_truncation : ('a -> 'b) -> 'a truncation -> 'b truncation
val fold_truncation : ('a -> 'b -> 'a) -> 'a -> 'b truncation -> 'a
val truncation_of_sexp : + 'e. (Sexplib0.Sexp.t -> 'e) -> + Sexplib0.Sexp.t -> + 'e truncation
val sexp_of_truncation : + 'e. ('e -> Sexplib0.Sexp.t) -> + 'e truncation -> + Sexplib0.Sexp.t
val hash_fold_truncation : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e truncation -> + Ppx_hash_lib.Std.Hash.state
val compare_truncation : + 'e. ('e -> 'e -> int) -> + 'e truncation -> + 'e truncation -> + int
type 'e printable =
  1. | PString of string
  2. | PExpr of 'e

Things that can be printed

val map_printable : ('a -> 'b) -> 'a printable -> 'b printable
val fold_printable : ('a -> 'b -> 'a) -> 'a -> 'b printable -> 'a
val printable_of_sexp : + 'e. (Sexplib0.Sexp.t -> 'e) -> + Sexplib0.Sexp.t -> + 'e printable
val sexp_of_printable : + 'e. ('e -> Sexplib0.Sexp.t) -> + 'e printable -> + Sexplib0.Sexp.t
val compare_printable : + 'e. ('e -> 'e -> Core__.Import.int) -> + 'e printable -> + 'e printable -> + Core__.Import.int
val hash_fold_printable : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e printable -> + Ppx_hash_lib.Std.Hash.state
type ('l, 'e) lvalue =
  1. | LVariable of identifier
  2. | LIndexed of 'l * 'e index list
  3. | LTupleProjection of 'l * int
val map_lvalue : ('a -> 'b) -> ('c -> 'd) -> ('a, 'c) lvalue -> ('b, 'd) lvalue
val fold_lvalue : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + 'a -> + ('b, 'c) lvalue -> + 'a
val lvalue_of_sexp : + 'l 'e. (Sexplib0.Sexp.t -> 'l) -> + (Sexplib0.Sexp.t -> 'e) -> + Sexplib0.Sexp.t -> + ('l, 'e) lvalue
val sexp_of_lvalue : + 'l 'e. ('l -> Sexplib0.Sexp.t) -> + ('e -> Sexplib0.Sexp.t) -> + ('l, 'e) lvalue -> + Sexplib0.Sexp.t
val hash_fold_lvalue : + 'l 'e. (Ppx_hash_lib.Std.Hash.state -> 'l -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + ('l, 'e) lvalue -> + Ppx_hash_lib.Std.Hash.state
val compare_lvalue : + 'l 'e. ('l -> 'l -> Core__.Import.int) -> + ('e -> 'e -> Core__.Import.int) -> + ('l, 'e) lvalue -> + ('l, 'e) lvalue -> + Core__.Import.int
type 'l lvalue_pack =
  1. | LValue of 'l
  2. | LTuplePack of {
    1. lvals : 'l lvalue_pack list;
    2. loc : Middle.Location_span.t;
    }
val map_lvalue_pack : ('a -> 'b) -> 'a lvalue_pack -> 'b lvalue_pack
val fold_lvalue_pack : ('a -> 'b -> 'a) -> 'a -> 'b lvalue_pack -> 'a
val lvalue_pack_of_sexp : + 'l. (Sexplib0.Sexp.t -> 'l) -> + Sexplib0.Sexp.t -> + 'l lvalue_pack
val sexp_of_lvalue_pack : + 'l. ('l -> Sexplib0.Sexp.t) -> + 'l lvalue_pack -> + Sexplib0.Sexp.t
val hash_fold_lvalue_pack : + 'l. (Ppx_hash_lib.Std.Hash.state -> 'l -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'l lvalue_pack -> + Ppx_hash_lib.Std.Hash.state
val compare_lvalue_pack : + 'l. ('l -> 'l -> Core__.Import.int) -> + 'l lvalue_pack -> + 'l lvalue_pack -> + Core__.Import.int
type ('e, 'm) lval_with = {
  1. lval : (('e, 'm) lval_with, 'e) lvalue;
  2. lmeta : 'm;
}
val map_lval_with : + ('e -> 'a) -> + ('m -> 'b) -> + ('e, 'm) lval_with -> + ('a, 'b) lval_with
val fold_lval_with : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + 'a -> + ('b, 'c) lval_with -> + 'a
val lval_with_of_sexp : + 'e 'm. (Sexplib0.Sexp.t -> 'e) -> + (Sexplib0.Sexp.t -> 'm) -> + Sexplib0.Sexp.t -> + ('e, 'm) lval_with
val sexp_of_lval_with : + 'e 'm. ('e -> Sexplib0.Sexp.t) -> + ('m -> Sexplib0.Sexp.t) -> + ('e, 'm) lval_with -> + Sexplib0.Sexp.t
val hash_fold_lval_with : + 'e 'm. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'm -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + ('e, 'm) lval_with -> + Ppx_hash_lib.Std.Hash.state
val compare_lval_with : + 'e 'm. ('e -> 'e -> Core__.Import.int) -> + ('m -> 'm -> Core__.Import.int) -> + ('e, 'm) lval_with -> + ('e, 'm) lval_with -> + Core__.Import.int
val map_untyped_lval : 'a -> 'a
val fold_untyped_lval : 'a -> 'b -> 'a
val untyped_lval_of_sexp : Sexplib0.Sexp.t -> untyped_lval
val sexp_of_untyped_lval : untyped_lval -> Sexplib0.Sexp.t
val hash_fold_untyped_lval : + Ppx_hash_lib.Std.Hash.state -> + untyped_lval -> + Ppx_hash_lib.Std.Hash.state
val hash_untyped_lval : untyped_lval -> Ppx_hash_lib.Std.Hash.hash_value
val compare_untyped_lval : untyped_lval -> untyped_lval -> int
type untyped_lval_pack = untyped_lval lvalue_pack
val untyped_lval_pack_of_sexp : Sexplib0.Sexp.t -> untyped_lval_pack
val sexp_of_untyped_lval_pack : untyped_lval_pack -> Sexplib0.Sexp.t
val compare_untyped_lval_pack : untyped_lval_pack -> untyped_lval_pack -> int
val map_typed_lval : 'a -> 'a
val fold_typed_lval : 'a -> 'b -> 'a
val typed_lval_of_sexp : Sexplib0.Sexp.t -> typed_lval
val sexp_of_typed_lval : typed_lval -> Sexplib0.Sexp.t
val hash_fold_typed_lval : + Ppx_hash_lib.Std.Hash.state -> + typed_lval -> + Ppx_hash_lib.Std.Hash.state
val hash_typed_lval : typed_lval -> Ppx_hash_lib.Std.Hash.hash_value
val compare_typed_lval : typed_lval -> typed_lval -> int
type typed_lval_pack = typed_lval lvalue_pack
val typed_lval_pack_of_sexp : Sexplib0.Sexp.t -> typed_lval_pack
val sexp_of_typed_lval_pack : typed_lval_pack -> Sexplib0.Sexp.t
val compare_typed_lval_pack : typed_lval_pack -> typed_lval_pack -> int
type 'e variable = {
  1. identifier : identifier;
  2. initial_value : 'e option;
}
val map_variable : ('e -> 'a) -> 'e variable -> 'a variable
val fold_variable : ('a -> 'b -> 'a) -> 'a -> 'b variable -> 'a
val variable_of_sexp : + 'e. (Sexplib0.Sexp.t -> 'e) -> + Sexplib0.Sexp.t -> + 'e variable
val sexp_of_variable : + 'e. ('e -> Sexplib0.Sexp.t) -> + 'e variable -> + Sexplib0.Sexp.t
val hash_fold_variable : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e variable -> + Ppx_hash_lib.Std.Hash.state
val compare_variable : + 'e. ('e -> 'e -> Core__.Import.int) -> + 'e variable -> + 'e variable -> + Core__.Import.int
type ('e, 's, 'l, 'f) statement =
  1. | Assignment of {
    1. assign_lhs : 'l lvalue_pack;
    2. assign_op : assignmentoperator;
    3. assign_rhs : 'e;
    }
  2. | NRFunApp of 'f * identifier * 'e list
  3. | TargetPE of 'e
  4. | JacobianPE of 'e
  5. | Tilde of {
    1. arg : 'e;
    2. distribution : identifier;
    3. kind : 'f;
    4. args : 'e list;
    5. truncation : 'e truncation;
    }
  6. | Break
  7. | Continue
  8. | Return of 'e
  9. | ReturnVoid
  10. | Print of 'e printable list
  11. | Reject of 'e printable list
  12. | FatalError of 'e printable list
  13. | Skip
  14. | IfThenElse of 'e * 's * 's option
  15. | While of 'e * 's
  16. | For of {
    1. loop_variable : identifier;
    2. lower_bound : 'e;
    3. upper_bound : 'e;
    4. loop_body : 's;
    }
  17. | ForEach of identifier * 'e * 's
  18. | Profile of string * 's list
  19. | Block of 's list
  20. | VarDecl of {
    1. decl_type : 'e Middle.SizedType.t;
    2. transformation : 'e Middle.Transformation.t;
    3. is_global : bool;
    4. variables : 'e variable list;
    }
  21. | FunDef of {
    1. returntype : Middle.UnsizedType.returntype;
    2. funname : identifier;
    3. arguments : (Middle.UnsizedType.autodifftype + * Middle.UnsizedType.t + * identifier) + list;
    4. body : 's;
    }

Statement shapes, where we substitute untyped_expression and untyped_statement for 'e and 's respectively to get untyped_statement and typed_expression and typed_statement to get typed_statement

val map_statement : + ('a -> 'b) -> + ('c -> 'd) -> + ('e -> 'f) -> + ('g -> 'h) -> + ('a, 'c, 'e, 'g) statement -> + ('b, 'd, 'f, 'h) statement
val fold_statement : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + ('a -> 'd -> 'a) -> + ('a -> 'e -> 'a) -> + 'a -> + ('b, 'c, 'd, 'e) statement -> + 'a
val statement_of_sexp : + 'e 's 'l 'f. (Sexplib0.Sexp.t -> 'e) -> + (Sexplib0.Sexp.t -> 's) -> + (Sexplib0.Sexp.t -> 'l) -> + (Sexplib0.Sexp.t -> 'f) -> + Sexplib0.Sexp.t -> + ('e, 's, 'l, 'f) statement
val sexp_of_statement : + 'e 's 'l 'f. ('e -> Sexplib0.Sexp.t) -> + ('s -> Sexplib0.Sexp.t) -> + ('l -> Sexplib0.Sexp.t) -> + ('f -> Sexplib0.Sexp.t) -> + ('e, 's, 'l, 'f) statement -> + Sexplib0.Sexp.t
val hash_fold_statement : + 'e 's 'l 'f. (Ppx_hash_lib.Std.Hash.state -> + 'e -> + Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 's -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'l -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'f -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + ('e, 's, 'l, 'f) statement -> + Ppx_hash_lib.Std.Hash.state
val compare_statement : + 'e 's 'l 'f. ('e -> 'e -> Core__.Import.int) -> + ('s -> 's -> Core__.Import.int) -> + ('l -> 'l -> Core__.Import.int) -> + ('f -> 'f -> Core__.Import.int) -> + ('e, 's, 'l, 'f) statement -> + ('e, 's, 'l, 'f) statement -> + Core__.Import.int
type statement_returntype =
  1. | Incomplete
  2. | NonlocalControlFlow
  3. | Complete

Statement return types which we will decorate statements with during type checking:

  • Complete corresponds to statements that exit the function (return or error) in every branch
  • Incomplete corresponds to statements which pass control flow to following statements in at least some branches
  • NonlocalControlFlow is simila to Incomplete but specifically used when breaks are present in loops. Normally, an infinite loop with Incomplete return type is fine (and considered Complete), since it either returns or diverges. However, in the presence of break statements, control flow may jump to the end of the loop.
val statement_returntype_of_sexp : Sexplib0.Sexp.t -> statement_returntype
val sexp_of_statement_returntype : statement_returntype -> Sexplib0.Sexp.t
val hash_fold_statement_returntype : + Ppx_hash_lib.Std.Hash.state -> + statement_returntype -> + Ppx_hash_lib.Std.Hash.state
val hash_statement_returntype : + statement_returntype -> + Ppx_hash_lib.Std.Hash.hash_value
val compare_statement_returntype : + statement_returntype -> + statement_returntype -> + int
type ('e, 'm, 'l, 'f) statement_with = {
  1. stmt : ('e, ('e, 'm, 'l, 'f) statement_with, 'l, 'f) statement;
  2. smeta : 'm;
}
val map_statement_with : + ('e -> 'a) -> + ('m -> 'b) -> + ('l -> 'c) -> + ('f -> 'd) -> + ('e, 'm, 'l, 'f) statement_with -> + ('a, 'b, 'c, 'd) statement_with
val fold_statement_with : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + ('a -> 'd -> 'a) -> + ('a -> 'e -> 'a) -> + 'a -> + ('b, 'c, 'd, 'e) statement_with -> + 'a
val statement_with_of_sexp : + 'e 'm 'l 'f. (Sexplib0.Sexp.t -> 'e) -> + (Sexplib0.Sexp.t -> 'm) -> + (Sexplib0.Sexp.t -> 'l) -> + (Sexplib0.Sexp.t -> 'f) -> + Sexplib0.Sexp.t -> + ('e, 'm, 'l, 'f) statement_with
val sexp_of_statement_with : + 'e 'm 'l 'f. ('e -> Sexplib0.Sexp.t) -> + ('m -> Sexplib0.Sexp.t) -> + ('l -> Sexplib0.Sexp.t) -> + ('f -> Sexplib0.Sexp.t) -> + ('e, 'm, 'l, 'f) statement_with -> + Sexplib0.Sexp.t
val compare_statement_with : + 'e 'm 'l 'f. ('e -> 'e -> Core__.Import.int) -> + ('m -> 'm -> Core__.Import.int) -> + ('l -> 'l -> Core__.Import.int) -> + ('f -> 'f -> Core__.Import.int) -> + ('e, 'm, 'l, 'f) statement_with -> + ('e, 'm, 'l, 'f) statement_with -> + Core__.Import.int
val hash_fold_statement_with : + 'e 'm 'l 'f. (Ppx_hash_lib.Std.Hash.state -> + 'e -> + Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'm -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'l -> Ppx_hash_lib.Std.Hash.state) -> + (Ppx_hash_lib.Std.Hash.state -> 'f -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + ('e, 'm, 'l, 'f) statement_with -> + Ppx_hash_lib.Std.Hash.state
type untyped_statement = + (untyped_expression, located_meta, untyped_lval, unit) statement_with

Untyped statements, which have location_spans as meta-data

val map_untyped_statement : 'a -> 'a
val untyped_statement_of_sexp : Sexplib0.Sexp.t -> untyped_statement
val sexp_of_untyped_statement : untyped_statement -> Sexplib0.Sexp.t
val compare_untyped_statement : untyped_statement -> untyped_statement -> int
val hash_fold_untyped_statement : + Ppx_hash_lib.Std.Hash.state -> + untyped_statement -> + Ppx_hash_lib.Std.Hash.state
val hash_untyped_statement : + untyped_statement -> + Ppx_hash_lib.Std.Hash.hash_value
type stmt_typed_located_meta = {
  1. loc : Middle.Location_span.t;
  2. return_type : statement_returntype;
}
val map_stmt_typed_located_meta : + stmt_typed_located_meta -> + stmt_typed_located_meta
val stmt_typed_located_meta_of_sexp : + Sexplib0.Sexp.t -> + stmt_typed_located_meta
val sexp_of_stmt_typed_located_meta : + stmt_typed_located_meta -> + Sexplib0.Sexp.t
val compare_stmt_typed_located_meta : + stmt_typed_located_meta -> + stmt_typed_located_meta -> + int
val hash_fold_stmt_typed_located_meta : + Ppx_hash_lib.Std.Hash.state -> + stmt_typed_located_meta -> + Ppx_hash_lib.Std.Hash.state
val hash_stmt_typed_located_meta : + stmt_typed_located_meta -> + Ppx_hash_lib.Std.Hash.hash_value

Typed statements also have meta-data after type checking: a location_span, as well as a statement returntype to check that function bodies have the right return type

val map_typed_statement : 'a -> 'a
val typed_statement_of_sexp : Sexplib0.Sexp.t -> typed_statement
val sexp_of_typed_statement : typed_statement -> Sexplib0.Sexp.t
val compare_typed_statement : typed_statement -> typed_statement -> int
val hash_fold_typed_statement : + Ppx_hash_lib.Std.Hash.state -> + typed_statement -> + Ppx_hash_lib.Std.Hash.state
val hash_typed_statement : typed_statement -> Ppx_hash_lib.Std.Hash.hash_value
val mk_typed_statement : + stmt: + ('a, ('a, stmt_typed_located_meta, 'b, 'c) statement_with, 'b, 'c) + statement -> + loc:Middle.Location_span.t -> + return_type:statement_returntype -> + ('a, stmt_typed_located_meta, 'b, 'c) statement_with
type 's block = {
  1. stmts : 's list;
  2. xloc : Middle.Location_span.t;
}

Program shapes, where we obtain types of programs if we substitute typed or untyped statements for 's

and comment_type =
  1. | LineComment of string * Middle.Location_span.t
  2. | Include of string * Middle.Location_span.t
  3. | BlockComment of string list * Middle.Location_span.t
  4. | Separator of Middle.Location.t
    (*

    Separator records the location of items like commas, operators, and keywords which don't have location information stored in the AST but are useful for placing comments in pretty printing

    *)
and 's program = {
  1. functionblock : 's block option;
  2. datablock : 's block option;
  3. transformeddatablock : 's block option;
  4. parametersblock : 's block option;
  5. transformedparametersblock : 's block option;
  6. modelblock : 's block option;
  7. generatedquantitiesblock : 's block option;
  8. comments : comment_type list;
}
val map_block : ('s -> 'a) -> 's block -> 'a block
val map_comment_type : comment_type -> comment_type
val map_program : ('s -> 'a) -> 's program -> 'a program
val fold_block : ('a -> 'b -> 'a) -> 'a -> 'b block -> 'a
val fold_comment_type : 'a -> comment_type -> 'a
val fold_program : ('a -> 'b -> 'a) -> 'a -> 'b program -> 'a
val block_of_sexp : 's. (Sexplib0.Sexp.t -> 's) -> Sexplib0.Sexp.t -> 's block
val comment_type_of_sexp : Sexplib0.Sexp.t -> comment_type
val program_of_sexp : + 's. (Sexplib0.Sexp.t -> 's) -> + Sexplib0.Sexp.t -> + 's program
val sexp_of_block : 's. ('s -> Sexplib0.Sexp.t) -> 's block -> Sexplib0.Sexp.t
val sexp_of_comment_type : comment_type -> Sexplib0.Sexp.t
val sexp_of_program : + 's. ('s -> Sexplib0.Sexp.t) -> + 's program -> + Sexplib0.Sexp.t
val hash_fold_block : + 's. (Ppx_hash_lib.Std.Hash.state -> 's -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 's block -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_comment_type : + Ppx_hash_lib.Std.Hash.state -> + comment_type -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_program : + 's. (Ppx_hash_lib.Std.Hash.state -> 's -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 's program -> + Ppx_hash_lib.Std.Hash.state
val hash_comment_type : comment_type -> Ppx_hash_lib.Std.Hash.hash_value
val compare_block : + 's. ('s -> 's -> Core__.Import.int) -> + 's block -> + 's block -> + Core__.Import.int
val compare_comment_type : comment_type -> comment_type -> int
val compare_program : + 's. ('s -> 's -> Core__.Import.int) -> + 's program -> + 's program -> + Core__.Import.int
val get_stmts : 'a block option -> 'a list
type untyped_program = untyped_statement program

Untyped programs (before type checking)

val map_untyped_program : 'a -> 'a
val untyped_program_of_sexp : Sexplib0.Sexp.t -> untyped_program
val sexp_of_untyped_program : untyped_program -> Sexplib0.Sexp.t
val compare_untyped_program : untyped_program -> untyped_program -> int
type typed_program = typed_statement program

Typed programs (after type checking)

val map_typed_program : 'a -> 'a
val typed_program_of_sexp : Sexplib0.Sexp.t -> typed_program
val sexp_of_typed_program : typed_program -> Sexplib0.Sexp.t
val compare_typed_program : typed_program -> typed_program -> int
val untyped_expression_of_typed_expression : + typed_expression -> + untyped_expression

Forgetful function from typed to untyped expressions

val untyped_lvalue_of_typed_lvalue : typed_lval -> untyped_lval
val untyped_lvalue_of_typed_lvalue_pack : + typed_lval lvalue_pack -> + untyped_lval lvalue_pack

Forgetful function from typed to untyped statements

val untyped_program_of_typed_program : typed_program -> untyped_program

Forgetful function from typed to untyped programs

val expr_of_lvalue : (('a, 'b) expr_with, 'a) lval_with -> ('a, 'b) expr_with
val extract_ids : ('a, 'b) expr_with -> identifier Base__List.t
val lvalue_of_expr_opt : + untyped_expression -> + ((located_meta, unit) expr_with, located_meta) lval_with lvalue_pack option
val get_loc_lvalue_pack : typed_lval lvalue_pack -> Middle.Location_span.t
val get_first_loc : untyped_statement -> Middle.Location.t
diff --git a/stanc/Frontend/Ast_to_Mir/index.html b/stanc/Frontend/Ast_to_Mir/index.html new file mode 100644 index 000000000..e0c7bff20 --- /dev/null +++ b/stanc/Frontend/Ast_to_Mir/index.html @@ -0,0 +1,7 @@ + +Ast_to_Mir (stanc.Frontend.Ast_to_Mir)

Module Frontend.Ast_to_Mir

Translate from the AST to the MIR

val trans_prog : string -> Ast.typed_program -> Middle.Program.Typed.t
diff --git a/stanc/Frontend/Canonicalize/index.html b/stanc/Frontend/Canonicalize/index.html new file mode 100644 index 000000000..95e83c9fb --- /dev/null +++ b/stanc/Frontend/Canonicalize/index.html @@ -0,0 +1,5 @@ + +Canonicalize (stanc.Frontend.Canonicalize)

Module Frontend.Canonicalize

Re-write ASTs to remove deprecated features and clean up extra parenthesis, etc

type canonicalizer_settings = {
  1. deprecations : bool;
  2. parentheses : bool;
  3. braces : bool;
  4. inline_includes : bool;
  5. strip_comments : bool;
}

Flags to enable or disable certain kinds of canonicalization. NB: inline_includes is controlled by the --canonicalize argument to stanc, but it consumed by the pretty-printer, not this module.

Equivalent to what --print-canonical did before these settings were available

val canonicalize_program : + Ast.typed_program -> + canonicalizer_settings -> + Ast.typed_program

"Canonicalize" the program by removing deprecations, adding or removing parenthesis and braces, etc.

diff --git a/stanc/Frontend/Debugging/index.html b/stanc/Frontend/Debugging/index.html new file mode 100644 index 000000000..2b4fb0bd8 --- /dev/null +++ b/stanc/Frontend/Debugging/index.html @@ -0,0 +1,2 @@ + +Debugging (stanc.Frontend.Debugging)

Module Frontend.Debugging

Some helpers for debugging

val lexer_logging : bool Core.ref

Controls whether the lexing operations get logged

val lexer_logger : string -> unit
val lexer_pos_logger : Stdlib.Lexing.position -> unit
val grammar_logging : bool Core.ref

Controls whether the parsing operations get logged

val grammar_logger : string -> unit
val ast_printing : bool Core.ref

Controls whether an AST gets printed during parsing

val ast_to_string : Ast.untyped_program -> string
val ast_logger : Ast.untyped_program -> unit
val typed_ast_printing : bool Core.ref

Controls whether a decorated AST gets printed after the semantic check

val typed_ast_to_string : Ast.typed_program -> string
val typed_ast_logger : Ast.typed_program -> unit
diff --git a/stanc/Frontend/Deprecation_analysis/index.html b/stanc/Frontend/Deprecation_analysis/index.html new file mode 100644 index 000000000..cd82e1945 --- /dev/null +++ b/stanc/Frontend/Deprecation_analysis/index.html @@ -0,0 +1,5 @@ + +Deprecation_analysis (stanc.Frontend.Deprecation_analysis)

Module Frontend.Deprecation_analysis

Utilities for emitting deprecation warnings and finding proper replacements for deprecated features

val expired : (int * int) -> bool
val deprecated_functions : (string * (int * int)) Core.String.Map.t
val rename_deprecated : + (string * (int * int)) Core.String.Map.t -> + string -> + string
val stan_lib_deprecations : (string * (int * int)) Core.String.Map.t
val collect_warnings : Ast.typed_program -> Warnings.t list
val remove_unneeded_forward_decls : Ast.typed_program -> Ast.typed_program
val set_jacobian_compatibility_mode : Ast.untyped_statement list -> unit

Pre-Stan 2.39, we need to know if _jacobian functions are FnPlain or not. We use the presence of any jacobian+= statements as our condition. If none are present, we assume this is old code.

diff --git a/stanc/Frontend/Environment/index.html b/stanc/Frontend/Environment/index.html new file mode 100644 index 000000000..d647ba43c --- /dev/null +++ b/stanc/Frontend/Environment/index.html @@ -0,0 +1,13 @@ + +Environment (stanc.Frontend.Environment)

Module Frontend.Environment

Type environments used during typechecking. Maps from strings to function or variable information

type originblock =
  1. | MathLibrary
  2. | Functions
  3. | Data
  4. | TData
  5. | Param
  6. | TParam
  7. | Model
  8. | GQuant

Origin blocks, to keep track of where variables are declared

type varinfo = {
  1. origin : originblock;
  2. global : bool;
  3. readonly : bool;
}

Information available for each variable

type info = {
  1. type_ : Middle.UnsizedType.t;
  2. kind : [ `Variable of varinfo + | `UserDeclared of Middle.Location_span.t + | `StanMath + | `UserDefined ];
}
type t
val stan_math_environment : t

A type environment which contains the Stan math library functions

val find : t -> string -> info list
val add : + t -> + string -> + Middle.UnsizedType.t -> + [ `UserDeclared of Middle.Location_span.t + | `StanMath + | `UserDefined + | `Variable of varinfo ] -> + t

Add a new item to the type environment. Does not overwrite existing, but shadows

val set_raw : t -> string -> info list -> t

Overwrite the existing items bound to a name

val mem : t -> string -> bool
val iteri : t -> (string -> info list -> unit) -> unit
val nearest_ident : t -> string -> string option

The nearest identifier by edit distance, capped at edit distance 3 (if one exists)

diff --git a/stanc/Frontend/Errors/index.html b/stanc/Frontend/Errors/index.html new file mode 100644 index 000000000..91525738d --- /dev/null +++ b/stanc/Frontend/Errors/index.html @@ -0,0 +1,7 @@ + +Errors (stanc.Frontend.Errors)

Module Frontend.Errors

Some plumbing for our compiler errors

type syntax_error =
  1. | Lexing of Middle.Location.t
  2. | UnexpectedEOF of Middle.Location.t
  3. | Include of string * Middle.Location.t
  4. | Parsing of string * Middle.Location_span.t

Our type of syntax error information

exception SyntaxError of syntax_error

Exception for Syntax Errors

exception SemanticError of Semantic_error.t

Exception SemanticError (loc, msg) indicates a semantic error with message msg, occurring at location loc.

type t =
  1. | FileNotFound of string
  2. | Syntax_error of syntax_error
  3. | Semantic_error of Semantic_error.t
  4. | DebugDataError of Middle.Location_span.t * string
val pp : ?printed_filename:string -> ?code:string -> t Fmt.t

Pretty-printer for error type t. Replace occurances of filename from locations with printed_filename, if supplied. If code is supplied, read context from that string. Otherwise, it will attempt to open the original file.

val to_string : t -> string

Format an error t as a string. Should only be used in testing! For user facing code, prefer pp

val pp_semantic_error : + ?printed_filename:string -> + ?code:string -> + Stdlib.Format.formatter -> + Semantic_error.t -> + unit

A semantic error message used when handling a SemanticError

diff --git a/stanc/Frontend/Include_files/index.html b/stanc/Frontend/Include_files/index.html new file mode 100644 index 000000000..acf3c6192 --- /dev/null +++ b/stanc/Frontend/Include_files/index.html @@ -0,0 +1,2 @@ + +Include_files (stanc.Frontend.Include_files)

Module Frontend.Include_files

type t =
  1. | FileSystemPaths of string list
  2. | InMemory of string Core.String.Map.t
val include_provider : t Core.ref

Where and how to look for #include-d files

diff --git a/stanc/Frontend/Info/index.html b/stanc/Frontend/Info/index.html new file mode 100644 index 000000000..8ea5fb03e --- /dev/null +++ b/stanc/Frontend/Info/index.html @@ -0,0 +1,4 @@ + +Info (stanc.Frontend.Info)

Module Frontend.Info

Implementation of the --info option which outputs on the standard output a JSON object containing information about the model.

The JSON object has a field inputs, parameters, transformed + parameters, and generated quantities containing a dictionary where each entry corresponds to a variable in respectively the data, parameters, transformed parameters, and generated + quantities blocks. To each variable is associated an object with two fields:

  • type: the base type of the variable ("int" or "real").
  • dimensions: the number of dimensions (0 for a scalar, 1 for a vector or row vector, etc.).

The JSON object also have the fields stanlib_calls and distributions containing the name of the standard library functions called and distributions used.

val info : Ast.typed_program -> string
diff --git a/stanc/Frontend/Input_warnings/index.html b/stanc/Frontend/Input_warnings/index.html new file mode 100644 index 000000000..ee2d0bbb9 --- /dev/null +++ b/stanc/Frontend/Input_warnings/index.html @@ -0,0 +1,2 @@ + +Input_warnings (stanc.Frontend.Input_warnings)

Module Frontend.Input_warnings

A module to contain the mutable state used to track warnings from the parser and lexer.

val init : unit -> unit

As something of a hack, Input_warnings keeps track of which warnings the lexer has emitted as a form of hidden state, which must be initialized and collected.

val collect : unit -> Warnings.t list

Returns all of the warnings issued since init was called.

val add_warning : Middle.Location_span.t -> string -> unit

Add a generic warning string to the current list

val empty : string -> unit

Register that an empty file is being parsed

diff --git a/stanc/Frontend/Lexer/index.html b/stanc/Frontend/Lexer/index.html new file mode 100644 index 000000000..e9556c478 --- /dev/null +++ b/stanc/Frontend/Lexer/index.html @@ -0,0 +1,23 @@ + +Lexer (stanc.Frontend.Lexer)

Module Frontend.Lexer

module Stack = Core.Stack
module Queue = Core.Queue
val incr_linenum : Stdlib.Lexing.lexbuf -> unit
val add_line_comment : + (Stdlib.Lexing.position * Stdlib.Buffer.t) -> + Stdlib.Lexing.position -> + unit
val add_multi_comment : + Stdlib.Lexing.position -> + string list -> + Stdlib.Lexing.position -> + unit
val add_separator : Stdlib.Lexing.lexbuf -> unit
val add_include : string -> Stdlib.Lexing.lexbuf -> unit
val __ocaml_lex_tables : Stdlib.Lexing.lex_tables
val token : Stdlib.Lexing.lexbuf -> Parser.token
val __ocaml_lex_token_rec : Stdlib.Lexing.lexbuf -> int -> Parser.token
val multiline_comment : + ((Stdlib.Lexing.position * string list) * Stdlib.Buffer.t) -> + Stdlib.Lexing.lexbuf -> + unit
val __ocaml_lex_multiline_comment_rec : + ((Stdlib.Lexing.position * string list) * Stdlib.Buffer.t) -> + Stdlib.Lexing.lexbuf -> + int -> + unit
val singleline_comment : + (Stdlib.Lexing.position * Stdlib.Buffer.t) -> + Stdlib.Lexing.lexbuf -> + unit
val __ocaml_lex_singleline_comment_rec : + (Stdlib.Lexing.position * Stdlib.Buffer.t) -> + Stdlib.Lexing.lexbuf -> + int -> + unit
diff --git a/stanc/Frontend/Parse/index.html b/stanc/Frontend/Parse/index.html new file mode 100644 index 000000000..78b2ed84d --- /dev/null +++ b/stanc/Frontend/Parse/index.html @@ -0,0 +1,10 @@ + +Parse (stanc.Frontend.Parse)

Module Frontend.Parse

Some complicated stuff to get the custom syntax errors out of Menhir's Incremental API

val parse_file : + (Stdlib.Lexing.position -> + Ast.untyped_program Parser.MenhirInterpreter.checkpoint) -> + string -> + (Ast.untyped_program, Errors.t) Core.result * Warnings.t list

A helper function to take a parser, a filename and produce an AST. Under the hood, it takes care of Menhir's custom syntax error messages.

val parse_string : + (Stdlib.Lexing.position -> + Ast.untyped_program Parser.MenhirInterpreter.checkpoint) -> + string -> + (Ast.untyped_program, Errors.t) Core.result * Warnings.t list
diff --git a/stanc/Frontend/Parser/Incremental/index.html b/stanc/Frontend/Parser/Incremental/index.html new file mode 100644 index 000000000..02c12e53a --- /dev/null +++ b/stanc/Frontend/Parser/Incremental/index.html @@ -0,0 +1,9 @@ + +Incremental (stanc.Frontend.Parser.Incremental)

Module Parser.Incremental

val functions_only : + Stdlib.Lexing.position -> + Ast.untyped_statement Ast.program MenhirInterpreter.checkpoint
diff --git a/stanc/Frontend/Parser/MenhirInterpreter/index.html b/stanc/Frontend/Parser/MenhirInterpreter/index.html new file mode 100644 index 000000000..39be96747 --- /dev/null +++ b/stanc/Frontend/Parser/MenhirInterpreter/index.html @@ -0,0 +1,33 @@ + +MenhirInterpreter (stanc.Frontend.Parser.MenhirInterpreter)

Module Parser.MenhirInterpreter

include MenhirLib.IncrementalEngine.INCREMENTAL_ENGINE with type token = token
type token = token
type production
type 'a env
type !'a checkpoint = private
  1. | InputNeeded of 'a env
  2. | Shifting of 'a env * 'a env * bool
  3. | AboutToReduce of 'a env * production
  4. | HandlingError of 'a env
  5. | Accepted of 'a
  6. | Rejected
val offer : + 'a checkpoint -> + (token + * MenhirLib.IncrementalEngine.position + * MenhirLib.IncrementalEngine.position) -> + 'a checkpoint
type strategy = [
  1. | `Legacy
  2. | `Simplified
]
val resume : ?strategy:strategy -> 'a checkpoint -> 'a checkpoint
type supplier = + unit -> + token + * MenhirLib.IncrementalEngine.position + * MenhirLib.IncrementalEngine.position
val lexer_lexbuf_to_supplier : + (Stdlib.Lexing.lexbuf -> token) -> + Stdlib.Lexing.lexbuf -> + supplier
val loop : ?strategy:strategy -> supplier -> 'a checkpoint -> 'a
val loop_handle : + ('a -> 'answer) -> + ('a checkpoint -> 'answer) -> + supplier -> + 'a checkpoint -> + 'answer
val loop_handle_undo : + ('a -> 'answer) -> + ('a checkpoint -> 'a checkpoint -> 'answer) -> + supplier -> + 'a checkpoint -> + 'answer
val shifts : 'a checkpoint -> 'a env option
val acceptable : + 'a checkpoint -> + token -> + MenhirLib.IncrementalEngine.position -> + bool
type 'a lr1state
val number : 'a lr1state -> int
val production_index : production -> int
val find_production : int -> production
type element =
  1. | Element : 'a lr1state + * 'a + * MenhirLib.IncrementalEngine.position + * MenhirLib.IncrementalEngine.position -> element
type stack = element MenhirLib.General.stream
val stack : 'a env -> stack
val top : 'a env -> element option
val pop_many : int -> 'a env -> 'a env option
val get : int -> 'a env -> element option
val current_state_number : 'a env -> int
val equal : 'a env -> 'a env -> bool
val positions : + 'a env -> + MenhirLib.IncrementalEngine.position * MenhirLib.IncrementalEngine.position
val env_has_default_reduction : 'a env -> bool
val state_has_default_reduction : 'a lr1state -> bool
val pop : 'a env -> 'a env option
val force_reduction : production -> 'a env -> 'a env
val input_needed : 'a env -> 'a checkpoint
diff --git a/stanc/Frontend/Parser/index.html b/stanc/Frontend/Parser/index.html new file mode 100644 index 000000000..97cfd2ae3 --- /dev/null +++ b/stanc/Frontend/Parser/index.html @@ -0,0 +1,10 @@ + +Parser (stanc.Frontend.Parser)

Module Frontend.Parser

type token =
  1. | WHILE
  2. | VOID
  3. | VECTOR
  4. | UPPER
  5. | UNREACHABLE
  6. | UNITVECTOR
  7. | TUPLE
  8. | TRUNCATE
  9. | TRANSPOSE
  10. | TRANSFORMEDPARAMETERSBLOCK
  11. | TRANSFORMEDDATABLOCK
  12. | TIMESASSIGN
  13. | TIMES
  14. | TILDE
  15. | TARGET
  16. | SUMTOZERO
  17. | STRINGLITERAL of string
  18. | STOCHASTICROWMATRIX
  19. | STOCHASTICCOLUMNMATRIX
  20. | SIMPLEX
  21. | SEMICOLON
  22. | RPAREN
  23. | ROWVECTOR
  24. | RETURN
  25. | REJECT
  26. | REALNUMERAL of string
  27. | REAL
  28. | RBRACK
  29. | RBRACE
  30. | RABRACK
  31. | QMARK
  32. | PROFILE
  33. | PRINT
  34. | POSITIVEORDERED
  35. | PLUSASSIGN
  36. | PLUS
  37. | PARAMETERSBLOCK
  38. | ORDERED
  39. | OR
  40. | OFFSET
  41. | NEQUALS
  42. | MULTIPLIER
  43. | MODULO
  44. | MODELBLOCK
  45. | MINUSASSIGN
  46. | MINUS
  47. | MATRIX
  48. | LPAREN
  49. | LOWER
  50. | LEQ
  51. | LDIVIDE
  52. | LBRACK
  53. | LBRACE
  54. | LABRACK
  55. | JACOBIAN
  56. | INTNUMERAL of string
  57. | INT
  58. | IN
  59. | IMAGNUMERAL of string
  60. | IF
  61. | IDIVIDE
  62. | IDENTIFIER of string
  63. | HAT
  64. | GEQ
  65. | GENERATEDQUANTITIESBLOCK
  66. | FUNCTIONBLOCK
  67. | FOR
  68. | FATAL_ERROR
  69. | EQUALS
  70. | EOF
  71. | ELTTIMESASSIGN
  72. | ELTTIMES
  73. | ELTPOW
  74. | ELTDIVIDEASSIGN
  75. | ELTDIVIDE
  76. | ELSE
  77. | DOTNUMERAL of string
  78. | DIVIDEASSIGN
  79. | DIVIDE
  80. | DATABLOCK
  81. | COVMATRIX
  82. | CORRMATRIX
  83. | CONTINUE
  84. | COMPLEXVECTOR
  85. | COMPLEXROWVECTOR
  86. | COMPLEXMATRIX
  87. | COMPLEX
  88. | COMMA
  89. | COLON
  90. | CHOLESKYFACTORCOV
  91. | CHOLESKYFACTORCORR
  92. | BREAK
  93. | BAR
  94. | BANG
  95. | ASSIGN
  96. | ARRAY
  97. | AND
exception Error
val program : + (Stdlib.Lexing.lexbuf -> token) -> + Stdlib.Lexing.lexbuf -> + (Ast.untyped_expression, Ast.located_meta, Ast.untyped_lval, unit) + Ast.statement_with + Ast.program
val functions_only : + (Stdlib.Lexing.lexbuf -> token) -> + Stdlib.Lexing.lexbuf -> + Ast.untyped_statement Ast.program
module MenhirInterpreter : sig ... end
module Incremental : sig ... end
diff --git a/stanc/Frontend/Parsing_errors/index.html b/stanc/Frontend/Parsing_errors/index.html new file mode 100644 index 000000000..97269e4fc --- /dev/null +++ b/stanc/Frontend/Parsing_errors/index.html @@ -0,0 +1,2 @@ + +Parsing_errors (stanc.Frontend.Parsing_errors)

Module Frontend.Parsing_errors

val message : int -> string
diff --git a/stanc/Frontend/Preprocessor/index.html b/stanc/Frontend/Preprocessor/index.html new file mode 100644 index 000000000..1671fc77d --- /dev/null +++ b/stanc/Frontend/Preprocessor/index.html @@ -0,0 +1,4 @@ + +Preprocessor (stanc.Frontend.Preprocessor)

Module Frontend.Preprocessor

Preprocessor for handling include directives

val location_of_position : Stdlib.Lexing.position -> Middle.Location.t
val location_span_of_positions : + (Stdlib.Lexing.position * Stdlib.Lexing.position) -> + Middle.Location_span.t
val current_buffer : unit -> Stdlib.Lexing.lexbuf

Buffer at the top of the include stack

val size : unit -> int

Size of the include stack

val init : Stdlib.Lexing.lexbuf -> string -> unit

Push a buffer on to the stack to start

val update_start_positions : Stdlib.Lexing.position -> unit

Update the lex_start_p the lexing buffers on the stack. This solves an issue where a parser which started with one lexbuf but is finishing with another can have the wrong information

val pop_buffer : unit -> Stdlib.Lexing.lexbuf

Pop the buffer at the top of the include stack

val add_comment : Ast.comment_type -> unit
val get_comments : unit -> Ast.comment_type list
val included_files : string list Stdlib.ref

List of files that have been included

val restore_prior_lexbuf : unit -> Stdlib.Lexing.lexbuf

Restore to a previous lexing buffer (assumes that one exists) and updates positions accordingly.

val try_get_new_lexbuf : string -> Stdlib.Lexing.lexbuf

Search include paths for filename and try to create a new lexing buffer with that filename, record that included from specified position

diff --git a/stanc/Frontend/Pretty_print_prog/index.html b/stanc/Frontend/Pretty_print_prog/index.html new file mode 100644 index 000000000..ae78715bf --- /dev/null +++ b/stanc/Frontend/Pretty_print_prog/index.html @@ -0,0 +1,8 @@ + +Pretty_print_prog (stanc.Frontend.Pretty_print_prog)

Module Frontend.Pretty_print_prog

Pretty print a complete Stan program.

This module relies on Parser to be able to run a "sanity check" on the output of the pretty printer, confirming that the output is a valid Stan program and matches the input program.

However, the parser relies on some pretty printing functions to be able to produce nicer error messages, hence the split between Pretty_printing and this module.

val pretty_print_typed_program : + ?bare_functions:bool -> + ?line_length:int -> + ?inline_includes:bool -> + ?strip_comments:bool -> + Ast.typed_program -> + string
diff --git a/stanc/Frontend/Pretty_printing/index.html b/stanc/Frontend/Pretty_printing/index.html new file mode 100644 index 000000000..a1e7a20a5 --- /dev/null +++ b/stanc/Frontend/Pretty_printing/index.html @@ -0,0 +1,102 @@ + +Pretty_printing (stanc.Frontend.Pretty_printing)

Module Frontend.Pretty_printing

Some helpers to produce nice error messages and for auto-formatting Stan programs

val comments : Ast.comment_type list Core.ref

To avoid cluttering the AST, comments are not associated with any particular AST node but instead come in a separate list. The pretty printer uses the AST nodes' location metadata to insert whitespace and comments. The comment list is stored in a global state that is accessed by set_comments, get_comments, and skip_comments.

val skipped : + ([ `Block | `Include | `Line ] * string list * Middle.Location_span.t) list + Core.ref
val set_comments : + ?inline_includes:bool -> + ?strip_comments:bool -> + Ast.comment_type list -> + unit
val get_comments : + Middle.Location.t -> + ([> `Block | `Include | `Line ] * string list * Middle.Location_span.t) list
val get_comments_until_separator : + Middle.Location.t -> + ([> `Block | `Include | `Line ] * string list * Middle.Location_span.t) list
val skip_comments : Middle.Location.t -> unit
val remaining_comments : + unit -> + ([ `Block | `Include | `Line ] * string list * Middle.Location_span.t) + Base__List.t
val print_included : bool Core.ref

If false, don't print any statements which came from another file

val should_skip : Middle.Location.t -> bool

Checks if something should be skipped based on the print_included setting

val pp_space : + bool -> + Stdlib.Format.formatter -> + (Middle.Location.t * Middle.Location.t) -> + unit
val pp_comment : + Stdlib.Format.formatter -> + ([< `Block | `Include | `Line ] * string list * Middle.Location_span.t) -> + unit
val pp_spacing : + ?newline:bool -> + Middle.Location.t option -> + Middle.Location.t option -> + Stdlib.Format.formatter -> + ([< `Block | `Include | `Line Include Line ] + * string list + * Middle.Location_span.t) + list -> + unit
val pp_comments_spacing : + bool -> + ('a -> + ([< `Block | `Include | `Line Block ] + * string list + * Middle.Location_span.t) + list) -> + Stdlib.Format.formatter -> + 'a -> + unit
val comma_no_break : unit Fmt.t
val indented_box : + ?offset:int -> + 'a Fmt.t -> + Stdlib.Format.formatter -> + 'a -> + unit
val pp_unsizedtype : Middle.UnsizedType.t Fmt.t
val pp_autodifftype : + Stdlib.Format.formatter -> + Middle.UnsizedType.autodifftype -> + unit
val pp_returntype : + Stdlib.Format.formatter -> + Middle.UnsizedType.returntype -> + unit
val pp_identifier : Stdlib.Format.formatter -> Ast.identifier -> unit
val pp_operator : Stdlib.Format.formatter -> Middle.Operator.t -> unit
val pp_list_of : + (Stdlib.Format.formatter -> 'a -> unit) -> + ('a -> Middle.Location_span.t) -> + Stdlib.Format.formatter -> + ('a list * Middle.Location_span.t) -> + unit
val pp_index : Ast.untyped_expression Ast.index Fmt.t
val pp_list_of_indices : + Stdlib.Format.formatter -> + Ast.untyped_expression Ast.index list -> + unit
val pp_expression : Stdlib.Format.formatter -> Ast.untyped_expression -> unit
val pp_list_of_expression : + Stdlib.Format.formatter -> + (Ast.untyped_expression list * Middle.Location_span.t) -> + unit
val pp_lvalue : + Stdlib.Format.formatter -> + ((Ast.located_meta, unit) Ast.expr_with, Ast.located_meta) Ast.lval_with + Ast.lvalue_pack -> + unit
val pp_assignmentoperator : + Stdlib.Format.formatter -> + Ast.assignmentoperator -> + unit
val pp_truncation : + Stdlib.Format.formatter -> + Ast.untyped_expression Ast.truncation -> + unit
val pp_printable : + Stdlib.Format.formatter -> + Ast.untyped_expression Ast.printable -> + unit
val pp_list_of_printables : + Stdlib.Format.formatter -> + Ast.untyped_expression Ast.printable list -> + unit
val pp_bracketed_transform : + Stdlib.Format.formatter -> + Ast.untyped_expression Middle.Transformation.t -> + unit
val pp_indent_unless_block : + Stdlib.Format.formatter -> + (Ast.untyped_statement * Middle.Location.t) -> + unit
val pp_recursive_ifthenelse : + ((Ast.untyped_expression, Ast.located_meta, Ast.untyped_lval, unit) + Ast.statement_with + * Middle.Location.t) + Fmt.t

This function helps write chained if-then-else-if-... blocks correctly. Without it, each IfThenElse would trigger a new vbox in front of the if, adding spaces for each level of IfThenElse.

val pp_statement : Ast.untyped_statement Fmt.t
val pp_args : + Stdlib.Format.formatter -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t * Ast.identifier) -> + unit
val pp_list_of_statements : + ((Ast.untyped_expression, Ast.located_meta, Ast.untyped_lval, unit) + Ast.statement_with + list + * Middle.Location_span.t) + Fmt.t
val pp_typed_expression : + Stdlib.Format.formatter -> + Ast.typed_expression -> + unit
diff --git a/stanc/Frontend/Promotion/index.html b/stanc/Frontend/Promotion/index.html new file mode 100644 index 000000000..915ebbe07 --- /dev/null +++ b/stanc/Frontend/Promotion/index.html @@ -0,0 +1,18 @@ + +Promotion (stanc.Frontend.Promotion)

Module Frontend.Promotion

module UnsizedType = Middle.UnsizedType
type t =
  1. | NoPromotion
  2. | IntToReal
  3. | ToVar
  4. | ToComplexVar
  5. | IntToComplex
  6. | RealToComplex
  7. | TuplePromotion of t list

Type to represent promotions in the typechecker. This can be used to return information about how to promote expressions for use in Ast.Promotion

val t_of_sexp : Sexplib0.Sexp.t -> t
val sexp_of_t : t -> Sexplib0.Sexp.t
val scalarize : UnsizedType.t -> UnsizedType.t

Our promotion nodes only store the scalar type to promote, e.g to promote a tuple(array int) to a tuple(array real), we store tuple(real), not tuple(array real)

val promote_unsized_type : + UnsizedType.t -> + UnsizedType.autodifftype -> + t -> + UnsizedType.t * UnsizedType.autodifftype

Get the UnsizedType.t which is the result of promoting a given type. See promote for the version which promotes expressions directly.

val get_type_promotion_exn : + (UnsizedType.autodifftype * UnsizedType.t) -> + (UnsizedType.autodifftype * UnsizedType.t) -> + t

Get the promotion needed to make the second type into the first. Types NEED to have previously been checked to be promotable or else a fatal error will be thrown.

val promotion_cost : t -> Core.Int.t

Calculate the "cost"/number of promotions performed. Used to disambiguate function signatures

diff --git a/stanc/Frontend/Semantic_error/index.html b/stanc/Frontend/Semantic_error/index.html new file mode 100644 index 000000000..76de158ba --- /dev/null +++ b/stanc/Frontend/Semantic_error/index.html @@ -0,0 +1,138 @@ + +Semantic_error (stanc.Frontend.Semantic_error)

Module Frontend.Semantic_error

type t
val pp : Stdlib.Format.formatter -> t -> unit
val location : t -> Middle.Location_span.t
val mismatched_array_types : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + Middle.UnsizedType.t -> + t
val invalid_row_vector_types : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + t
val invalid_matrix_types : Middle.Location_span.t -> Middle.UnsizedType.t -> t
val int_expected : + Middle.Location_span.t -> + string -> + Middle.UnsizedType.t -> + t
val int_or_real_expected : + Middle.Location_span.t -> + string -> + Middle.UnsizedType.t -> + t
val int_intarray_or_range_expected : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + t
val int_or_real_container_expected : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + t
val scalar_or_type_expected : + Middle.Location_span.t -> + string -> + Middle.UnsizedType.t -> + Middle.UnsizedType.t -> + t
val array_vector_rowvector_matrix_expected : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + t
val returning_fn_expected_nonreturning_found : + Middle.Location_span.t -> + string -> + t
val returning_fn_expected_nonfn_found : Middle.Location_span.t -> string -> t
val returning_fn_expected_undeclaredident_found : + Middle.Location_span.t -> + string -> + string option -> + t
val returning_fn_expected_undeclared_dist_suffix_found : + Middle.Location_span.t -> + (string * string) -> + t
val returning_fn_expected_wrong_dist_suffix_found : + Middle.Location_span.t -> + (string * string) -> + t
val illtyped_reduce_sum_not_array : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + t
val illtyped_reduce_sum_slice : + Middle.Location_span.t -> + Middle.UnsizedType.t -> + t
val ambiguous_function_promotion : + Middle.Location_span.t -> + string -> + Middle.UnsizedType.t list option -> + (Middle.UnsizedType.returntype + * (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list) + list -> + t
val nonreturning_fn_expected_returning_found : + Middle.Location_span.t -> + string -> + t
val nonreturning_fn_expected_nonfn_found : + Middle.Location_span.t -> + string -> + t
val nonreturning_fn_expected_undeclaredident_found : + Middle.Location_span.t -> + string -> + string option -> + t
val illtyped_fn_app : + Middle.Location_span.t -> + string -> + (SignatureMismatch.signature_error list * bool) -> + Middle.UnsizedType.t list -> + t
val illtyped_prefix_op : + Middle.Location_span.t -> + Middle.Operator.t -> + Middle.UnsizedType.t -> + t
val illtyped_postfix_op : + Middle.Location_span.t -> + Middle.Operator.t -> + Middle.UnsizedType.t -> + t
val tuple_index_invalid_index : Middle.Location_span.t -> int -> int -> t
val tuple_index_not_tuple : Middle.Location_span.t -> Middle.UnsizedType.t -> t
val not_indexable : Middle.Location_span.t -> Middle.UnsizedType.t -> int -> t
val ident_is_keyword : Middle.Location_span.t -> string -> t
val ident_is_model_name : Middle.Location_span.t -> string -> t
val ident_is_stanmath_name : Middle.Location_span.t -> string -> t
val ident_in_use : Middle.Location_span.t -> string -> t
val ident_not_in_scope : Middle.Location_span.t -> string -> string option -> t
val invalid_decl_rng_fn : Middle.Location_span.t -> t
val invalid_rng_fn : Middle.Location_span.t -> t
val invalid_unnormalized_fn : Middle.Location_span.t -> t
val udf_is_unnormalized_fn : Middle.Location_span.t -> string -> t
val ident_has_unnormalized_suffix : Middle.Location_span.t -> string -> t
val conditional_notation_not_allowed : Middle.Location_span.t -> t
val conditioning_required : Middle.Location_span.t -> t
val not_printable : Middle.Location_span.t -> t
val empty_array : Middle.Location_span.t -> t
val empty_tuple : Middle.Location_span.t -> t
val bad_int_literal : Middle.Location_span.t -> t
val cannot_assign_to_read_only : Middle.Location_span.t -> string -> t
val cannot_assign_to_global : Middle.Location_span.t -> string -> t
val cannot_assign_function : + Middle.Location_span.t -> + string -> + Middle.UnsizedType.t -> + t
val cannot_assign_to_multiindex : Middle.Location_span.t -> t
val cannot_assign_duplicate_unpacking : + Middle.Location_span.t -> + Ast.untyped_lval list -> + t
val cannot_access_assigning_var : Middle.Location_span.t -> string list -> t
val invalid_tilde_pdf_or_pmf : Middle.Location_span.t -> t
val invalid_tilde_cdf_or_ccdf : Middle.Location_span.t -> string -> t
val invalid_tilde_no_such_dist : Middle.Location_span.t -> string -> bool -> t
val target_plusequals_outside_model_or_logprob : Middle.Location_span.t -> t
val jacobian_plusequals_not_allowed : Middle.Location_span.t -> t
val invalid_truncation_cdf_or_ccdf : + Middle.Location_span.t -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + t
val break_outside_loop : Middle.Location_span.t -> t
val continue_outside_loop : Middle.Location_span.t -> t
val expression_return_outside_returning_fn : Middle.Location_span.t -> t
val void_outside_nonreturning_fn : Middle.Location_span.t -> t
val non_data_variable_size_decl : Middle.Location_span.t -> t
val non_int_bounds : Middle.Location_span.t -> t
val complex_transform : Middle.Location_span.t -> t
val transformed_params_int : Middle.Location_span.t -> t
val fn_overload_rt_only : + Middle.Location_span.t -> + string -> + Middle.UnsizedType.returntype -> + Middle.UnsizedType.returntype -> + t
val fn_decl_redefined : + Middle.Location_span.t -> + string -> + stan_math:bool -> + Middle.UnsizedType.t -> + t
val fn_decl_exists : Middle.Location_span.t -> string -> t
val fn_decl_without_def : Middle.Location_span.t -> string -> t
val fn_decl_needs_block : Middle.Location_span.t -> t
val non_real_prob_fn_def : Middle.Location_span.t -> t
val prob_density_non_real_variate : + Middle.Location_span.t -> + Middle.UnsizedType.t option -> + t
val prob_mass_non_int_variate : + Middle.Location_span.t -> + Middle.UnsizedType.t option -> + t
val duplicate_arg_names : Middle.Location_span.t -> t
val incompatible_return_types : Middle.Location_span.t -> t
diff --git a/stanc/Frontend/SignatureMismatch/index.html b/stanc/Frontend/SignatureMismatch/index.html new file mode 100644 index 000000000..3693264a3 --- /dev/null +++ b/stanc/Frontend/SignatureMismatch/index.html @@ -0,0 +1,51 @@ + +SignatureMismatch (stanc.Frontend.SignatureMismatch)

Module Frontend.SignatureMismatch

type type_mismatch = private
  1. | DataOnlyError
  2. | TypeMismatch of Middle.UnsizedType.t * Middle.UnsizedType.t * details option
and details = private
  1. | SuffixMismatch of unit Middle.Fun_kind.suffix * unit Middle.Fun_kind.suffix
  2. | ReturnTypeMismatch of Middle.UnsizedType.returntype + * Middle.UnsizedType.returntype
  3. | InputMismatch of function_mismatch
and function_mismatch = private
  1. | ArgError of int * type_mismatch
  2. | ArgNumMismatch of int * int
type ('unique, 'error) generic_match_result =
  1. | UniqueMatch of 'unique
  2. | AmbiguousMatch of (Middle.UnsizedType.returntype + * (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) + list) + list
  3. | SignatureErrors of 'error

The match result for general (non-variadic) functions

val check_of_same_type_mod_conv : + Middle.UnsizedType.t -> + Middle.UnsizedType.t -> + (Promotion.t, type_mismatch) Core.result
val check_compatible_arguments_mod_conv : + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + (Promotion.t list, function_mismatch) Core.result
val unique_minimum_promotion : + ('a * Promotion.t list) list -> + ('a * Promotion.t list, 'a list option) Core.result
val matching_function : + Environment.t -> + string -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + match_result

Searches for a function of the given name which can support the required argument types. Requires a unique minimum option under type promotion

val matching_stanlib_function : + string -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + match_result

Same as matching_function but requires specifically that the function be from StanMath (uses Environment.stan_math_environment)

Check variadic function arguments. If a match is found, returns Ok of the function type and a list of promotions (see promote) If none is found, returns Error of the list of args and a function_mismatch.

val pp_signature_mismatch : + Stdlib.Format.formatter -> + (string + * Middle.UnsizedType.t list + * (((Middle.UnsizedType.returntype + * (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list) + * function_mismatch) + list + * bool)) -> + unit
val pp_math_lib_assignmentoperator_sigs : + Stdlib.Format.formatter -> + (Middle.UnsizedType.t * Middle.Operator.t) -> + unit
val compare_errors : function_mismatch -> function_mismatch -> int
val compare_match_results : match_result -> match_result -> int
diff --git a/stanc/Frontend/Typechecker/index.html b/stanc/Frontend/Typechecker/index.html new file mode 100644 index 000000000..e17a47901 --- /dev/null +++ b/stanc/Frontend/Typechecker/index.html @@ -0,0 +1,12 @@ + +Typechecker (stanc.Frontend.Typechecker)

Module Frontend.Typechecker

a type/semantic checker for Stan ASTs

Functions which begin with "check_" return a typed version of their input Functions which begin with "verify_" return unit if a check succeeds, or else throw an Frontend.Errors.SemanticError exception. Other functions which begin with "infer"/"calculate" vary. Usually they return a value, but a few do have error conditions.

All Error.SemanticError excepetions are caught by check_program which turns the ast or exception into a Result.t for external usage

A type environment Frontend.Environment.t is used to hold variables and functions, including Stan math functions. This is a functional map, meaning it is handled immutably.

val check_program_exn : + Ast.untyped_program -> + Ast.typed_program * Warnings.t list

Type check a full Stan program. Can raise Errors.SemanticError

val check_program : + Ast.untyped_program -> + (Ast.typed_program * Warnings.t list, Semantic_error.t) Stdlib.result

The safe version of check_program_exn. This catches all Errors.SemanticError exceptions and converts them into a Result.t

val operator_stan_math_return_type : + Middle.Operator.t -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + (Middle.UnsizedType.returntype * Promotion.t list) option
val stan_math_return_type : + string -> + (Middle.UnsizedType.autodifftype * Middle.UnsizedType.t) list -> + Middle.UnsizedType.returntype option
val model_name : string Stdlib.ref

A reference to hold the model name. Relevant for checking variable clashes and used in code generation.

val check_that_all_functions_have_definition : bool Stdlib.ref

A switch to determine whether we check that all functions have a definition

diff --git a/stanc/Frontend/Warnings/index.html b/stanc/Frontend/Warnings/index.html new file mode 100644 index 000000000..3e4b1b0e2 --- /dev/null +++ b/stanc/Frontend/Warnings/index.html @@ -0,0 +1,2 @@ + +Warnings (stanc.Frontend.Warnings)

Module Frontend.Warnings

Used for user-facing warning messages

type t = Middle.Location_span.t * string
val pp : ?printed_filename:string -> t Fmt.t
val pp_warnings : ?printed_filename:string -> t list Fmt.t
diff --git a/stanc/Frontend/index.html b/stanc/Frontend/index.html new file mode 100644 index 000000000..a70526dcd --- /dev/null +++ b/stanc/Frontend/index.html @@ -0,0 +1,2 @@ + +Frontend (stanc.Frontend)

Module Frontend

module Ast : sig ... end

Abstract syntax tree for Stan. Defined with the 'two-level types' pattern, where the variant types are not directly recursive, but rather parametric in some other type.

module Ast_to_Mir : sig ... end
module Canonicalize : sig ... end

Re-write ASTs to remove deprecated features and clean up extra parenthesis, etc

module Debugging : sig ... end

Some helpers for debugging

module Deprecation_analysis : sig ... end

Utilities for emitting deprecation warnings and finding proper replacements for deprecated features

module Environment : sig ... end

Type environments used during typechecking. Maps from strings to function or variable information

module Errors : sig ... end

Some plumbing for our compiler errors

module Include_files : sig ... end
module Info : sig ... end

Implementation of the --info option which outputs on the standard output a JSON object containing information about the model.

module Input_warnings : sig ... end

A module to contain the mutable state used to track warnings from the parser and lexer.

module Lexer : sig ... end
module Parse : sig ... end

Some complicated stuff to get the custom syntax errors out of Menhir's Incremental API

module Parser : sig ... end
module Parsing_errors : sig ... end
module Preprocessor : sig ... end

Preprocessor for handling include directives

module Pretty_print_prog : sig ... end

Pretty print a complete Stan program.

module Pretty_printing : sig ... end

Some helpers to produce nice error messages and for auto-formatting Stan programs

module Promotion : sig ... end
module Semantic_error : sig ... end
module SignatureMismatch : sig ... end
module Typechecker : sig ... end

a type/semantic checker for Stan ASTs

module Warnings : sig ... end

Used for user-facing warning messages

diff --git a/stanc/Middle/Expr/Fixed/Pattern/index.html b/stanc/Middle/Expr/Fixed/Pattern/index.html new file mode 100644 index 000000000..7d145158b --- /dev/null +++ b/stanc/Middle/Expr/Fixed/Pattern/index.html @@ -0,0 +1,13 @@ + +Pattern (stanc.Middle.Expr.Fixed.Pattern)

Module Fixed.Pattern

type litType =
  1. | Int
  2. | Real
  3. | Imaginary
  4. | Str
val sexp_of_litType : litType -> Sexplib0.Sexp.t
val litType_of_sexp : Sexplib0.Sexp.t -> litType
val hash_fold_litType : + Ppx_hash_lib.Std.Hash.state -> + litType -> + Ppx_hash_lib.Std.Hash.state
val hash_litType : litType -> Ppx_hash_lib.Std.Hash.hash_value
val compare_litType : litType -> litType -> int
type 'a t =
  1. | Var of string
  2. | Lit of litType * string
  3. | FunApp of 'a Fun_kind.t * 'a list
  4. | TernaryIf of 'a * 'a * 'a
  5. | EAnd of 'a * 'a
  6. | EOr of 'a * 'a
  7. | Indexed of 'a * 'a Index.t list
  8. | Promotion of 'a * UnsizedType.t * UnsizedType.autodifftype
  9. | TupleProjection of 'a * int
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
include Common.Pattern.S with type 'a t := 'a t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
val map : ('a -> 'b) -> 'a t -> 'b t
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Common.Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Common.Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
diff --git a/stanc/Middle/Expr/Fixed/index.html b/stanc/Middle/Expr/Fixed/index.html new file mode 100644 index 000000000..44d5b9f76 --- /dev/null +++ b/stanc/Middle/Expr/Fixed/index.html @@ -0,0 +1,16 @@ + +Fixed (stanc.Middle.Expr.Fixed)

Module Expr.Fixed

module Pattern : sig ... end
include Common.Fixed.S with module Pattern := Pattern
type 'a t = {
  1. pattern : 'a t Pattern.t;
  2. meta : 'a;
}
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b
include Ppx_compare_lib.Comparable.S1 with type 'a t := 'a t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S1 with type 'a t := 'a t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
include Common.Foldable.S with type 'a t := 'a t
val fold_left : f:('b -> 'a -> 'b) -> init:'b -> 'a t -> 'b

Left associative fold of a data structure; this is the same as the function derived from [@@deriving fold] but with labelled arguments

val fold_right : f:('a -> 'b -> 'b) -> init:'b -> 'a t -> 'b

Right associative fold of a data structure

val any : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether any element of the data structure satisfies the supplied predicate. The optional argument init specifies the starting value and defaults to false.

val all : pred:('a -> bool) -> ?init:bool -> 'a t -> bool

Test whether all elements of the the data structure satify the supplied predicate. The optional argument init specifies the starting value and defaults to true.

include Common.Pretty.S1 with type 'a t := 'a t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
val fold_pattern : f:(('a * 'r Pattern.t) -> 'r) -> 'a t -> 'r

fold_pattern traverses the data structure from the bottom up replacing the original meta data of type 'a with some result type 'r and combines the result values on the way back up. For example, given a pattern with the following type:

type 'a pattern = Leaf of string | Branch of 'a * 'a

we can use fold_pattern to calculate the maximum depth of data structure obtained by fixing the pattern type:

let max_depth t =
+  let f = function
+      | meta , Leaf _ -> 1
+      | meta , Branch(left_depth,right_depth) ->
+          1 + (max left_depth right_depth)
+  in
+  fold_pattern ~f t

Note that the function 'f' supplied to fold_pattern accepts a tuple rather than our type 'a t since the type of the pattern has been transformed to 'r t Pattern.t and is no longer 'compatible' with the original type of meta data 'a. That is, a tuple ('a * 'b t Pattern.t) has two type variables where as 'a t has one.

val rewrite_bottom_up : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_bottom_up specializes fold_pattern so that the result type 'r is equal to the type of our fixed-point data structure i.e. 'r = 'a t. This also means that the function f can be written with our fixed-point type 'a t as its argument.

val unfold_pattern : f:('r -> 'a * 'r Pattern.t) -> 'r -> 'a t

unfold builds a fixed-point data structure from the top down. Starting with a user-supplied seed of type 'r, unfold recursively applies the function f yielding a tuple of meta-data and pattern with elements of type 'r to which f is further applied.

The unfold terminates when a pattern element which does not carry an 'r is reached.

As with fold_pattern the function f returns a tuple of meta-data and pattern rather than our record type since, in general, 'r =/= 'a t.

val rewrite_top_down : f:('a t -> 'a t) -> 'a t -> 'a t

rewrite_top_down specializes unfold by requiring that r = 'a t. As a consequence the function f accepts our record type 'a t as its argument.

diff --git a/stanc/Middle/Expr/Helpers/index.html b/stanc/Middle/Expr/Helpers/index.html new file mode 100644 index 000000000..28d8016c0 --- /dev/null +++ b/stanc/Middle/Expr/Helpers/index.html @@ -0,0 +1,10 @@ + +Helpers (stanc.Middle.Expr.Helpers)

Module Expr.Helpers

val int : int -> Typed.t
val float : float -> Typed.t
val complex : (float * float) -> Typed.t
val str : string -> Typed.t
val variable : string -> Typed.t
val zero : Typed.t
val one : Typed.t
val unary_op : Operator.t -> Typed.t -> Typed.t
val binop : Typed.t -> Operator.t -> Typed.t -> Typed.t
val binop_list : Typed.t list -> Operator.t -> default:Typed.t -> Typed.t
val row_vector : float list -> Typed.t
val vector : float list -> Typed.t
val matrix : float list list -> Typed.t
val matrix_from_rows : Typed.t list -> Typed.t
val complex_row_vector : (float * float) list -> Typed.t
val complex_vector : (float * float) list -> Typed.t
val complex_matrix_from_rows : Typed.t list -> Typed.t
val array_expr : Typed.t list -> Typed.t
val tuple_expr : Typed.t list -> Typed.t
val try_unpack : Typed.t -> Typed.t list option
val loop_bottom : Typed.t
val internal_funapp : + 'a Fixed.t Internal_fun.t -> + 'a Fixed.t list -> + 'a -> + 'a Fixed.t
val contains_fn_kind : + ('a Fixed.t Fun_kind.t -> bool) -> + ?init:bool -> + 'a Fixed.t -> + bool
val infer_type_of_indexed : UnsizedType.t -> 'a Index.t list -> UnsizedType.t
val add_int_index : Typed.t -> Typed.t Index.t -> Typed.t
val add_tuple_index : Typed.t -> int -> Typed.t
val collect_indices : 'a Fixed.t -> 'a Fixed.t Index.t list
diff --git a/stanc/Middle/Expr/Typed/Map/Key/index.html b/stanc/Middle/Expr/Typed/Map/Key/index.html new file mode 100644 index 000000000..4bc21e6f7 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Expr.Typed.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Expr/Typed/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Middle/Expr/Typed/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..37b3575bc --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Expr.Typed.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Expr/Typed/Map/Provide_bin_io/index.html b/stanc/Middle/Expr/Typed/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..3f9394ab6 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Expr.Typed.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Middle/Expr/Typed/Map/Provide_hash/argument-1-Key/index.html b/stanc/Middle/Expr/Typed/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..9b2ce6e0d --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Expr.Typed.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Middle/Expr/Typed/Map/Provide_hash/index.html b/stanc/Middle/Expr/Typed/Map/Provide_hash/index.html new file mode 100644 index 000000000..e8d0d7df3 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Middle.Expr.Typed.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Middle/Expr/Typed/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Middle/Expr/Typed/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..498ad5e6e --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Expr.Typed.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Middle/Expr/Typed/Map/Provide_of_sexp/index.html b/stanc/Middle/Expr/Typed/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..fb767f382 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Expr.Typed.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Middle/Expr/Typed/Map/index.html b/stanc/Middle/Expr/Typed/Map/index.html new file mode 100644 index 000000000..c644724d6 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Middle.Expr.Typed.Map)

Module Typed.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Expr/Typed/Meta/index.html b/stanc/Middle/Expr/Typed/Meta/index.html new file mode 100644 index 000000000..f2553b2ae --- /dev/null +++ b/stanc/Middle/Expr/Typed/Meta/index.html @@ -0,0 +1,7 @@ + +Meta (stanc.Middle.Expr.Typed.Meta)

Module Typed.Meta

type t = {
  1. type_ : UnsizedType.t;
  2. loc : Location_span.t;
  3. adlevel : UnsizedType.autodifftype;
}
val create : + type_:UnsizedType.t -> + loc:Location_span.t -> + adlevel:UnsizedType.autodifftype -> + unit -> + t
include Ppx_compare_lib.Comparable.S with type t := t
include Sexplib0.Sexpable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
include Common.Specialized.Meta with type t := t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Common.Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Middle/Expr/Typed/Replace_polymorphic_compare/index.html b/stanc/Middle/Expr/Typed/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..08170c0e8 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Middle.Expr.Typed.Replace_polymorphic_compare)

Module Typed.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Middle/Expr/Typed/Set/Elt/index.html b/stanc/Middle/Expr/Typed/Set/Elt/index.html new file mode 100644 index 000000000..6443aebee --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Expr.Typed.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Expr/Typed/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Middle/Expr/Typed/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..11f562042 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Expr.Typed.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Expr/Typed/Set/Provide_bin_io/index.html b/stanc/Middle/Expr/Typed/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..63078a525 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Expr.Typed.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Expr/Typed/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Middle/Expr/Typed/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..f4eb02969 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Expr.Typed.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Middle/Expr/Typed/Set/Provide_hash/index.html b/stanc/Middle/Expr/Typed/Set/Provide_hash/index.html new file mode 100644 index 000000000..f0b872e3b --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Middle.Expr.Typed.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Middle/Expr/Typed/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Middle/Expr/Typed/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..37f621e61 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Expr.Typed.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Middle/Expr/Typed/Set/Provide_of_sexp/index.html b/stanc/Middle/Expr/Typed/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..83c7a6647 --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Expr.Typed.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Middle/Expr/Typed/Set/index.html b/stanc/Middle/Expr/Typed/Set/index.html new file mode 100644 index 000000000..9190dfe4c --- /dev/null +++ b/stanc/Middle/Expr/Typed/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Middle.Expr.Typed.Set)

Module Typed.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Expr/Typed/index.html b/stanc/Middle/Expr/Typed/index.html new file mode 100644 index 000000000..9a27ba306 --- /dev/null +++ b/stanc/Middle/Expr/Typed/index.html @@ -0,0 +1,9 @@ + +Typed (stanc.Middle.Expr.Typed)

Module Expr.Typed

module Meta : sig ... end
include Common.Specialized.S + with module Meta := Meta + and type t = Meta.t Fixed.t
type t = Meta.t Fixed.t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Common.Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
val type_of : t -> UnsizedType.t
val loc_of : t -> Location_span.t
val adlevel_of : t -> UnsizedType.autodifftype
diff --git a/stanc/Middle/Expr/index.html b/stanc/Middle/Expr/index.html new file mode 100644 index 000000000..a59bc5686 --- /dev/null +++ b/stanc/Middle/Expr/index.html @@ -0,0 +1,2 @@ + +Expr (stanc.Middle.Expr)

Module Middle.Expr

MIR types and modules corresponding to the expressions of the language

module Fixed : sig ... end
module Typed : sig ... end
module Helpers : sig ... end
diff --git a/stanc/Middle/Flag_vars/index.html b/stanc/Middle/Flag_vars/index.html new file mode 100644 index 000000000..2819fc199 --- /dev/null +++ b/stanc/Middle/Flag_vars/index.html @@ -0,0 +1,2 @@ + +Flag_vars (stanc.Middle.Flag_vars)

Module Middle.Flag_vars

type t =
  1. | EmitGeneratedQuantities
  2. | EmitTransformedParameters
val enumerate : t list
val to_string : t -> string
diff --git a/stanc/Middle/Fun_kind/index.html b/stanc/Middle/Fun_kind/index.html new file mode 100644 index 000000000..051cd9139 --- /dev/null +++ b/stanc/Middle/Fun_kind/index.html @@ -0,0 +1,30 @@ + +Fun_kind (stanc.Middle.Fun_kind)

Module Middle.Fun_kind

Types for function kinds, e.g. StanLib or UserDefined, and function suffix types, e.g. foo_ldfp, bar_lp

type 'propto suffix =
  1. | FnPlain
  2. | FnRng
  3. | FnLpdf of 'propto
  4. | FnLpmf of 'propto
  5. | FnTarget
  6. | FnJacobian
val fold_suffix : ('a -> 'b -> 'a) -> 'a -> 'b suffix -> 'a
val map_suffix : ('a -> 'b) -> 'a suffix -> 'b suffix
val compare_suffix : + 'propto. ('propto -> 'propto -> int) -> + 'propto suffix -> + 'propto suffix -> + int
val hash_fold_suffix : + 'propto. (Ppx_hash_lib.Std.Hash.state -> + 'propto -> + Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'propto suffix -> + Ppx_hash_lib.Std.Hash.state
val suffix_of_sexp : + 'propto. (Sexplib0.Sexp.t -> 'propto) -> + Sexplib0.Sexp.t -> + 'propto suffix
val sexp_of_suffix : + 'propto. ('propto -> Sexplib0.Sexp.t) -> + 'propto suffix -> + Sexplib0.Sexp.t
val equal_suffix : + 'propto. ('propto -> 'propto -> bool) -> + 'propto suffix -> + 'propto suffix -> + bool
val without_propto : bool suffix -> unit suffix
type 'e t =
  1. | StanLib of string * bool suffix * Mem_pattern.t
  2. | CompilerInternal of 'e Internal_fun.t
  3. | UserDefined of string * bool suffix
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val compare : + 'e. ('e -> 'e -> Core__.Import.int) -> + 'e t -> + 'e t -> + Core__.Import.int
val t_of_sexp : 'e. (Sexplib0.Sexp.t -> 'e) -> Sexplib0.Sexp.t -> 'e t
val sexp_of_t : 'e. ('e -> Sexplib0.Sexp.t) -> 'e t -> Sexplib0.Sexp.t
val hash_fold_t : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e t -> + Ppx_hash_lib.Std.Hash.state
val jacobian_compat_mode : bool Core.ref

If true, we assume _jacobian functions are "plain" functions for the purposes of typechecking and warnings

val suffix_from_name : string -> bool suffix
val forget_normalization : 'a suffix -> unit suffix
val with_unnormalized_suffix : string -> string option
val pp : 'a Fmt.t -> Stdlib.Format.formatter -> 'a t -> unit
val collect_exprs : 'a t -> 'a list
diff --git a/stanc/Middle/Index/index.html b/stanc/Middle/Index/index.html new file mode 100644 index 000000000..cd01eb3df --- /dev/null +++ b/stanc/Middle/Index/index.html @@ -0,0 +1,18 @@ + +Index (stanc.Middle.Index)

Module Middle.Index

Types of indexing operations

type 'a t =
  1. | All
  2. | Single of 'a
  3. | Upfrom of 'a
  4. | Between of 'a * 'a
  5. | MultiIndex of 'a
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val t_of_sexp : 'a. (Sexplib0.Sexp.t -> 'a) -> Sexplib0.Sexp.t -> 'a t
val sexp_of_t : 'a. ('a -> Sexplib0.Sexp.t) -> 'a t -> Sexplib0.Sexp.t
val hash_fold_t : + 'a. (Ppx_hash_lib.Std.Hash.state -> 'a -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'a t -> + Ppx_hash_lib.Std.Hash.state
val compare : 'a. ('a -> 'a -> int) -> 'a t -> 'a t -> int
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t -> + unit
val pp_indices : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a t list -> + unit
val bounds : 'a t -> 'a list
val apply : default:'b -> merge:('b -> 'b -> 'b) -> ('a -> 'b) -> 'a t -> 'b

Apply an op over the Index types inner expressions.

  • parameter default

    Value to return for All

  • parameter merge

    Function taking in lhs and rhs of Between and merging their result.

  • parameter op

    a functor to run with inputs of inner exprs

  • parameter ind

    the Index.t to

val folder : + string Core.Set.Poly.t -> + (string Core.Set.Poly.t -> 'a -> string Core.Set.Poly.t) -> + 'a t -> + string Core.Set.Poly.t
diff --git a/stanc/Middle/Internal_fun/index.html b/stanc/Middle/Internal_fun/index.html new file mode 100644 index 000000000..89ed02f3b --- /dev/null +++ b/stanc/Middle/Internal_fun/index.html @@ -0,0 +1,10 @@ + +Internal_fun (stanc.Middle.Internal_fun)

Module Middle.Internal_fun

Language functions defined internally by the compiler

type 'expr t =
  1. | FnLength
  2. | FnMakeArray
  3. | FnMakeTuple
  4. | FnMakeRowVec
  5. | FnNegInf
  6. | FnReadData
  7. | FnReadDeserializer
  8. | FnReadParam of {
    1. constrain : 'expr Transformation.t;
    2. dims : 'expr list;
    3. mem_pattern : Mem_pattern.t;
    }
  9. | FnWriteParam of {
    1. unconstrain_opt : 'expr Transformation.t option;
    2. var : 'expr;
    }
  10. | FnValidateSize
  11. | FnValidateSizeSimplex
  12. | FnValidateSizeUnitVector
  13. | FnCheck of {
    1. trans : 'expr Transformation.t;
    2. var_name : string;
    3. var : 'expr;
    }
  14. | FnPrint
  15. | FnReject
  16. | FnFatalError
  17. | FnResizeToMatch
  18. | FnNaN
  19. | FnDeepCopy
  20. | FnReadWriteEventsOpenCL of string
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val t_of_sexp : 'expr. (Sexplib0.Sexp.t -> 'expr) -> Sexplib0.Sexp.t -> 'expr t
val sexp_of_t : 'expr. ('expr -> Sexplib0.Sexp.t) -> 'expr t -> Sexplib0.Sexp.t
val hash_fold_t : + 'expr. (Ppx_hash_lib.Std.Hash.state -> 'expr -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'expr t -> + Ppx_hash_lib.Std.Hash.state
val compare : + 'expr. ('expr -> 'expr -> Core__.Import.int) -> + 'expr t -> + 'expr t -> + Core__.Import.int
val to_string : ?expr_to_string:('a -> Sexplib0.Sexp.t) -> 'a t -> string
val pp : 'a Fmt.t -> Stdlib.Format.formatter -> 'a t -> unit
val can_side_effect : 'a t -> bool
val collect_exprs : 'a t -> 'a list
diff --git a/stanc/Middle/Location/index.html b/stanc/Middle/Location/index.html new file mode 100644 index 000000000..26edcabe3 --- /dev/null +++ b/stanc/Middle/Location/index.html @@ -0,0 +1,10 @@ + +Location (stanc.Middle.Location)

Module Middle.Location

Storing locations in the original source

type t = {
  1. filename : string;
  2. line_num : int;
  3. col_num : int;
  4. included_from : t option;
}

Source code locations

val t_of_sexp : Sexplib0.Sexp.t -> t
val sexp_of_t : t -> Sexplib0.Sexp.t
val hash_fold_t : + Ppx_hash_lib.Std.Hash.state -> + t -> + Ppx_hash_lib.Std.Hash.state
val hash : t -> Ppx_hash_lib.Std.Hash.hash_value
val pp_context_list : Stdlib.Format.formatter -> (string list * t) -> unit
val context_to_string : (unit -> string list) -> t -> string option

Turn the given location into a string holding the code of that location. Code is retrieved by calling context_cb, which may do IO. Exceptions in the callback or in the creation of the string (possible if the context is incorrectly too short for the given location) return None

val empty : t
val to_string : + ?printed_filename:string -> + ?print_file:bool -> + ?print_line:bool -> + t -> + string

Format the location for error messaging.

If printed_filename is passed, it replaces the highest-level name and leaves the filenames of included files intact.

val compare : t -> t -> int
diff --git a/stanc/Middle/Location_span/Comparator/index.html b/stanc/Middle/Location_span/Comparator/index.html new file mode 100644 index 000000000..c6aa72eb8 --- /dev/null +++ b/stanc/Middle/Location_span/Comparator/index.html @@ -0,0 +1,2 @@ + +Comparator (stanc.Middle.Location_span.Comparator)

Module Location_span.Comparator

type comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Location_span/Map/Key/index.html b/stanc/Middle/Location_span/Map/Key/index.html new file mode 100644 index 000000000..647bc37f6 --- /dev/null +++ b/stanc/Middle/Location_span/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Location_span.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = Comparator.comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Location_span/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Middle/Location_span/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..eb13c870f --- /dev/null +++ b/stanc/Middle/Location_span/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Location_span.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Location_span/Map/Provide_bin_io/index.html b/stanc/Middle/Location_span/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..27dab1542 --- /dev/null +++ b/stanc/Middle/Location_span/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Location_span.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Middle/Location_span/Map/Provide_hash/argument-1-Key/index.html b/stanc/Middle/Location_span/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..071d6bca6 --- /dev/null +++ b/stanc/Middle/Location_span/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Location_span.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Middle/Location_span/Map/Provide_hash/index.html b/stanc/Middle/Location_span/Map/Provide_hash/index.html new file mode 100644 index 000000000..40bc23ac4 --- /dev/null +++ b/stanc/Middle/Location_span/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Middle.Location_span.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Middle/Location_span/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Middle/Location_span/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..24f5f6a74 --- /dev/null +++ b/stanc/Middle/Location_span/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Location_span.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Middle/Location_span/Map/Provide_of_sexp/index.html b/stanc/Middle/Location_span/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..7c36affb7 --- /dev/null +++ b/stanc/Middle/Location_span/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Location_span.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Middle/Location_span/Map/index.html b/stanc/Middle/Location_span/Map/index.html new file mode 100644 index 000000000..3707460f5 --- /dev/null +++ b/stanc/Middle/Location_span/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Middle.Location_span.Map)

Module Location_span.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Location_span/Replace_polymorphic_compare/index.html b/stanc/Middle/Location_span/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..eeca91ef2 --- /dev/null +++ b/stanc/Middle/Location_span/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Middle.Location_span.Replace_polymorphic_compare)

Module Location_span.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Middle/Location_span/Set/Elt/index.html b/stanc/Middle/Location_span/Set/Elt/index.html new file mode 100644 index 000000000..6c4ac905b --- /dev/null +++ b/stanc/Middle/Location_span/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Location_span.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = Comparator.comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Location_span/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Middle/Location_span/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..93f1fb258 --- /dev/null +++ b/stanc/Middle/Location_span/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Location_span.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Location_span/Set/Provide_bin_io/index.html b/stanc/Middle/Location_span/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..814713089 --- /dev/null +++ b/stanc/Middle/Location_span/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Location_span.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Location_span/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Middle/Location_span/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..c644039d8 --- /dev/null +++ b/stanc/Middle/Location_span/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Location_span.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Middle/Location_span/Set/Provide_hash/index.html b/stanc/Middle/Location_span/Set/Provide_hash/index.html new file mode 100644 index 000000000..e92b969ba --- /dev/null +++ b/stanc/Middle/Location_span/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Middle.Location_span.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Middle/Location_span/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Middle/Location_span/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..69fad687e --- /dev/null +++ b/stanc/Middle/Location_span/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Location_span.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Middle/Location_span/Set/Provide_of_sexp/index.html b/stanc/Middle/Location_span/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..05fa6d66d --- /dev/null +++ b/stanc/Middle/Location_span/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Location_span.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Middle/Location_span/Set/index.html b/stanc/Middle/Location_span/Set/index.html new file mode 100644 index 000000000..a495d4a52 --- /dev/null +++ b/stanc/Middle/Location_span/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Middle.Location_span.Set)

Module Location_span.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Location_span/index.html b/stanc/Middle/Location_span/index.html new file mode 100644 index 000000000..66d2fa99d --- /dev/null +++ b/stanc/Middle/Location_span/index.html @@ -0,0 +1,8 @@ + +Location_span (stanc.Middle.Location_span)

Module Middle.Location_span

Delimited locations in source code

type t = {
  1. begin_loc : Location.t;
  2. end_loc : Location.t;
}
val t_of_sexp : Sexplib0.Sexp.t -> t
val sexp_of_t : t -> Sexplib0.Sexp.t
val hash_fold_t : + Ppx_hash_lib.Std.Hash.state -> + t -> + Ppx_hash_lib.Std.Hash.state
val hash : t -> Ppx_hash_lib.Std.Hash.hash_value
val empty : t
val merge : t -> t -> t
val to_string : ?printed_filename:string -> t -> string

Render a location_span as a string

module Comparator : sig ... end
include module type of struct include Comparator end
type comparator_witness = Comparator.comparator_witness
include sig ... end
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, Comparator.comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Middle/Mem_pattern/index.html b/stanc/Middle/Mem_pattern/index.html new file mode 100644 index 000000000..74d9b840e --- /dev/null +++ b/stanc/Middle/Mem_pattern/index.html @@ -0,0 +1,5 @@ + +Mem_pattern (stanc.Middle.Mem_pattern)

Module Middle.Mem_pattern

type t =
  1. | AoS
  2. | SoA

* This type represents whether or not an autodiff type can be represented * as an Array of Structs (AoS) or as a Struct of Arrays. This applies to * matrices, vectors, row vectors, and arrays of those types. * In the C++ this allows us to swap out matrix types from an * Eigen::Matrix<stan::math::var_value<double>, Rows, Cols> to an * stan::math::var_value<Eigen::Matrix<double, Rows, Cols>>. * (fyi a var in the C++ code is an alias for var_value<double>) * *

val map : t -> t
val fold : 'a -> t -> 'a
val t_of_sexp : Sexplib0.Sexp.t -> t
val sexp_of_t : t -> Sexplib0.Sexp.t
val compare : t -> t -> int
val hash_fold_t : + Ppx_hash_lib.Std.Hash.state -> + t -> + Ppx_hash_lib.Std.Hash.state
val hash : t -> Ppx_hash_lib.Std.Hash.hash_value
val equal : t -> t -> bool
val pp : Stdlib.Format.formatter -> t -> unit
val lub_mem_pat : t list -> t
diff --git a/stanc/Middle/Operator/index.html b/stanc/Middle/Operator/index.html new file mode 100644 index 000000000..71c6cd7b3 --- /dev/null +++ b/stanc/Middle/Operator/index.html @@ -0,0 +1,5 @@ + +Operator (stanc.Middle.Operator)

Module Middle.Operator

Utilities for Stan's built in operators

type t =
  1. | Plus
  2. | PPlus
  3. | Minus
  4. | PMinus
  5. | Times
  6. | Divide
  7. | IntDivide
  8. | Modulo
  9. | LDivide
  10. | EltTimes
  11. | EltDivide
  12. | Pow
  13. | EltPow
  14. | Or
  15. | And
  16. | Equals
  17. | NEquals
  18. | Less
  19. | Leq
  20. | Greater
  21. | Geq
  22. | PNot
  23. | Transpose
val t_of_sexp : Sexplib0.Sexp.t -> t
val sexp_of_t : t -> Sexplib0.Sexp.t
val hash_fold_t : + Ppx_hash_lib.Std.Hash.state -> + t -> + Ppx_hash_lib.Std.Hash.state
val hash : t -> Ppx_hash_lib.Std.Hash.hash_value
val compare : t -> t -> int
val is_cmp : t -> bool
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
val of_string_opt : string -> t option
diff --git a/stanc/Middle/Program/Numbered/index.html b/stanc/Middle/Program/Numbered/index.html new file mode 100644 index 000000000..995a28b07 --- /dev/null +++ b/stanc/Middle/Program/Numbered/index.html @@ -0,0 +1,9 @@ + +Numbered (stanc.Middle.Program.Numbered)

Module Program.Numbered

type nonrec t = (Expr.Typed.t, Stmt.Numbered.t, int) t
val pp : + Stdlib.Format.formatter -> + (Expr.Typed.t, Stmt.Numbered.t, 'a) t -> + unit
val sexp_of_t : + (Expr.Typed.t, Stmt.Numbered.t, Core__.Import.int) t -> + Sexplib0.Sexp.t
val t_of_sexp : + Sexplib0.Sexp.t -> + (Expr.Typed.t, Stmt.Numbered.t, Core__.Import.int) t
diff --git a/stanc/Middle/Program/Typed/index.html b/stanc/Middle/Program/Typed/index.html new file mode 100644 index 000000000..b8f9edad8 --- /dev/null +++ b/stanc/Middle/Program/Typed/index.html @@ -0,0 +1,9 @@ + +Typed (stanc.Middle.Program.Typed)

Module Program.Typed

Programs with typed expressions and locations

val pp : + Stdlib.Format.formatter -> + (Expr.Typed.t, Stmt.Located.t, 'a) t -> + unit
val sexp_of_t : + (Expr.Typed.t, Stmt.Located.t, Location_span.t) t -> + Sexplib0.Sexp.t
val t_of_sexp : + Sexplib0.Sexp.t -> + (Expr.Typed.t, Stmt.Located.t, Location_span.t) t
diff --git a/stanc/Middle/Program/index.html b/stanc/Middle/Program/index.html new file mode 100644 index 000000000..db9c4084c --- /dev/null +++ b/stanc/Middle/Program/index.html @@ -0,0 +1,89 @@ + +Program (stanc.Middle.Program)

Module Middle.Program

Defines the core of the MIR

type fun_arg_decl = (UnsizedType.autodifftype * string * UnsizedType.t) list
val map_fun_arg_decl : 'a -> 'a
val fun_arg_decl_of_sexp : Sexplib0.Sexp.t -> fun_arg_decl
val sexp_of_fun_arg_decl : fun_arg_decl -> Sexplib0.Sexp.t
val hash_fold_fun_arg_decl : + Ppx_hash_lib.Std.Hash.state -> + fun_arg_decl -> + Ppx_hash_lib.Std.Hash.state
val hash_fun_arg_decl : fun_arg_decl -> Ppx_hash_lib.Std.Hash.hash_value
type 'a fun_def = {
  1. fdrt : UnsizedType.returntype;
  2. fdname : string;
  3. fdsuffix : unit Fun_kind.suffix;
  4. fdargs : (UnsizedType.autodifftype * string * UnsizedType.t) list;
  5. fdbody : 'a option;
  6. fdloc : Location_span.t;
}
val map_fun_def : ('a -> 'b) -> 'a fun_def -> 'b fun_def
val fold_fun_def : ('a -> 'b -> 'a) -> 'a -> 'b fun_def -> 'a
val compare_fun_def : + 'a. ('a -> 'a -> Core__.Import.int) -> + 'a fun_def -> + 'a fun_def -> + Core__.Import.int
val hash_fold_fun_def : + 'a. (Ppx_hash_lib.Std.Hash.state -> 'a -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'a fun_def -> + Ppx_hash_lib.Std.Hash.state
val fun_def_of_sexp : + 'a. (Sexplib0.Sexp.t -> 'a) -> + Sexplib0.Sexp.t -> + 'a fun_def
val sexp_of_fun_def : + 'a. ('a -> Sexplib0.Sexp.t) -> + 'a fun_def -> + Sexplib0.Sexp.t
type io_block =
  1. | Parameters
  2. | TransformedParameters
  3. | GeneratedQuantities
val io_block_of_sexp : Sexplib0.Sexp.t -> io_block
val sexp_of_io_block : io_block -> Sexplib0.Sexp.t
val hash_fold_io_block : + Ppx_hash_lib.Std.Hash.state -> + io_block -> + Ppx_hash_lib.Std.Hash.state
val hash_io_block : io_block -> Ppx_hash_lib.Std.Hash.hash_value
type 'e outvar = {
  1. out_unconstrained_st : 'e SizedType.t;
  2. out_constrained_st : 'e SizedType.t;
  3. out_block : io_block;
  4. out_trans : 'e Transformation.t;
}
val map_outvar : ('e -> 'a) -> 'e outvar -> 'a outvar
val fold_outvar : ('a -> 'b -> 'a) -> 'a -> 'b outvar -> 'a
val outvar_of_sexp : + 'e. (Sexplib0.Sexp.t -> 'e) -> + Sexplib0.Sexp.t -> + 'e outvar
val sexp_of_outvar : + 'e. ('e -> Sexplib0.Sexp.t) -> + 'e outvar -> + Sexplib0.Sexp.t
val hash_fold_outvar : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e outvar -> + Ppx_hash_lib.Std.Hash.state
type ('a, 'b, 'm) t = {
  1. functions_block : 'b fun_def list;
  2. input_vars : (string * 'm * 'a SizedType.t) list;
  3. prepare_data : 'b list;
  4. log_prob : 'b list;
  5. reverse_mode_log_prob : 'b list;
  6. generate_quantities : 'b list;
  7. transform_inits : 'b list;
  8. unconstrain_array : 'b list;
  9. output_vars : (string * 'm * 'a outvar) list;
  10. prog_name : string;
  11. prog_path : string;
}
val map : + ('a -> 'c) -> + ('b -> 'd) -> + ('m -> 'e) -> + ('a, 'b, 'm) t -> + ('c, 'd, 'e) t
val fold : + ('a -> 'b -> 'a) -> + ('a -> 'c -> 'a) -> + ('a -> 'd -> 'a) -> + 'a -> + ('b, 'c, 'd) t -> + 'a
val t_of_sexp : + 'a 'b 'm. (Sexplib0.Sexp.t -> 'a) -> + (Sexplib0.Sexp.t -> 'b) -> + (Sexplib0.Sexp.t -> 'm) -> + Sexplib0.Sexp.t -> + ('a, 'b, 'm) t
val sexp_of_t : + 'a 'b 'm. ('a -> Sexplib0.Sexp.t) -> + ('b -> Sexplib0.Sexp.t) -> + ('m -> Sexplib0.Sexp.t) -> + ('a, 'b, 'm) t -> + Sexplib0.Sexp.t
val pp_fun_arg_decl : + Stdlib.Format.formatter -> + (UnsizedType.autodifftype * string * UnsizedType.t) -> + unit
val pp_fun_def : + (Stdlib.Format.formatter -> 'a -> unit) -> + Stdlib.Format.formatter -> + 'a fun_def -> + unit
val pp_io_block : Stdlib.Format.formatter -> io_block -> unit
val pp_block : string -> 'a Fmt.t -> Stdlib.Format.formatter -> 'a list -> unit
val pp_functions_block : 'a Fmt.t -> Stdlib.Format.formatter -> 'a list -> unit
val pp_prepare_data : 'a Fmt.t -> Stdlib.Format.formatter -> 'a list -> unit
val pp_log_prob : 'a Fmt.t -> Stdlib.Format.formatter -> 'a list -> unit
val pp_reverse_mode_log_prob : + 'a Fmt.t -> + Stdlib.Format.formatter -> + 'a list -> + unit
val pp_generate_quantities : + 'a Fmt.t -> + Stdlib.Format.formatter -> + 'a list -> + unit
val pp_transform_inits : 'a Fmt.t -> Stdlib.Format.formatter -> 'a list -> unit
val pp_output_var : + 'a Fmt.t -> + Stdlib.Format.formatter -> + (string * 'b * 'a outvar) -> + unit
val pp_input_var : + 'a Fmt.t -> + Stdlib.Format.formatter -> + (string * 'b * 'a SizedType.t) -> + unit
val pp_input_vars : + 'a Fmt.t -> + Stdlib.Format.formatter -> + (string * 'b * 'a SizedType.t) list -> + unit
val pp_output_vars : + 'a Fmt.t -> + Stdlib.Format.formatter -> + (string * 'b * 'a outvar) list -> + unit
val pp : + 'a Fmt.t -> + 'b Fmt.t -> + Stdlib.Format.formatter -> + ('a, 'b, 'c) t -> + unit
module Typed : sig ... end

Programs with typed expressions and locations

module Numbered : sig ... end
diff --git a/stanc/Middle/SizedType/index.html b/stanc/Middle/SizedType/index.html new file mode 100644 index 000000000..b1bac9e35 --- /dev/null +++ b/stanc/Middle/SizedType/index.html @@ -0,0 +1,14 @@ + +SizedType (stanc.Middle.SizedType)

Module Middle.SizedType

Types which have a concrete size associated, e.g. vector[n]

type 'a t =
  1. | SInt
  2. | SReal
  3. | SComplex
  4. | SVector of Mem_pattern.t * 'a
  5. | SRowVector of Mem_pattern.t * 'a
  6. | SMatrix of Mem_pattern.t * 'a * 'a
  7. | SComplexVector of 'a
  8. | SComplexRowVector of 'a
  9. | SComplexMatrix of 'a * 'a
  10. | SArray of 'a t * 'a
  11. | STuple of 'a t list
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val t_of_sexp : 'a. (Sexplib0.Sexp.t -> 'a) -> Sexplib0.Sexp.t -> 'a t
val sexp_of_t : 'a. ('a -> Sexplib0.Sexp.t) -> 'a t -> Sexplib0.Sexp.t
val compare : + 'a. ('a -> 'a -> Core__.Import.int) -> + 'a t -> + 'a t -> + Core__.Import.int
val hash_fold_t : + 'a. (Ppx_hash_lib.Std.Hash.state -> 'a -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'a t -> + Ppx_hash_lib.Std.Hash.state
val pp : 'a Fmt.t -> 'a t Fmt.t
val to_unsized : 'a t -> UnsizedType.t
val get_dims_io : + Expr.Typed.t t -> + Middle__Expr.Typed.Meta.t Middle__Expr.Fixed.t list

Get the dimensions with respect to sizes needed for IO. Note: The main difference from get_dims is complex, where this function treats the complex type as a dual number. Note: Tuples are treated as scalars by this function due to the inherent assumption of rectangularity. Carefully consider new usages and use io_size when possible.

val io_size : + Middle__Expr.Typed.Meta.t Middle__Expr.Fixed.t t -> + Middle__Expr.Typed.Meta.t Middle__Expr.Fixed.t
val get_dims : 'a t -> 'a list

Get the dimensions of an object. Note: Tuples are treated as scalars by this function due to the inherent assumption of rectangularity. Carefully consider new usages!

val is_recursive_container : 'a t -> bool

* Check whether a SizedType holds indexable SizedTypes.

val get_array_dims : 'a t -> 'a t * 'a list

Return a type's array dimensions and the type inside the (possibly nested) array

val get_scalar_and_dims : 'a t -> 'a t * 'a list

Return a type's dimensions and inner scalar. Differs from get_array_dims in that this also breaks down vectors or matrices, so a SVector d is returned as (SReal, [d]) rather than (SVector d, [])

val internal_scalar : 'a t -> 'a t
val contains_tuple : 'a t -> bool
val is_complex_type : 'a t -> bool
val get_mem_pattern : 'a t -> Mem_pattern.t

* Return the mem_pattern of the SizedType

val demote_sizedtype_mem : 'a t -> 'a t
val promote_sizedtype_mem : 'a t -> 'a t
val modify_sizedtype_mem : Mem_pattern.t -> 'a t -> 'a t
val has_mem_pattern : 'a t -> bool
val build_sarray : 'a list -> 'a t -> 'a t

The inverse of get_array_dims

val flatten_tuple_io : 'a t -> 'a t list
diff --git a/stanc/Middle/Stan_math_signatures/index.html b/stanc/Middle/Stan_math_signatures/index.html new file mode 100644 index 000000000..6508a8eb1 --- /dev/null +++ b/stanc/Middle/Stan_math_signatures/index.html @@ -0,0 +1,6 @@ + +Stan_math_signatures (stanc.Middle.Stan_math_signatures)

Module Middle.Stan_math_signatures

This module stores a table of all signatures from the Stan math C++ library which are exposed to Stan, and some helper functions for dealing with those signatures.

Function arguments are represented by their type an autodiff type. This is AutoDiffable for everything except arguments marked with the data keyword

type signature = UnsizedType.returntype * fun_arg list * Mem_pattern.t

Signatures consist of a return type, a list of arguments, and a flag for whether or not those arguments can be Struct of Arrays objects

val stan_math_signatures : (string, signature list) Core.Hashtbl.t

Mapping from names to signature(s) of functions

val is_stan_math_function_name : string -> bool

Equivalent to Hashtbl.mem stan_math_signatures s

type variadic_signature = {
  1. return_type : UnsizedType.t;
  2. control_args : fun_arg list;
  3. required_fn_rt : UnsizedType.t;
  4. required_fn_args : fun_arg list;
}
val stan_math_variadic_signatures : (string, variadic_signature) Core.Hashtbl.t

Mapping from names to description of a variadic function.

Note that these function names cannot be overloaded, and usually require customized code-gen in the backend.

val is_stan_math_variadic_function_name : string -> bool

Equivalent to Hashtbl.mem stan_math_variadic_signatures s

Pretty printers

val pp_math_sig : signature Fmt.t
val pretty_print_all_math_sigs : unit Fmt.t
val pretty_print_all_math_distributions : unit Fmt.t
type dimensionality
type return_behavior
type fkind = private
  1. | Lpmf
  2. | Lpdf
  3. | Rng
  4. | Cdf
  5. | Ccdf
  6. | UnaryVectorized of return_behavior
val pp_fkind : + Ppx_deriving_runtime.Format.formatter -> + fkind -> + Ppx_deriving_runtime.unit
val show_fkind : fkind -> Ppx_deriving_runtime.string
val distributions : + (fkind list * string * dimensionality list * Mem_pattern.t) list

The distribution families exposed by the math library

Helpers for dealing with operators as signatures

val operator_to_stan_math_fns : Operator.t -> string list
val string_operator_to_stan_math_fns : string -> string
val pretty_print_math_lib_operator_sigs : Operator.t -> string list
val make_assignmentoperator_stan_math_signatures : Operator.t -> signature list

Special functions for the variadic signatures exposed

val is_reduce_sum_fn : string -> bool
val reduce_sum_slice_types : UnsizedType.t list
diff --git a/stanc/Middle/Stmt/Fixed/Pattern/index.html b/stanc/Middle/Stmt/Fixed/Pattern/index.html new file mode 100644 index 000000000..9b7b02252 --- /dev/null +++ b/stanc/Middle/Stmt/Fixed/Pattern/index.html @@ -0,0 +1,63 @@ + +Pattern (stanc.Middle.Stmt.Fixed.Pattern)

Module Fixed.Pattern

type ('a, 'b) t =
  1. | Assignment of 'a lvalue * UnsizedType.t * 'a
  2. | TargetPE of 'a
  3. | JacobianPE of 'a
  4. | NRFunApp of 'a Fun_kind.t * 'a list
  5. | Break
  6. | Continue
  7. | Return of 'a option
  8. | Skip
  9. | IfElse of 'a * 'b * 'b option
  10. | While of 'a * 'b
  11. | For of {
    1. loopvar : string;
    2. lower : 'a;
    3. upper : 'a;
    4. body : 'b;
    }
  12. | Profile of string * 'b list
  13. | Block of 'b list
  14. | SList of 'b list
  15. | Decl of {
    1. decl_adtype : UnsizedType.autodifftype;
    2. decl_id : string;
    3. decl_type : 'a Type.t;
    4. initialize : 'a decl_init;
    }
and 'e lvalue = 'e lbase * 'e Index.t list
and 'e lbase =
  1. | LVariable of string
  2. | LTupleProjection of 'e lvalue * int
and 'a decl_init =
  1. | Uninit
  2. | Default
  3. | Assign of 'a
val sexp_of_lvalue : ('e -> Sexplib0.Sexp.t) -> 'e lvalue -> Sexplib0.Sexp.t
val sexp_of_lbase : ('e -> Sexplib0.Sexp.t) -> 'e lbase -> Sexplib0.Sexp.t
val sexp_of_decl_init : + ('a -> Sexplib0.Sexp.t) -> + 'a decl_init -> + Sexplib0.Sexp.t
val lvalue_of_sexp : (Sexplib0.Sexp.t -> 'e) -> Sexplib0.Sexp.t -> 'e lvalue
val lbase_of_sexp : (Sexplib0.Sexp.t -> 'e) -> Sexplib0.Sexp.t -> 'e lbase
val decl_init_of_sexp : + (Sexplib0.Sexp.t -> 'a) -> + Sexplib0.Sexp.t -> + 'a decl_init
val hash_fold_lvalue : + (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e lvalue -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_lbase : + (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e lbase -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_decl_init : + (Ppx_hash_lib.Std.Hash.state -> 'a -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'a decl_init -> + Ppx_hash_lib.Std.Hash.state
val compare_lvalue : ('e -> 'e -> int) -> 'e lvalue -> 'e lvalue -> int
val compare_lbase : ('e -> 'e -> int) -> 'e lbase -> 'e lbase -> int
val compare_decl_init : + ('a -> 'a -> int) -> + 'a decl_init -> + 'a decl_init -> + int
include Common.Pattern.S2 with type ('a, 'b) t := ('a, 'b) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Common.Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Common.Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
diff --git a/stanc/Middle/Stmt/Fixed/index.html b/stanc/Middle/Stmt/Fixed/index.html new file mode 100644 index 000000000..504c2adec --- /dev/null +++ b/stanc/Middle/Stmt/Fixed/index.html @@ -0,0 +1,59 @@ + +Fixed (stanc.Middle.Stmt.Fixed)

Module Stmt.Fixed

module Pattern : sig ... end
include Common.Fixed.S2 + with module First = Expr.Fixed + and module Pattern := Pattern
module First = Expr.Fixed
type ('a, 'b) t = {
  1. pattern : ('a First.t, ('a, 'b) t) Pattern.t;
  2. meta : 'b;
}
val map : ('a -> 'c) -> ('b -> 'd) -> ('a, 'b) t -> ('c, 'd) t
val fold : ('c -> 'a -> 'c) -> ('c -> 'b -> 'c) -> 'c -> ('a, 'b) t -> 'c
include Ppx_compare_lib.Comparable.S2 with type ('a, 'b) t := ('a, 'b) t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'b Base__Ppx_compare_lib.compare -> + ('a, 'b) t Base__Ppx_compare_lib.compare
include Ppx_hash_lib.Hashable.S2 with type ('a, 'b) t := ('a, 'b) t
val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'b Base__Ppx_hash_lib.hash_fold -> + ('a, 'b) t Base__Ppx_hash_lib.hash_fold
include Sexplib0.Sexpable.S2 with type ('a, 'b) t := ('a, 'b) t
val t_of_sexp : + (Sexplib0__.Sexp.t -> 'a) -> + (Sexplib0__.Sexp.t -> 'b) -> + Sexplib0__.Sexp.t -> + ('a, 'b) t
val sexp_of_t : + ('a -> Sexplib0__.Sexp.t) -> + ('b -> Sexplib0__.Sexp.t) -> + ('a, 'b) t -> + Sexplib0__.Sexp.t
include Common.Foldable.S2 with type ('a, 'b) t := ('a, 'b) t
val fold_left : + f:('c -> 'a -> 'c) -> + g:('c -> 'b -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val fold_right : + f:('a -> 'c -> 'c) -> + g:('b -> 'c -> 'c) -> + init:'c -> + ('a, 'b) t -> + 'c
val any : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
val all : + pred_first:('a -> bool) -> + pred_second:('b -> bool) -> + ?init:bool -> + ('a, 'b) t -> + bool
include Common.Pretty.S2 with type ('a, 'b) t := ('a, 'b) t
val pp : + (Stdlib.Format.formatter -> 'a -> unit) -> + (Stdlib.Format.formatter -> 'b -> unit) -> + Stdlib.Format.formatter -> + ('a, 'b) t -> + unit
val fold_pattern : + f:(('a * 'r1 First.Pattern.t) -> 'r1) -> + g:(('b * ('r1, 'r2) Pattern.t) -> 'r2) -> + ('a, 'b) t -> + 'r2

fold_pattern traverses the data structure from the bottom up replacing the original meta data of First with type 'a with some result type 'r1 and the meta data at this level withtype 'b to another result type 'r2 and combines the result values on the way back up.

val rewrite_bottom_up : + f:('a First.t -> 'a First.t) -> + g:(('a, 'b) t -> ('a, 'b) t) -> + ('a, 'b) t -> + ('a, 'b) t

rewrite_bottom_up specializes fold_pattern so that the result type 'r1 is equal to the type of the nested fixed-point type i.e. 'r1 = 'a First.t and the result type 'r2 is equal to the top-level fixed-point type i.e. 'r2 = ('a,'b) t.

This also means that the function f can be written with our nested fixed-point type 'a First.t as its argument and g can be written with ('a,'b) t as its argument.

val unfold_pattern : + f:('r1 -> 'a * 'r1 First.Pattern.t) -> + g:('r2 -> 'b * ('r1, 'r2) Pattern.t) -> + 'r2 -> + ('a, 'b) t

unfold_pattern takes a seed value of type 'r2 and uses the function g to generate a tuple of meta-data and a pattern with types 'r1 and 'r2. The functions proceeds by recursively applying g to the contained values of type 'r2 and f to values of type 'r1 finishing when the pattern contains no values of type 'r1 or 'r2.

val rewrite_top_down : + f:('a First.t -> 'a First.t) -> + g:(('a, 'b) t -> ('a, 'b) t) -> + ('a, 'b) t -> + ('a, 'b) t

rewrite_top_down specializes unfold_pattern in a manner analogous to how rewrite_bottom_up specializes fold_pattern

diff --git a/stanc/Middle/Stmt/Helpers/index.html b/stanc/Middle/Stmt/Helpers/index.html new file mode 100644 index 000000000..5c0a58b4f --- /dev/null +++ b/stanc/Middle/Stmt/Helpers/index.html @@ -0,0 +1,59 @@ + +Helpers (stanc.Middle.Stmt.Helpers)

Module Stmt.Helpers

val temp_vars : + Expr.Typed.t list -> + Located.t list * Expr.Typed.t list * (unit -> unit)
val ensure_var : + (Expr.Typed.t -> 'a -> Located.t) -> + Expr.Typed.t -> + 'a -> + Located.t
val internal_nrfunapp : + 'a Fixed.First.t Internal_fun.t -> + 'a Fixed.First.t list -> + 'b -> + ('a, 'b) Fixed.t
val contains_fn_kind : + ('a Fixed.First.t Fun_kind.t -> bool) -> + ?init:bool -> + ('a, 'b) Fixed.t -> + bool
val mk_for : + Expr.Typed.t -> + (Expr.Typed.t -> Located.t) -> + Location_span.t -> + Located.t
val mk_nested_for : + Expr.Typed.t list -> + (Expr.Typed.t list -> Located.t) -> + Location_span.t -> + Located.t
val mk_for_iteratee : + Expr.Typed.t -> + (Expr.Typed.t -> Located.t) -> + Expr.Typed.t -> + Location_span.t -> + Located.t
val for_each : + (Expr.Typed.t -> Located.t) -> + Expr.Typed.t -> + Location_span.t -> + Located.t
val assign_indexed : + UnsizedType.t -> + 'b Fixed.First.t Fixed.Pattern.lvalue -> + 'a -> + ('b Expr.Fixed.t -> 'b Expr.Fixed.t) -> + 'b Expr.Fixed.t -> + ('b, 'a) Fixed.t
val get_lhs_name : 'a Fixed.Pattern.lvalue -> string

The name of the lhs. This adds "." and an index to tuple projections

val lvariable : string -> 'e Fixed.Pattern.lvalue
val lvalue_of_expr_opt : + 'e Expr.Fixed.t -> + 'e Expr.Fixed.t Fixed.Pattern.lvalue option
val expr_of_lvalue : + 'e Expr.Fixed.t Fixed.Pattern.lvalue -> + meta:'e -> + 'e Expr.Fixed.t
val map_lhs_variable : + f:(string -> string) -> + 'e Fixed.Pattern.lvalue -> + 'e Fixed.Pattern.lvalue
val lhs_indices : 'e Fixed.Pattern.lvalue -> 'e Index.t list
val lhs_variable : 'e Fixed.Pattern.lvalue -> string

This gets the innermost name of the variable. It differs from get_lhs_name in that tuple projections do not add their indices here.

val lvalue_base_reference : 'e Fixed.Pattern.lvalue -> 'e Fixed.Pattern.lvalue

Reduce an lvalue down to its "base reference", which is a variable with maximum tuple indices after it. For example:

x[1,2][3] -> x
+x.1[1,2].2[3].3 -> x.1
+x.1.2[1,2][3].3 -> x.1.2
diff --git a/stanc/Middle/Stmt/Located/Map/Key/index.html b/stanc/Middle/Stmt/Located/Map/Key/index.html new file mode 100644 index 000000000..58dd43788 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Located.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Stmt/Located/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Middle/Stmt/Located/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..924361709 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Located.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Stmt/Located/Map/Provide_bin_io/index.html b/stanc/Middle/Stmt/Located/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..331b0dce1 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Stmt.Located.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Middle/Stmt/Located/Map/Provide_hash/argument-1-Key/index.html b/stanc/Middle/Stmt/Located/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..723fc7292 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Located.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Middle/Stmt/Located/Map/Provide_hash/index.html b/stanc/Middle/Stmt/Located/Map/Provide_hash/index.html new file mode 100644 index 000000000..be87ebf09 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Middle.Stmt.Located.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Middle/Stmt/Located/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Middle/Stmt/Located/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..37f9211c8 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Located.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Middle/Stmt/Located/Map/Provide_of_sexp/index.html b/stanc/Middle/Stmt/Located/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..f267e42ec --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Stmt.Located.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Middle/Stmt/Located/Map/index.html b/stanc/Middle/Stmt/Located/Map/index.html new file mode 100644 index 000000000..9a46e4bae --- /dev/null +++ b/stanc/Middle/Stmt/Located/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Middle.Stmt.Located.Map)

Module Located.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Stmt/Located/Meta/index.html b/stanc/Middle/Stmt/Located/Meta/index.html new file mode 100644 index 000000000..8d486157c --- /dev/null +++ b/stanc/Middle/Stmt/Located/Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Middle.Stmt.Located.Meta)

Module Located.Meta

include Ppx_compare_lib.Comparable.S with type t := t
include Sexplib0.Sexpable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
include Common.Specialized.Meta with type t := t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Common.Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
diff --git a/stanc/Middle/Stmt/Located/Non_recursive/index.html b/stanc/Middle/Stmt/Located/Non_recursive/index.html new file mode 100644 index 000000000..39e1ac263 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Non_recursive/index.html @@ -0,0 +1,2 @@ + +Non_recursive (stanc.Middle.Stmt.Located.Non_recursive)

Module Located.Non_recursive

type t = {
  1. pattern : (Expr.Typed.t, int) Fixed.Pattern.t;
  2. meta : Meta.t;
}
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Middle/Stmt/Located/Replace_polymorphic_compare/index.html b/stanc/Middle/Stmt/Located/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..9710c6b26 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Middle.Stmt.Located.Replace_polymorphic_compare)

Module Located.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Middle/Stmt/Located/Set/Elt/index.html b/stanc/Middle/Stmt/Located/Set/Elt/index.html new file mode 100644 index 000000000..249ebb496 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Located.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Stmt/Located/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Middle/Stmt/Located/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..0e699a693 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Located.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Stmt/Located/Set/Provide_bin_io/index.html b/stanc/Middle/Stmt/Located/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..61d055eb1 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Stmt.Located.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Stmt/Located/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Middle/Stmt/Located/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..59ea3a549 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Located.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Middle/Stmt/Located/Set/Provide_hash/index.html b/stanc/Middle/Stmt/Located/Set/Provide_hash/index.html new file mode 100644 index 000000000..44ddb8c13 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Middle.Stmt.Located.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Middle/Stmt/Located/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Middle/Stmt/Located/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..473a92ae1 --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Located.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Middle/Stmt/Located/Set/Provide_of_sexp/index.html b/stanc/Middle/Stmt/Located/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..8a1e0f01f --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Stmt.Located.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Middle/Stmt/Located/Set/index.html b/stanc/Middle/Stmt/Located/Set/index.html new file mode 100644 index 000000000..f9d480b0f --- /dev/null +++ b/stanc/Middle/Stmt/Located/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Middle.Stmt.Located.Set)

Module Located.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Stmt/Located/index.html b/stanc/Middle/Stmt/Located/index.html new file mode 100644 index 000000000..7a833ddcd --- /dev/null +++ b/stanc/Middle/Stmt/Located/index.html @@ -0,0 +1,9 @@ + +Located (stanc.Middle.Stmt.Located)

Module Stmt.Located

module Meta : sig ... end
include Common.Specialized.S + with module Meta := Meta + and type t = (Expr.Typed.Meta.t, Meta.t) Fixed.t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Common.Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
val loc_of : t -> Location_span.t
module Non_recursive : sig ... end
diff --git a/stanc/Middle/Stmt/Numbered/Map/Key/index.html b/stanc/Middle/Stmt/Numbered/Map/Key/index.html new file mode 100644 index 000000000..26a251073 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Numbered.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..9a586359d --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Numbered.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/index.html b/stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..7a86ebab5 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Stmt.Numbered.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Middle/Stmt/Numbered/Map/Provide_hash/argument-1-Key/index.html b/stanc/Middle/Stmt/Numbered/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..cc40d5dc3 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Numbered.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Middle/Stmt/Numbered/Map/Provide_hash/index.html b/stanc/Middle/Stmt/Numbered/Map/Provide_hash/index.html new file mode 100644 index 000000000..92dced0eb --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Middle.Stmt.Numbered.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..44d888f76 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.Stmt.Numbered.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/index.html b/stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..73a9f32ea --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Stmt.Numbered.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Middle/Stmt/Numbered/Map/index.html b/stanc/Middle/Stmt/Numbered/Map/index.html new file mode 100644 index 000000000..c8bd3a031 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Middle.Stmt.Numbered.Map)

Module Numbered.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Stmt/Numbered/Meta/index.html b/stanc/Middle/Stmt/Numbered/Meta/index.html new file mode 100644 index 000000000..8394920ab --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Meta/index.html @@ -0,0 +1,2 @@ + +Meta (stanc.Middle.Stmt.Numbered.Meta)

Module Numbered.Meta

type t = int
include Ppx_compare_lib.Comparable.S with type t := t
include Sexplib0.Sexpable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
include Common.Specialized.Meta with type t := t
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Common.Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
val empty : t
val from_int : int -> t
diff --git a/stanc/Middle/Stmt/Numbered/Replace_polymorphic_compare/index.html b/stanc/Middle/Stmt/Numbered/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..42daf8205 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Middle.Stmt.Numbered.Replace_polymorphic_compare)

Module Numbered.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Middle/Stmt/Numbered/Set/Elt/index.html b/stanc/Middle/Stmt/Numbered/Set/Elt/index.html new file mode 100644 index 000000000..393a34754 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Numbered.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..a0363dacc --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Numbered.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/index.html b/stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..2d1827dd7 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.Stmt.Numbered.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/Stmt/Numbered/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Middle/Stmt/Numbered/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..256a9e183 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Numbered.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Middle/Stmt/Numbered/Set/Provide_hash/index.html b/stanc/Middle/Stmt/Numbered/Set/Provide_hash/index.html new file mode 100644 index 000000000..94bc38137 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Middle.Stmt.Numbered.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..e33a80f01 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.Stmt.Numbered.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/index.html b/stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..27429f969 --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.Stmt.Numbered.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Middle/Stmt/Numbered/Set/index.html b/stanc/Middle/Stmt/Numbered/Set/index.html new file mode 100644 index 000000000..d0a4b45cc --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Middle.Stmt.Numbered.Set)

Module Numbered.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/Stmt/Numbered/index.html b/stanc/Middle/Stmt/Numbered/index.html new file mode 100644 index 000000000..ad10ba20c --- /dev/null +++ b/stanc/Middle/Stmt/Numbered/index.html @@ -0,0 +1,9 @@ + +Numbered (stanc.Middle.Stmt.Numbered)

Module Stmt.Numbered

module Meta : sig ... end
include Common.Specialized.S + with module Meta := Meta + and type t = (Expr.Typed.Meta.t, Meta.t) Fixed.t
include Ppx_compare_lib.Comparable.S with type t := t
include Ppx_hash_lib.Hashable.S with type t := t
val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
include Sexplib0.Sexpable.S with type t := t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
include Common.Pretty.S with type t := t
val pp : Stdlib.Format.formatter -> t -> unit
include Core.Comparator.S with type t := t
type comparator_witness
include Core.Comparable.S + with type t := t + and type comparator_witness := comparator_witness
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Middle/Stmt/index.html b/stanc/Middle/Stmt/index.html new file mode 100644 index 000000000..04245d9e3 --- /dev/null +++ b/stanc/Middle/Stmt/index.html @@ -0,0 +1,2 @@ + +Stmt (stanc.Middle.Stmt)

Module Middle.Stmt

MIR types and modules corresponding to the statements of the language

module Fixed : sig ... end
module Located : sig ... end
module Numbered : sig ... end
module Helpers : sig ... end
diff --git a/stanc/Middle/Transformation/index.html b/stanc/Middle/Transformation/index.html new file mode 100644 index 000000000..8a2c0b456 --- /dev/null +++ b/stanc/Middle/Transformation/index.html @@ -0,0 +1,10 @@ + +Transformation (stanc.Middle.Transformation)

Module Middle.Transformation

Transformations (constraints) for global variable declarations

type 'e t =
  1. | Identity
  2. | Lower of 'e
  3. | Upper of 'e
  4. | LowerUpper of 'e * 'e
  5. | Offset of 'e
  6. | Multiplier of 'e
  7. | OffsetMultiplier of 'e * 'e
  8. | Ordered
  9. | PositiveOrdered
  10. | Simplex
  11. | UnitVector
  12. | SumToZero
  13. | CholeskyCorr
  14. | CholeskyCov
  15. | Correlation
  16. | Covariance
  17. | StochasticRow
  18. | StochasticColumn
  19. | TupleTransformation of 'e t list

Types of transformations. Polymorphic type is filled in with an expression fixed-point, e.g. Frontend.Ast.typed_expression

val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val t_of_sexp : 'e. (Sexplib0.Sexp.t -> 'e) -> Sexplib0.Sexp.t -> 'e t
val sexp_of_t : 'e. ('e -> Sexplib0.Sexp.t) -> 'e t -> Sexplib0.Sexp.t
val compare : + 'e. ('e -> 'e -> Core__.Import.int) -> + 'e t -> + 'e t -> + Core__.Import.int
val hash_fold_t : + 'e. (Ppx_hash_lib.Std.Hash.state -> 'e -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'e t -> + Ppx_hash_lib.Std.Hash.state
val has_check : 'a t -> bool
diff --git a/stanc/Middle/Type/index.html b/stanc/Middle/Type/index.html new file mode 100644 index 000000000..63110bd35 --- /dev/null +++ b/stanc/Middle/Type/index.html @@ -0,0 +1,10 @@ + +Type (stanc.Middle.Type)

Module Middle.Type

A type which unifies SizedTypes and UnsizedTypes for declarations

type 'a t =
  1. | Sized of 'a SizedType.t
  2. | Unsized of UnsizedType.t
val map : ('a -> 'b) -> 'a t -> 'b t
val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val t_of_sexp : 'a. (Sexplib0.Sexp.t -> 'a) -> Sexplib0.Sexp.t -> 'a t
val sexp_of_t : 'a. ('a -> Sexplib0.Sexp.t) -> 'a t -> Sexplib0.Sexp.t
val compare : + 'a. ('a -> 'a -> Core__.Import.int) -> + 'a t -> + 'a t -> + Core__.Import.int
val hash_fold_t : + 'a. (Ppx_hash_lib.Std.Hash.state -> 'a -> Ppx_hash_lib.Std.Hash.state) -> + Ppx_hash_lib.Std.Hash.state -> + 'a t -> + Ppx_hash_lib.Std.Hash.state
val pp : 'a Fmt.t -> Stdlib.Format.formatter -> 'a t -> unit
val to_unsized : 'a t -> UnsizedType.t
diff --git a/stanc/Middle/UnsizedType/Comparator/index.html b/stanc/Middle/UnsizedType/Comparator/index.html new file mode 100644 index 000000000..d5e0cfc69 --- /dev/null +++ b/stanc/Middle/UnsizedType/Comparator/index.html @@ -0,0 +1,2 @@ + +Comparator (stanc.Middle.UnsizedType.Comparator)

Module UnsizedType.Comparator

type comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/UnsizedType/Map/Key/index.html b/stanc/Middle/UnsizedType/Map/Key/index.html new file mode 100644 index 000000000..76cb13206 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.UnsizedType.Map.Key)

Module Map.Key

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = Comparator.comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/UnsizedType/Map/Provide_bin_io/argument-1-Key/index.html b/stanc/Middle/UnsizedType/Map/Provide_bin_io/argument-1-Key/index.html new file mode 100644 index 000000000..99d728ee8 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Provide_bin_io/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.UnsizedType.Map.Provide_bin_io.Key)

Parameter Provide_bin_io.Key

val bin_size_t : Key.t Bin_prot__.Size.sizer
val bin_write_t : Key.t Bin_prot__.Write.writer
val bin_read_t : Key.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Key.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Key.t Bin_prot__.Type_class.writer
val bin_reader_t : Key.t Bin_prot__.Type_class.reader
val bin_t : Key.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/UnsizedType/Map/Provide_bin_io/index.html b/stanc/Middle/UnsizedType/Map/Provide_bin_io/index.html new file mode 100644 index 000000000..15df784cc --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.UnsizedType.Map.Provide_bin_io)

Module Map.Provide_bin_io

Parameters

module Key : sig ... end

Signature

val bin_shape_t : Bin_prot__.Shape.t -> Bin_prot__.Shape.t
val bin_size_t : ('a, 'a t) Bin_prot__.Size.sizer1
val bin_write_t : ('a, 'a t) Bin_prot__.Write.writer1
val bin_read_t : ('a, 'a t) Bin_prot__.Read.reader1
val __bin_read_t__ : ('a, int -> 'a t) Bin_prot__.Read.reader1
val bin_writer_t : ('a, 'a t) Bin_prot__.Type_class.S1.writer
val bin_reader_t : ('a, 'a t) Bin_prot__.Type_class.S1.reader
val bin_t : ('a, 'a t) Bin_prot__.Type_class.S1.t
diff --git a/stanc/Middle/UnsizedType/Map/Provide_hash/argument-1-Key/index.html b/stanc/Middle/UnsizedType/Map/Provide_hash/argument-1-Key/index.html new file mode 100644 index 000000000..96bad2448 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Provide_hash/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.UnsizedType.Map.Provide_hash.Key)

Parameter Provide_hash.Key

val hash_fold_t : Base__.Hash.state -> Key.t -> Base__.Hash.state
diff --git a/stanc/Middle/UnsizedType/Map/Provide_hash/index.html b/stanc/Middle/UnsizedType/Map/Provide_hash/index.html new file mode 100644 index 000000000..00ea58901 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Provide_hash/index.html @@ -0,0 +1,4 @@ + +Provide_hash (stanc.Middle.UnsizedType.Map.Provide_hash)

Module Map.Provide_hash

Parameters

module Key : sig ... end

Signature

val hash_fold_t : + 'a Base__Ppx_hash_lib.hash_fold -> + 'a t Base__Ppx_hash_lib.hash_fold
diff --git a/stanc/Middle/UnsizedType/Map/Provide_of_sexp/argument-1-Key/index.html b/stanc/Middle/UnsizedType/Map/Provide_of_sexp/argument-1-Key/index.html new file mode 100644 index 000000000..68114dd37 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Provide_of_sexp/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (stanc.Middle.UnsizedType.Map.Provide_of_sexp.Key)

Parameter Provide_of_sexp.Key

val t_of_sexp : Sexplib0.Sexp.t -> Key.t
diff --git a/stanc/Middle/UnsizedType/Map/Provide_of_sexp/index.html b/stanc/Middle/UnsizedType/Map/Provide_of_sexp/index.html new file mode 100644 index 000000000..d2f7bd0f6 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.UnsizedType.Map.Provide_of_sexp)

Module Map.Provide_of_sexp

Parameters

module Key : sig ... end

Signature

val t_of_sexp : (Sexplib0.Sexp.t -> 'a__002_) -> Sexplib0.Sexp.t -> 'a__002_ t
diff --git a/stanc/Middle/UnsizedType/Map/index.html b/stanc/Middle/UnsizedType/Map/index.html new file mode 100644 index 000000000..8c9b520c7 --- /dev/null +++ b/stanc/Middle/UnsizedType/Map/index.html @@ -0,0 +1,96 @@ + +Map (stanc.Middle.UnsizedType.Map)

Module UnsizedType.Map

module Key : sig ... end
type !'a t = (Key.t, 'a, Key.comparator_witness) Core__Map_intf.Map.t
val compare : + 'a Base__Ppx_compare_lib.compare -> + 'a t Base__Ppx_compare_lib.compare
val equal : 'a Base__Ppx_compare_lib.equal -> 'a t Base__Ppx_compare_lib.equal
val empty : ('k, 'cmp, 'a t) Core__Map_intf.Without_comparator.t
val singleton : + ('k, 'cmp, Key.t -> 'v -> 'v t) Core__Map_intf.Without_comparator.t
val map_keys : + ('k2, + 'cmp2, + 'v t -> + f:(Key.t -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val map_keys_exn : + ('k2, 'cmp2, 'v t -> f:(Key.t -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val transpose_keys : + ('k1, + 'cmp1, + ('k2, 'cmp2, 'a t t -> 'a t t) Core__Map_intf.Without_comparator.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array : + ('k, 'cmp, (Key.t * 'v) array -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('k, 'cmp, (Key.t * 'v) array -> 'v t) Core__Map_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('k, 'cmp, len:int -> f:(int -> Key.t * 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_alist : + ('k, 'cmp, (Key.t * 'v) list -> [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_alist_or_error : + ('k, 'cmp, (Key.t * 'v) list -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_alist_exn : + ('k, 'cmp, (Key.t * 'v) list -> 'v t) Core__Map_intf.Without_comparator.t
val of_alist_multi : + ('k, 'cmp, (Key.t * 'v) list -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_alist_fold : + ('k, 'cmp, (Key.t * 'v1) list -> init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> 'v2 t) + Core__Map_intf.Without_comparator.t
val of_alist_reduce : + ('k, 'cmp, (Key.t * 'v) list -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_increasing_sequence : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence : + ('k, + 'cmp, + (Key.t * 'v) Base__.Sequence.t -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_sequence_or_error : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_sequence_exn : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_sequence_multi : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_sequence_fold : + ('k, + 'cmp, + (Key.t * 'v1) Base__.Sequence.t -> + init:'v2 -> + f:('v2 -> 'v1 -> 'v2) -> + 'v2 t) + Core__Map_intf.Without_comparator.t
val of_sequence_reduce : + ('k, 'cmp, (Key.t * 'v) Base__.Sequence.t -> f:('v -> 'v -> 'v) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key : + ('k, + 'cmp, + 'v list -> + get_key:('v -> Key.t) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_list_with_key_or_error : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t Base__.Or_error.t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_exn : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_list_with_key_multi : + ('k, 'cmp, 'v list -> get_key:('v -> Key.t) -> 'v list t) + Core__Map_intf.Without_comparator.t
val of_iteri : + ('k, + 'cmp, + iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> + [ `Duplicate_key of Key.t | `Ok of 'v t ]) + Core__Map_intf.Without_comparator.t
val of_iteri_exn : + ('k, 'cmp, iteri:(f:(key:Key.t -> data:'v -> unit) -> unit) -> 'v t) + Core__Map_intf.Without_comparator.t
val of_tree : + ('k, 'cmp, (Key.t, 'v, Key.comparator_witness) Core__Map_intf.Tree.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_hashtbl_exn : + ('k, 'cmp, (Key.t, 'v) Core__.Hashtbl.t -> 'v t) + Core__Map_intf.Without_comparator.t
val of_key_set : + (Key.t, Key.comparator_witness) Base.Set.t -> + f:(Key.t -> 'v) -> + 'v t
val quickcheck_generator : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Generator.t -> + 'v Core__.Quickcheck.Generator.t -> + 'v t Core__.Quickcheck.Generator.t) + Core__Map_intf.Without_comparator.t
val map : 'a t -> f:('a -> 'b) -> 'b t
module Provide_of_sexp (Key : sig ... end) : sig ... end
module Provide_bin_io (Key : sig ... end) : sig ... end
module Provide_hash (Key : sig ... end) : sig ... end
val quickcheck_observer : + Key.t Core__.Quickcheck.Observer.t -> + 'v Core__.Quickcheck.Observer.t -> + 'v t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + ('k, + 'cmp, + Key.t Core__.Quickcheck.Shrinker.t -> + 'v Core__.Quickcheck.Shrinker.t -> + 'v t Core__.Quickcheck.Shrinker.t) + Core__Map_intf.Without_comparator.t
val t_of_sexp : (Sexplib0__.Sexp.t -> 'a) -> Sexplib0__.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0__.Sexp.t) -> 'a t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/UnsizedType/Replace_polymorphic_compare/index.html b/stanc/Middle/UnsizedType/Replace_polymorphic_compare/index.html new file mode 100644 index 000000000..4f68b4e78 --- /dev/null +++ b/stanc/Middle/UnsizedType/Replace_polymorphic_compare/index.html @@ -0,0 +1,2 @@ + +Replace_polymorphic_compare (stanc.Middle.UnsizedType.Replace_polymorphic_compare)

Module UnsizedType.Replace_polymorphic_compare

val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
diff --git a/stanc/Middle/UnsizedType/Set/Elt/index.html b/stanc/Middle/UnsizedType/Set/Elt/index.html new file mode 100644 index 000000000..70fe067d2 --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.UnsizedType.Set.Elt)

Module Set.Elt

type t = t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
type comparator_witness = Comparator.comparator_witness
val comparator : (t, comparator_witness) Core__Comparator.comparator
diff --git a/stanc/Middle/UnsizedType/Set/Provide_bin_io/argument-1-Elt/index.html b/stanc/Middle/UnsizedType/Set/Provide_bin_io/argument-1-Elt/index.html new file mode 100644 index 000000000..ec5e06fd2 --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Provide_bin_io/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.UnsizedType.Set.Provide_bin_io.Elt)

Parameter Provide_bin_io.Elt

val bin_size_t : Elt.t Bin_prot__.Size.sizer
val bin_write_t : Elt.t Bin_prot__.Write.writer
val bin_read_t : Elt.t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> Elt.t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : Elt.t Bin_prot__.Type_class.writer
val bin_reader_t : Elt.t Bin_prot__.Type_class.reader
val bin_t : Elt.t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/UnsizedType/Set/Provide_bin_io/index.html b/stanc/Middle/UnsizedType/Set/Provide_bin_io/index.html new file mode 100644 index 000000000..c90371cec --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Provide_bin_io/index.html @@ -0,0 +1,2 @@ + +Provide_bin_io (stanc.Middle.UnsizedType.Set.Provide_bin_io)

Module Set.Provide_bin_io

Parameters

module Elt : sig ... end

Signature

val bin_size_t : t Bin_prot__.Size.sizer
val bin_write_t : t Bin_prot__.Write.writer
val bin_read_t : t Bin_prot__.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot__.Read.reader
val bin_shape_t : Bin_prot__.Shape.t
val bin_writer_t : t Bin_prot__.Type_class.writer
val bin_reader_t : t Bin_prot__.Type_class.reader
val bin_t : t Bin_prot__.Type_class.t
diff --git a/stanc/Middle/UnsizedType/Set/Provide_hash/argument-1-Elt/index.html b/stanc/Middle/UnsizedType/Set/Provide_hash/argument-1-Elt/index.html new file mode 100644 index 000000000..b4c8f45d2 --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Provide_hash/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.UnsizedType.Set.Provide_hash.Elt)

Parameter Provide_hash.Elt

val hash_fold_t : Base__.Hash.state -> Elt.t -> Base__.Hash.state
diff --git a/stanc/Middle/UnsizedType/Set/Provide_hash/index.html b/stanc/Middle/UnsizedType/Set/Provide_hash/index.html new file mode 100644 index 000000000..515efde1e --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Provide_hash/index.html @@ -0,0 +1,2 @@ + +Provide_hash (stanc.Middle.UnsizedType.Set.Provide_hash)

Module Set.Provide_hash

Parameters

module Elt : sig ... end

Signature

val hash_fold_t : t Base__Ppx_hash_lib.hash_fold
val hash : t -> Base__Ppx_hash_lib.Std.Hash.hash_value
diff --git a/stanc/Middle/UnsizedType/Set/Provide_of_sexp/argument-1-Elt/index.html b/stanc/Middle/UnsizedType/Set/Provide_of_sexp/argument-1-Elt/index.html new file mode 100644 index 000000000..a6cfacd79 --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Provide_of_sexp/argument-1-Elt/index.html @@ -0,0 +1,2 @@ + +Elt (stanc.Middle.UnsizedType.Set.Provide_of_sexp.Elt)

Parameter Provide_of_sexp.Elt

val t_of_sexp : Sexplib0.Sexp.t -> Elt.t
diff --git a/stanc/Middle/UnsizedType/Set/Provide_of_sexp/index.html b/stanc/Middle/UnsizedType/Set/Provide_of_sexp/index.html new file mode 100644 index 000000000..9c83407dd --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/Provide_of_sexp/index.html @@ -0,0 +1,2 @@ + +Provide_of_sexp (stanc.Middle.UnsizedType.Set.Provide_of_sexp)

Module Set.Provide_of_sexp

Parameters

module Elt : sig ... end

Signature

val t_of_sexp : Sexplib0.Sexp.t -> t
diff --git a/stanc/Middle/UnsizedType/Set/index.html b/stanc/Middle/UnsizedType/Set/index.html new file mode 100644 index 000000000..2df4b998c --- /dev/null +++ b/stanc/Middle/UnsizedType/Set/index.html @@ -0,0 +1,27 @@ + +Set (stanc.Middle.UnsizedType.Set)

Module UnsizedType.Set

module Elt : sig ... end
type t = (Elt.t, Elt.comparator_witness) Base.Set.t
val compare : t Base__Ppx_compare_lib.compare
val equal : t Base__Ppx_compare_lib.equal
val empty : ('a, 'cmp, t) Core__Set_intf.Without_comparator.t
val singleton : ('a, 'cmp, Elt.t -> t) Core__Set_intf.Without_comparator.t
val union_list : ('a, 'cmp, t list -> t) Core__Set_intf.Without_comparator.t
val of_list : ('a, 'cmp, Elt.t list -> t) Core__Set_intf.Without_comparator.t
val of_sequence : + ('a, 'cmp, Elt.t Base__.Sequence.t -> t) Core__Set_intf.Without_comparator.t
val of_array : ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_sorted_array : + ('a, 'cmp, Elt.t array -> t Base__.Or_error.t) + Core__Set_intf.Without_comparator.t
val of_sorted_array_unchecked : + ('a, 'cmp, Elt.t array -> t) Core__Set_intf.Without_comparator.t
val of_increasing_iterator_unchecked : + ('a, 'cmp, len:int -> f:(int -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val stable_dedup_list : + ('a, 'b, Elt.t list -> Elt.t list) Core__Set_intf.Without_comparator.t
val map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t) -> t) + Core__Set_intf.Without_comparator.t
val filter_map : + ('b, 'cmp, ('a, 'c) Core__Set_intf.Set.t -> f:('a -> Elt.t option) -> t) + Core__Set_intf.Without_comparator.t
val of_tree : + ('a, 'cmp, (Elt.t, Elt.comparator_witness) Core__Set_intf.Tree.t -> t) + Core__Set_intf.Without_comparator.t
val of_hash_set : + ('a, 'cmp, Elt.t Core__.Hash_set.t -> t) Core__Set_intf.Without_comparator.t
val of_hashtbl_keys : + ('a, 'cmp, (Elt.t, 'b) Core__.Hashtbl.t -> t) + Core__Set_intf.Without_comparator.t
val of_map_keys : (Elt.t, 'a, Elt.comparator_witness) Base.Map.t -> t
val quickcheck_generator : + ('a, + 'cmp, + Elt.t Core__.Quickcheck.Generator.t -> + t Core__.Quickcheck.Generator.t) + Core__Set_intf.Without_comparator.t
module Provide_of_sexp (Elt : sig ... end) : sig ... end
module Provide_bin_io (Elt : sig ... end) : sig ... end
module Provide_hash (Elt : sig ... end) : sig ... end
val quickcheck_observer : + Elt.t Core__.Quickcheck.Observer.t -> + t Core__.Quickcheck.Observer.t
val quickcheck_shrinker : + Elt.t Core__.Quickcheck.Shrinker.t -> + t Core__.Quickcheck.Shrinker.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
diff --git a/stanc/Middle/UnsizedType/index.html b/stanc/Middle/UnsizedType/index.html new file mode 100644 index 000000000..dbb47e4e2 --- /dev/null +++ b/stanc/Middle/UnsizedType/index.html @@ -0,0 +1,17 @@ + +UnsizedType (stanc.Middle.UnsizedType)

Module Middle.UnsizedType

Types which have dimensionalities but not sizes, e.g. array[,,]

type t =
  1. | UInt
  2. | UReal
  3. | UVector
  4. | UComplex
  5. | URowVector
  6. | UMatrix
  7. | UComplexVector
  8. | UComplexRowVector
  9. | UComplexMatrix
  10. | UArray of t
  11. | UTuple of t list
  12. | UFun of argumentlist * returntype * bool Fun_kind.suffix * Mem_pattern.t
  13. | UMathLibraryFunction
and autodifftype =
  1. | DataOnly
  2. | AutoDiffable
  3. | TupleAD of autodifftype list
and argumentlist = (autodifftype * t) list
and returntype =
  1. | Void
  2. | ReturnType of t
val compare_autodifftype : autodifftype -> autodifftype -> Core__.Import.int
val compare_argumentlist : argumentlist -> argumentlist -> Core__.Import.int
val compare_returntype : returntype -> returntype -> Core__.Import.int
val hash_fold_t : + Ppx_hash_lib.Std.Hash.state -> + t -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_autodifftype : + Ppx_hash_lib.Std.Hash.state -> + autodifftype -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_argumentlist : + Ppx_hash_lib.Std.Hash.state -> + argumentlist -> + Ppx_hash_lib.Std.Hash.state
val hash_fold_returntype : + Ppx_hash_lib.Std.Hash.state -> + returntype -> + Ppx_hash_lib.Std.Hash.state
val hash : t -> Ppx_hash_lib.Std.Hash.hash_value
val hash_autodifftype : autodifftype -> Ppx_hash_lib.Std.Hash.hash_value
val hash_argumentlist : argumentlist -> Ppx_hash_lib.Std.Hash.hash_value
val hash_returntype : returntype -> Ppx_hash_lib.Std.Hash.hash_value
val t_of_sexp : Sexplib0.Sexp.t -> t
val autodifftype_of_sexp : Sexplib0.Sexp.t -> autodifftype
val argumentlist_of_sexp : Sexplib0.Sexp.t -> argumentlist
val returntype_of_sexp : Sexplib0.Sexp.t -> returntype
val sexp_of_t : t -> Sexplib0.Sexp.t
val sexp_of_autodifftype : autodifftype -> Sexplib0.Sexp.t
val sexp_of_argumentlist : argumentlist -> Sexplib0.Sexp.t
val sexp_of_returntype : returntype -> Sexplib0.Sexp.t
val equal_autodifftype : autodifftype -> autodifftype -> Core__.Import.bool
val equal_argumentlist : argumentlist -> argumentlist -> bool
val equal_returntype : returntype -> returntype -> bool
val pp_tuple_autodifftype : autodifftype Fmt.t
val returntype_to_type_opt : returntype -> t option
val pp_autodifftype : Stdlib.Format.formatter -> autodifftype -> unit
val count_dims : t -> int
val contains_tuple : t -> bool
val unwind_array_type : t -> t * int
val wind_array_type : (t * int) -> t
val pp : t Fmt.t
val pp_fun_arg : (autodifftype * t) Fmt.t
val pp_returntype : Stdlib.Format.formatter -> returntype -> unit
val autodifftype_can_convert : autodifftype -> autodifftype -> bool
val has_autodiff : autodifftype -> bool
val any_autodiff : autodifftype list -> bool
val lub_ad_type : autodifftype list -> autodifftype option
val common_type : (t * t) -> t option

Given two types find the minimal type both can convert to

val is_autodiffable : t -> bool
val is_autodifftype : autodifftype -> bool
val is_dataonlytype : autodifftype -> bool
val is_scalar_type : t -> bool
val promote_container : t -> t -> t
val is_discrete_type : t -> bool

Used to determine valid covariates for _lpmf functions

val is_int_type : t -> bool

Used in code generation and other places, does _not_ include tuples of ints

val is_complex_type : t -> bool
val internal_scalar : t -> t
val is_eigen_type : t -> bool
val is_fun_type : t -> bool
val contains_int : t -> bool

Detect if type contains an integer

val contains_eigen_type : t -> bool
val is_container : t -> bool
val is_array : t -> bool
val is_indexing_matrix : (t * 'a list) -> bool
val fill_adtype_for_type : autodifftype -> t -> autodifftype

In some places (e.g. code generation) we need to instantiate an AD type. Previously we would just say DataOnly or AutoDiffable, however this breaks the invariant that a Tuple always has TupleAD as it's autodifftype

val enumerate_tuple_names_io : string -> t -> string list

List all possible tuple sub-names for IO purposes. E.g, the decl array[2] (int, real) foo; should yield the list ["foo.1";"foo.2"].

module Comparator : sig ... end
include module type of struct include Comparator end
type comparator_witness = Comparator.comparator_witness
include sig ... end
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Base__.Or_error.t
val comparator : (t, Comparator.comparator_witness) Base__Comparator.comparator
val validate_lbound : min:t Core__.Maybe_bound.t -> t Validate.check
val validate_ubound : max:t Core__.Maybe_bound.t -> t Validate.check
val validate_bound : + min:t Core__.Maybe_bound.t -> + max:t Core__.Maybe_bound.t -> + t Validate.check
module Replace_polymorphic_compare : sig ... end
module Map : sig ... end
module Set : sig ... end
diff --git a/stanc/Middle/Utils/index.html b/stanc/Middle/Utils/index.html new file mode 100644 index 000000000..43ac87687 --- /dev/null +++ b/stanc/Middle/Utils/index.html @@ -0,0 +1,10 @@ + +Utils (stanc.Middle.Utils)

Module Middle.Utils

Utilities, primarily surrounding distribution names and suffixes

val option_or_else : if_none:'a option -> 'a option -> 'a option
val unnormalized_suffices : string list

Name mangling helper functions for distributions

val distribution_suffices : string list
val conditioning_suffices : string list
val cumulative_distribution_suffices : string list
val cumulative_distribution_suffices_w_rng : string Base__List.t
val is_user_ident : string -> bool
val unnormalized_suffix : string -> string
val split_distribution_suffix : string -> (string * string) option
val is_distribution_name : string -> bool
val is_unnormalized_distribution : string -> bool
val replace_unnormalized_suffix : string -> name:string -> string option
val stdlib_distribution_name : string -> string
val normalized_name : string -> string
val zip_stuple_trans_exn : + 'a SizedType.t -> + 'b list -> + ('a SizedType.t * 'b) list
val zip_utuple_trans_exn : + UnsizedType.t -> + 'a list -> + (UnsizedType.t * 'a) list
diff --git a/stanc/Middle/index.html b/stanc/Middle/index.html new file mode 100644 index 000000000..9b306e04b --- /dev/null +++ b/stanc/Middle/index.html @@ -0,0 +1,2 @@ + +Middle (stanc.Middle)

Module Middle

module Expr : sig ... end

MIR types and modules corresponding to the expressions of the language

module Flag_vars : sig ... end
module Fun_kind : sig ... end

Types for function kinds, e.g. StanLib or UserDefined, and function suffix types, e.g. foo_ldfp, bar_lp

module Index : sig ... end

Types of indexing operations

module Internal_fun : sig ... end

Language functions defined internally by the compiler

module Location : sig ... end

Storing locations in the original source

module Location_span : sig ... end

Delimited locations in source code

module Mem_pattern : sig ... end
module Operator : sig ... end

Utilities for Stan's built in operators

module Program : sig ... end

Defines the core of the MIR

module SizedType : sig ... end

Types which have a concrete size associated, e.g. vector[n]

module Stan_math_signatures : sig ... end

This module stores a table of all signatures from the Stan math C++ library which are exposed to Stan, and some helper functions for dealing with those signatures.

module Stmt : sig ... end

MIR types and modules corresponding to the statements of the language

module Transformation : sig ... end
module Type : sig ... end

A type which unifies SizedTypes and UnsizedTypes for declarations

module UnsizedType : sig ... end

Types which have dimensionalities but not sizes, e.g. array[,,]

module Utils : sig ... end

Utilities, primarily surrounding distribution names and suffixes

diff --git a/stanc/Stan_math_backend/Cpp/Decls/index.html b/stanc/Stan_math_backend/Cpp/Decls/index.html new file mode 100644 index 000000000..4627ebaae --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Decls/index.html @@ -0,0 +1,2 @@ + +Decls (stanc.Stan_math_backend.Cpp.Decls)

Module Cpp.Decls

Declarations which get re-used often in the generated model

val current_statement : stmt list
val dummy_var : stmt list
val serializer_in : stmt
val serializer_out : stmt
val lp_accum : type_ -> stmt
diff --git a/stanc/Stan_math_backend/Cpp/Expression_syntax/index.html b/stanc/Stan_math_backend/Cpp/Expression_syntax/index.html new file mode 100644 index 000000000..f7930a491 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Expression_syntax/index.html @@ -0,0 +1,2 @@ + +Expression_syntax (stanc.Stan_math_backend.Cpp.Expression_syntax)

Module Cpp.Expression_syntax

Some operators to make streams and method calls look more like the resultant C++

include module type of struct include Exprs end
val method_call : expr -> identifier -> type_ list -> expr list -> expr

Call a method on object, wrapping it in parentheses if it is not a variable

val to_var : identifier -> expr
val literal_string : string -> expr

Turn an OCaml string into a quoted and escaped C++ string

val std_vector_init_expr : type_ -> expr list -> expr

Equivalent to std::vector<t>{e1,...,en}

val fun_call : identifier -> expr list -> expr
val templated_fun_call : identifier -> type_ list -> expr list -> expr
val quiet_NaN : expr

Helper for std::numeric_limits<double>::quiet_NaN()

val int_min : expr

Helper for std::numeric_limits<int>::min()

val static_cast : type_ -> expr -> expr
val (<<) : expr -> expr list -> expr

A pun for the C++ operator<<

val (.@!()) : expr -> identifier -> expr

Method call: Call a no-argument method

E.g. foo.bar()

val (.@?()) : expr -> (identifier * expr list) -> expr

Method call: Call the named method with args

E.g. foo.bar(A1,...An)

val (.@<>()) : expr -> (identifier * type_ list * expr list) -> expr

Method call: Call the named method with template types and args

E.g. foo.bar<T1,...,Tn>(A1,...An)

val (|::!) : type_ -> identifier -> expr

Static method call: Call the named method with no arguments.

E.g. Foo::bar()

val (|::?) : type_ -> (identifier * expr list) -> expr

Static method call: Call the named method with args

E.g. Foo::bar(A1,...An)

val (|::<>) : type_ -> (identifier * type_ list * expr list) -> expr

Static method call: Call the named method with template types and args

E.g. Foo::bar<T1,...,Tn>(A1,...An)

val (+) : expr -> expr -> expr

Pun for C++ operator+(a,b)

val (-) : expr -> expr -> expr

Pun for C++ operator-(a,b)

val (*) : expr -> expr -> expr

Pun for C++ operator*(a,b)

diff --git a/stanc/Stan_math_backend/Cpp/Exprs/index.html b/stanc/Stan_math_backend/Cpp/Exprs/index.html new file mode 100644 index 000000000..ae2058296 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Exprs/index.html @@ -0,0 +1,2 @@ + +Exprs (stanc.Stan_math_backend.Cpp.Exprs)

Module Cpp.Exprs

Some helper values and functions

val method_call : expr -> identifier -> type_ list -> expr list -> expr

Call a method on object, wrapping it in parentheses if it is not a variable

val to_var : identifier -> expr
val literal_string : string -> expr

Turn an OCaml string into a quoted and escaped C++ string

val std_vector_init_expr : type_ -> expr list -> expr

Equivalent to std::vector<t>{e1,...,en}

val fun_call : identifier -> expr list -> expr
val templated_fun_call : identifier -> type_ list -> expr list -> expr
val quiet_NaN : expr

Helper for std::numeric_limits<double>::quiet_NaN()

val int_min : expr

Helper for std::numeric_limits<int>::min()

val static_cast : type_ -> expr -> expr
diff --git a/stanc/Stan_math_backend/Cpp/Printing/index.html b/stanc/Stan_math_backend/Cpp/Printing/index.html new file mode 100644 index 000000000..570b92b3f --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Printing/index.html @@ -0,0 +1,15 @@ + +Printing (stanc.Stan_math_backend.Cpp.Printing)

Module Cpp.Printing

Pretty-printing of the C++ type

val trailing_space : 'a Fmt.t -> 'a Fmt.t
val pp_identifier : Stdlib.Format.formatter -> string -> unit
val pp_type_ : type_ Fmt.t
val pp_requires : + default:bool -> + Stdlib.Format.formatter -> + ([< `Exact of string | `OneOf of string list ] * type_) list -> + unit
val pp_template : + default:bool -> + Stdlib.Format.formatter -> + template_parameter list -> + unit

Pretty print a list of templates as template <parameter-list>.name This function pools together RequireAllCondition nodes into a require_all_t

val pp_operator : Stdlib.Format.formatter -> operator -> unit
val pp_expr : expr Fmt.t
val pp_variable_defn : Stdlib.Format.formatter -> variable_defn -> unit
val pp_stmt : stmt Fmt.t
val pp_with_block : + ?indent:int -> + unit Fmt.t -> + Stdlib.Format.formatter -> + stmt -> + unit

When we know a block is here, we can do better pretty-printing

  • parameter indent:

    How much to indent the enclosing vbox. Usually 2, but set to zero for the else branch of an if-else to prevent over-indenting

val pp_cv : Stdlib.Format.formatter -> cv_qualifiers -> unit
val pp_fun_defn : Stdlib.Format.formatter -> fun_defn -> unit
val pp_destructor : Stdlib.Format.formatter -> (string * stmt list) -> unit
val pp_constructor : Stdlib.Format.formatter -> (string * constructor) -> unit
val pp_directive : Stdlib.Format.formatter -> directive -> unit
val pp_class_defn : Stdlib.Format.formatter -> class_defn -> unit
val pp_struct_defn : Stdlib.Format.formatter -> struct_defn -> unit
val pp_defn : defn Fmt.t
val pp_program : defn list Fmt.t
diff --git a/stanc/Stan_math_backend/Cpp/Stmts/index.html b/stanc/Stan_math_backend/Cpp/Stmts/index.html new file mode 100644 index 000000000..94b34c861 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Stmts/index.html @@ -0,0 +1,2 @@ + +Stmts (stanc.Stan_math_backend.Cpp.Stmts)

Module Cpp.Stmts

Helpers for common statement constructs

val block : stmt list -> stmt

Wrap the list of statements in a block if it isn't a singleton block already

val unblock : stmt list -> stmt list
val rethrow_located : stmt list -> stmt list

Set up the try/catch logic for throwing an exception with its location set to the Stan program location.

val fori : identifier -> expr -> expr -> stmt -> stmt
val if_block : expr -> stmt list -> stmt
val unused : identifier -> stmt list

Suppress warnings for a variable which may not be used.

diff --git a/stanc/Stan_math_backend/Cpp/Tests/index.html b/stanc/Stan_math_backend/Cpp/Tests/index.html new file mode 100644 index 000000000..fc02defbf --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Tests/index.html @@ -0,0 +1,2 @@ + +Tests (stanc.Stan_math_backend.Cpp.Tests)

Module Cpp.Tests

diff --git a/stanc/Stan_math_backend/Cpp/Types/index.html b/stanc/Stan_math_backend/Cpp/Types/index.html new file mode 100644 index 000000000..fe89bae80 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/Types/index.html @@ -0,0 +1,2 @@ + +Types (stanc.Stan_math_backend.Cpp.Types)

Module Cpp.Types

Helpers for constructing types

val local_scalar : type_
val std_vector : ?dims:Core__Int.t -> type_ -> type_

A std::vector<t>

val bool : type_
val complex : type_ -> type_
val vector : ?mem_pattern:Middle.Mem_pattern.t -> type_ -> type_

An Eigen::Matrix<s, -1, 1>

val row_vector : ?mem_pattern:Middle.Mem_pattern.t -> type_ -> type_

An Eigen::Matrix<s, 1, -1>

val matrix : ?mem_pattern:Middle.Mem_pattern.t -> type_ -> type_

An Eigen::Matrix<s, -1, -1>

val string : type_

A std::string

val size_t : type_
val const_ref : type_ -> type_
val const_char_array : int -> type_
val eigen_map : type_ -> type_
diff --git a/stanc/Stan_math_backend/Cpp/index.html b/stanc/Stan_math_backend/Cpp/index.html new file mode 100644 index 000000000..9246548a8 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp/index.html @@ -0,0 +1,37 @@ + +Cpp (stanc.Stan_math_backend.Cpp)

Module Stan_math_backend.Cpp

A set of data types representing the C++ we generate

type identifier = string
val identifier_of_sexp : Sexplib0.Sexp.t -> identifier
val sexp_of_identifier : identifier -> Sexplib0.Sexp.t
type type_ =
  1. | Auto
  2. | Void
  3. | Int
  4. | Double
  5. | Complex of type_
  6. | TemplateType of identifier
  7. | StdVector of type_
    (*

    A std::vector. For Eigen Vectors, use Matrix with a row or column size of 1

    *)
  8. | Array of type_ * int
  9. | Tuple of type_ list
  10. | TypeLiteral of identifier
    (*

    Used for things like Eigen::Index

    *)
  11. | Matrix of type_ * int * int * Middle.Mem_pattern.t
  12. | Ref of type_
  13. | Const of type_
  14. | Pointer of type_
  15. | TypeTrait of identifier * type_ list
    (*

    e.g. stan::promote_scalar, stan:base_type

    *)

C++ types

val type__of_sexp : Sexplib0.Sexp.t -> type_
val sexp_of_type_ : type_ -> Sexplib0.Sexp.t
module Types : sig ... end

Helpers for constructing types

type operator =
  1. | Multiply
  2. | Divide
  3. | Add
  4. | Subtract
  5. | Eq
  6. | LEq
  7. | GEq
  8. | Lthn
  9. | Gthn
  10. | And
  11. | Or
val operator_of_sexp : Sexplib0.Sexp.t -> operator
val sexp_of_operator : operator -> Sexplib0.Sexp.t
type expr =
  1. | Literal of string
    (*

    printed as-is

    *)
  2. | Var of identifier
  3. | VarRef of identifier
  4. | Parens of expr
  5. | FunCall of identifier * type_ list * expr list
  6. | MethodCall of expr * identifier * type_ list * expr list
  7. | StaticMethodCall of type_ * identifier * type_ list * expr list
  8. | Constructor of type_ * expr list
    (*

    printed as type(expr1, expr2, ...)

    *)
  9. | InitializerExpr of type_ * expr list
    (*

    printed as type{expr1, expr2, ...}

    *)
  10. | ArrayLiteral of expr list
  11. | TernaryIf of expr * expr * expr
  12. | Cast of type_ * expr
  13. | Index of expr * expr
  14. | Deref of expr
  15. | AllocNew of type_ * expr list
  16. | OperatorNew of identifier * type_ * expr list
    (*

    See operator new for distinctions between allocating and placing news

    *)
  17. | Assign of expr * expr
    (*

    NB: Not all exprs are valid lvalues!

    *)
  18. | StreamInsertion of expr * expr list
    (*

    Corresponds to operator<<

    *)
  19. | BinOp of expr * operator * expr
  20. | PMinus of expr
  21. | Increment of expr
val expr_of_sexp : Sexplib0.Sexp.t -> expr
val sexp_of_expr : expr -> Sexplib0.Sexp.t
module Exprs : sig ... end

Some helper values and functions

module Expression_syntax : sig ... end

Some operators to make streams and method calls look more like the resultant C++

type init =
  1. | Assignment of expr
  2. | Construction of expr list
  3. | InitializerList of expr list
  4. | Uninitialized
val init_of_sexp : Sexplib0.Sexp.t -> init
val sexp_of_init : init -> Sexplib0.Sexp.t
type variable_defn = {
  1. static : bool;
  2. constexpr : bool;
  3. type_ : type_;
  4. name : identifier;
  5. init : init;
}
val make_variable_defn : + ?static:bool -> + ?constexpr:bool -> + type_:type_ -> + name:identifier -> + ?init:init -> + unit -> + variable_defn
val variable_defn_of_sexp : Sexplib0.Sexp.t -> variable_defn
val sexp_of_variable_defn : variable_defn -> Sexplib0.Sexp.t
type stmt =
  1. | Expression of expr
  2. | VariableDefn of variable_defn
  3. | For of variable_defn * expr * expr * stmt
  4. | ForEach of type_ * identifier * expr * stmt
  5. | While of expr * stmt
  6. | IfElse of expr * stmt * stmt option
  7. | TryCatch of stmt list * type_ * identifier * stmt list
  8. | Block of stmt list
  9. | Return of expr option
  10. | Throw of expr
  11. | Break
  12. | Continue
  13. | Using of string * type_ option
  14. | Comment of string
val stmt_of_sexp : Sexplib0.Sexp.t -> stmt
val sexp_of_stmt : stmt -> Sexplib0.Sexp.t
module Stmts : sig ... end

Helpers for common statement constructs

module Decls : sig ... end

Declarations which get re-used often in the generated model

type template_parameter =
  1. | Typename of string
    (*

    The name of a template typename

    *)
  2. | RequireAllCondition of [ `Exact of string | `OneOf of string list ] * type_
    (*

    A C++ type trait (e.g. is_arithmetic) and the template name which needs to satisfy that. These are collated into one require_all_t<>

    *)
  3. | Require of string * string list
  4. | Bool of string
    (*

    A named boolean template type

    *)
val template_parameter_of_sexp : Sexplib0.Sexp.t -> template_parameter
val sexp_of_template_parameter : template_parameter -> Sexplib0.Sexp.t
type cv_qualifiers =
  1. | Const
  2. | Final
  3. | NoExcept
val cv_qualifiers_of_sexp : Sexplib0.Sexp.t -> cv_qualifiers
val sexp_of_cv_qualifiers : cv_qualifiers -> Sexplib0.Sexp.t
type fun_defn = {
  1. templates_init : template_parameter list list * bool;
    (*

    Double list since some functions (mainly reduce_sum functors) need two sets of templates

    *)
  2. inline : bool;
  3. return_type : type_;
  4. name : identifier;
  5. args : (type_ * string) list;
  6. cv_qualifiers : cv_qualifiers list;
  7. body : stmt list option;
}
val make_fun_defn : + ?templates_init:(template_parameter list list * bool) -> + ?inline:bool -> + return_type:type_ -> + name:identifier -> + ?args:(type_ * string) list -> + ?cv_qualifiers:cv_qualifiers list -> + ?body:stmt list -> + unit -> + fun_defn
val fun_defn_of_sexp : Sexplib0.Sexp.t -> fun_defn
val sexp_of_fun_defn : fun_defn -> Sexplib0.Sexp.t
val split_fun_decl_defn : fun_defn -> fun_defn * fun_defn
type constructor = {
  1. args : (type_ * string) list;
  2. init_list : (identifier * expr list) list;
  3. body : stmt list;
}
val make_constructor : + ?args:(type_ * string) list -> + ?init_list:(identifier * expr list) list -> + ?body:stmt list -> + unit -> + constructor
val constructor_of_sexp : Sexplib0.Sexp.t -> constructor
val sexp_of_constructor : constructor -> Sexplib0.Sexp.t
type directive =
  1. | Include of string
  2. | IfNDef of string * defn list
  3. | MacroApply of string * string list

Incomplete list of C++ preprocessor directives

and class_defn = {
  1. class_name : identifier;
  2. final : bool;
  3. public_base : type_;
  4. private_members : defn list;
  5. public_members : defn list;
  6. constructor : constructor;
  7. destructor_body : stmt list;
}

The Stan model class always has a non-default constructor and destructor

and struct_defn = {
  1. param : template_parameter option;
  2. struct_name : identifier;
  3. body : defn list;
}
and defn =
  1. | FunDef of fun_defn
  2. | Class of class_defn
  3. | Struct of struct_defn
  4. | GlobalVariableDefn of variable_defn
  5. | GlobalComment of string
  6. | GlobalUsing of string * type_ option
  7. | Namespace of identifier * defn list
  8. | Preprocessor of directive
val directive_of_sexp : Sexplib0.Sexp.t -> directive
val class_defn_of_sexp : Sexplib0.Sexp.t -> class_defn
val struct_defn_of_sexp : Sexplib0.Sexp.t -> struct_defn
val defn_of_sexp : Sexplib0.Sexp.t -> defn
val sexp_of_directive : directive -> Sexplib0.Sexp.t
val sexp_of_class_defn : class_defn -> Sexplib0.Sexp.t
val sexp_of_struct_defn : struct_defn -> Sexplib0.Sexp.t
val sexp_of_defn : defn -> Sexplib0.Sexp.t
val make_class_defn : + name:identifier -> + public_base:type_ -> + ?final:bool -> + private_members:defn list -> + public_members:defn list -> + constructor:constructor -> + ?destructor_body:stmt list -> + unit -> + class_defn
val make_struct_defn : + param:template_parameter option -> + name:identifier -> + body:defn list -> + unit -> + struct_defn
type program = defn list

Much like in C++, we define a translation unit as a list of definitions

val program_of_sexp : Sexplib0.Sexp.t -> program
val sexp_of_program : program -> Sexplib0.Sexp.t
module Printing : sig ... end

Pretty-printing of the C++ type

module Tests : sig ... end
diff --git a/stanc/Stan_math_backend/Cpp_Json/index.html b/stanc/Stan_math_backend/Cpp_Json/index.html new file mode 100644 index 000000000..e9a928118 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp_Json/index.html @@ -0,0 +1,5 @@ + +Cpp_Json (stanc.Stan_math_backend.Cpp_Json)

Module Stan_math_backend.Cpp_Json

val out_var_interpolated_json_str : + (string * Middle.Expr.Typed.t Middle.SizedType.t * Middle.Program.io_block) + list -> + string
diff --git a/stanc/Stan_math_backend/Cpp_str/index.html b/stanc/Stan_math_backend/Cpp_str/index.html new file mode 100644 index 000000000..39c2dba68 --- /dev/null +++ b/stanc/Stan_math_backend/Cpp_str/index.html @@ -0,0 +1,2 @@ + +Cpp_str (stanc.Stan_math_backend.Cpp_str)

Module Stan_math_backend.Cpp_str

Utilities for converting OCaml strings into C++ strings

val escaped : string -> string

A version of stdlib Bytes.escaped but uses octal output, rather than default decimal, for escapes like \123. This allows cpp to read them as literals

diff --git a/stanc/Stan_math_backend/Lower_expr/Testing/index.html b/stanc/Stan_math_backend/Lower_expr/Testing/index.html new file mode 100644 index 000000000..99c1c33f5 --- /dev/null +++ b/stanc/Stan_math_backend/Lower_expr/Testing/index.html @@ -0,0 +1,6 @@ + +Testing (stanc.Stan_math_backend.Lower_expr.Testing)

Module Lower_expr.Testing

diff --git a/stanc/Stan_math_backend/Lower_expr/index.html b/stanc/Stan_math_backend/Lower_expr/index.html new file mode 100644 index 000000000..9fa89748e --- /dev/null +++ b/stanc/Stan_math_backend/Lower_expr/index.html @@ -0,0 +1,83 @@ + +Lower_expr (stanc.Stan_math_backend.Lower_expr)

Module Stan_math_backend.Lower_expr

Lowering of Stan expressions to C++

val stan_namespace_qualify : string -> string
val fn_renames : string Core.String.Map.t
val constraint_to_string : 'a Middle.Transformation.t -> string option
val functor_suffix : string
val reduce_sum_functor_suffix : string
val variadic_functor_suffix : int -> string
type variadic =
  1. | FixedArgs
  2. | ReduceSum
  3. | VariadicHOF of int
val compare_variadic : variadic -> variadic -> int
val hash_fold_variadic : + Ppx_hash_lib.Std.Hash.state -> + variadic -> + Ppx_hash_lib.Std.Hash.state
val hash_variadic : variadic -> Ppx_hash_lib.Std.Hash.hash_value
val functor_type : string Core.Hashtbl.key -> variadic
val functor_suffix_select : variadic -> string
val is_scalar : Middle.Expr.Typed.t -> bool
val is_matrix : Middle.Expr.Typed.t -> bool

Used to determine if operator/ should be mdivide_right() or divide()

val is_row_vector : Middle.Expr.Typed.t -> bool
val first : 'a list -> 'a
val second : 'a list -> 'a
val default_multiplier : int
val default_offset : int
val transform_args : + Middle__Expr.Typed.Meta.t Middle__Expr.Fixed.t Middle.Transformation.t -> + Middle__Expr.Typed.Meta.t Middle__Expr.Fixed.t Base__List.t
val is_single_index : 'a Middle.Index.t -> bool
val dont_need_range_check : 'a Middle.Expr.Fixed.t Middle.Index.t -> bool
val promote_adtype : + Middle.Expr.Typed.t list -> + Middle.UnsizedType.autodifftype
val suffix_args : 'a Middle.Fun_kind.suffix -> string list
val stantype_prim : Middle.UnsizedType.t -> Cpp.type_
val templates : bool -> bool Middle.Fun_kind.suffix -> Cpp.type_ list
val deserializer : Cpp.expr
val minus_one : Stan_math_backend__Cpp.expr -> Cpp.expr
val plus_one : Stan_math_backend__Cpp.expr -> Cpp.expr
val lower_type : + ?mem_pattern:Middle.Mem_pattern.t -> + Middle.UnsizedType.t -> + Cpp.type_ -> + Cpp.type_
val lower_unsizedtype_local : + ?mem_pattern:Middle.Mem_pattern.t -> + Middle.UnsizedType.autodifftype -> + Middle.UnsizedType.t -> + Cpp.type_
val lower_logical_op : + Cpp.operator -> + Middle.Expr.Typed.t -> + Middle.Expr.Typed.t -> + Cpp.expr
val lower_binary_fun : + string -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr
val vector_literal : + ?column:bool -> + Cpp.type_ -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr
val lower_binary_op : + Cpp.operator -> + string -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr
val lower_operator_app : + Middle.Operator.t -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr
val lower_misc_special_math_app : + Core.String.Map.Key.t -> + Middle.Mem_pattern.t -> + Middle.UnsizedType.returntype option -> + (Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr) + option
val lower_functionals : + string Core.Hashtbl.key Core.Hashtbl.key -> + bool Middle.Fun_kind.suffix -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Middle.Mem_pattern.t -> + (Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr) + option
val lower_fun_app : + bool Middle.Fun_kind.suffix -> + Core.String.Map.Key.t -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Middle.Mem_pattern.t -> + Middle.UnsizedType.returntype option -> + Cpp.expr
val lower_user_defined_fun : + string -> + bool Middle.Fun_kind.suffix -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr
val lower_indexed : + Middle.Expr.Typed.t -> + Middle.Expr.Typed.t Middle.Index.t list -> + string -> + Cpp.expr
val lower_indexed_simple : + Cpp.expr -> + Middle.Expr.Typed.t Middle.Index.t Core__.Import.list -> + Cpp.expr
val lower_expr : ?promote_reals:bool -> Middle.Expr.Typed.t -> Cpp.expr
val lower_exprs : + ?promote_reals:bool -> + Middle.Expr.Typed.Meta.t Middle.Expr.Fixed.t Base__List.t -> + Cpp.expr Base__List.t
module Testing : sig ... end
diff --git a/stanc/Stan_math_backend/Lower_functions/index.html b/stanc/Stan_math_backend/Lower_functions/index.html new file mode 100644 index 000000000..ff79ed403 --- /dev/null +++ b/stanc/Stan_math_backend/Lower_functions/index.html @@ -0,0 +1,5 @@ + +Lower_functions (stanc.Stan_math_backend.Lower_functions)

Module Stan_math_backend.Lower_functions

Responsible for turning the Stan function's block into forward decls, functions, and functors in C++

val collect_functors_functions : Middle.Program.Numbered.t -> Cpp.defn list
val lower_standalone_fun_def : + string -> + 'a Middle.Program.fun_def -> + Cpp.defn list
diff --git a/stanc/Stan_math_backend/Lower_program/index.html b/stanc/Stan_math_backend/Lower_program/index.html new file mode 100644 index 000000000..3241d2b86 --- /dev/null +++ b/stanc/Stan_math_backend/Lower_program/index.html @@ -0,0 +1,5 @@ + +Lower_program (stanc.Stan_math_backend.Lower_program)

Module Stan_math_backend.Lower_program

Stan-program-specific C++ generation

val standalone_functions : bool Stdlib.ref
val stanc_args_to_print : string Stdlib.ref
val lower_program : + ?printed_filename:string -> + Middle.Program.Typed.t -> + Cpp.program
diff --git a/stanc/Stan_math_backend/Lower_stmt/Testing/index.html b/stanc/Stan_math_backend/Lower_stmt/Testing/index.html new file mode 100644 index 000000000..b718397f0 --- /dev/null +++ b/stanc/Stan_math_backend/Lower_stmt/Testing/index.html @@ -0,0 +1,2 @@ + +Testing (stanc.Stan_math_backend.Lower_stmt.Testing)

Module Lower_stmt.Testing

diff --git a/stanc/Stan_math_backend/Lower_stmt/index.html b/stanc/Stan_math_backend/Lower_stmt/index.html new file mode 100644 index 000000000..d1de4edb1 --- /dev/null +++ b/stanc/Stan_math_backend/Lower_stmt/index.html @@ -0,0 +1,51 @@ + +Lower_stmt (stanc.Stan_math_backend.Lower_stmt)

Module Stan_math_backend.Lower_stmt

Lowering of Stan statements to C++

val check_to_string : 'a Middle.Transformation.t -> string option
val math_fn_translations : 'a Middle.Internal_fun.t -> string option
val trans_math_fn : 'a Middle.Internal_fun.t -> string
val lower_profile : + Cpp.identifier -> + Cpp.stmt list -> + Stan_math_backend__Cpp.stmt
val lower_bool_expr : Middle.Expr.Typed.t -> Cpp.expr
val expr_overlaps_lhs_ref : + 'a Middle.Expr.Fixed.t Middle.Stmt.Fixed.Pattern.lvalue -> + 'a Middle.Expr.Fixed.t -> + bool
val throw_exn : + string -> + Middle.Expr.Typed.t list -> + Stan_math_backend__Cpp.stmt
val lower_statements : + (Middle.Expr.Typed.Meta.t, Middle.Stmt.Numbered.Meta.t) Middle.Stmt.Fixed.t + list -> + Cpp.stmt Base__List.t
module Testing : sig ... end
diff --git a/stanc/Stan_math_backend/Mangle/index.html b/stanc/Stan_math_backend/Mangle/index.html new file mode 100644 index 000000000..7a17d5b24 --- /dev/null +++ b/stanc/Stan_math_backend/Mangle/index.html @@ -0,0 +1,2 @@ + +Mangle (stanc.Stan_math_backend.Mangle)

Module Stan_math_backend.Mangle

Mangle variables which are C++ reserved words into valid C++ identifiers.

This is done in Transform_Mir. When one of these names is emitted as a string, we use remove_prefix such that this mangling is opaque to the user - e.g., a cmdstan output file would still have a column called "public", even if internally we called this "_stan_public"

NB: the use of a leading _ is essential, because the lexer won't allow this in a user-created variable.

val remove_prefix : string -> string

Used in code generation so that this mangling is opaque to the interfaces (e.g. cmdstan)

val add_prefix_to_kwrds : string -> string
diff --git a/stanc/Stan_math_backend/Numbering/index.html b/stanc/Stan_math_backend/Numbering/index.html new file mode 100644 index 000000000..69b5918ea --- /dev/null +++ b/stanc/Stan_math_backend/Numbering/index.html @@ -0,0 +1,7 @@ + +Numbering (stanc.Stan_math_backend.Numbering)

Module Stan_math_backend.Numbering

This module translates the locations of statements into an array of messages used in the C++ for providing locations in the Stan code when an error occurs, and replaces the locations in the MIR tree with indices into said array.

It also numbers calls to map_rect for registration.

type state_t
type map_rect_registration_t
val no_span_num : Middle.Stmt.Numbered.Meta.t
val gen_globals : ?printed_filename:string -> state_t -> Cpp.defn list
val assign_loc : Middle.Stmt.Numbered.Meta.t -> Cpp.stmt list
val register_map_rect_functors : + string -> + map_rect_registration_t -> + Cpp.defn list

Register functiors used for map_rect.

diff --git a/stanc/Stan_math_backend/Transform_Mir/index.html b/stanc/Stan_math_backend/Transform_Mir/index.html new file mode 100644 index 000000000..a4bec593f --- /dev/null +++ b/stanc/Stan_math_backend/Transform_Mir/index.html @@ -0,0 +1,2 @@ + +Transform_Mir (stanc.Stan_math_backend.Transform_Mir)

Module Stan_math_backend.Transform_Mir

Perform backend-specific transformations of the MIR such as mangling or renaming of functions which differ in the library implementation

val is_opencl_var : string -> bool
val use_opencl : bool Stdlib.ref
diff --git a/stanc/Stan_math_backend/index.html b/stanc/Stan_math_backend/index.html new file mode 100644 index 000000000..183cb052f --- /dev/null +++ b/stanc/Stan_math_backend/index.html @@ -0,0 +1,2 @@ + +Stan_math_backend (stanc.Stan_math_backend)

Module Stan_math_backend

module Cpp : sig ... end

A set of data types representing the C++ we generate

module Cpp_Json : sig ... end
module Cpp_str : sig ... end

Utilities for converting OCaml strings into C++ strings

module Lower_expr : sig ... end

Lowering of Stan expressions to C++

module Lower_functions : sig ... end

Responsible for turning the Stan function's block into forward decls, functions, and functors in C++

module Lower_program : sig ... end

Stan-program-specific C++ generation

module Lower_stmt : sig ... end

Lowering of Stan statements to C++

module Mangle : sig ... end

Mangle variables which are C++ reserved words into valid C++ identifiers.

module Numbering : sig ... end

This module translates the locations of statements into an array of messages used in the C++ for providing locations in the Stan code when an error occurs, and replaces the locations in the MIR tree with indices into said array.

module Transform_Mir : sig ... end

Perform backend-specific transformations of the MIR such as mangling or renaming of functions which differ in the library implementation

diff --git a/stanc/core_ideas.html b/stanc/core_ideas.html new file mode 100644 index 000000000..694a44204 --- /dev/null +++ b/stanc/core_ideas.html @@ -0,0 +1,3 @@ + +core_ideas (stanc.core_ideas)

Core Ideas

This is not meant to be tutorial on the OCaml language itself, but rather on some of the features and libraries of Stanc3 which may not be familiar to developers who do have some OCaml exposure.

The Jane Street standard library

We use Jane Street's Core standard library. There are a few differences from the OCaml standard library which are instantly noticeable:

  • Most higher-order functions such as List.map take a named function argument.

    This means a call like List.map square [1;2;3] will look like List.map ~f:square [1;2;3].

  • Core defaults to safe operations which return options rather than possibly erring.

    In "normal" OCaml, List.hd has type 'a list -> 'a. A call List.hd [] will throw an exception. By contrast, in the Jane Street libraries, the same function has type 'a list -> 'a option.

    Usually, a function with the suffix _exn recovers the original signature, e.g. List.hd_exn : 'a list -> 'a .

If for some reason you need functionality from the OCaml standard library that is not available in Jane Street (be sure to triple check), you can use the modules Stdlib and Caml to access the built-in versions. Currently there is only one such usage in the compiler, to use the standard definition of != in the Menhir parser.

There are a few other things we gain from these libraries. The most important idea to understand is deriving.

Deriving functions

If you look at a type declaration of something like Ast.typed_expression, you'll notice something curious after the declaration:

type typed_expression = (typed_expr_meta, fun_kind) expr_with
+[@@deriving sexp, compare, map, hash, fold]

When using an editor that supports code completion, you may notice that the Ast module suggests functions which are not defined in the actual source text. This is because these functions are created at compile time by ppx_deriving.The above syntax [@@deriving ...] indicates which functions we would like to be generated.

These are very helpful - if a type derives hash, it can automatically be used as keys in Jane Street's hash tables, and a type which derives sexp can be serialized to Lisp-style S-Expressions. Most of our major types derive at least one function.

"Two Level Types"

The other curious thing about the types we define in our AST and MIR is that they use a trick known as "two level types". This allows re-using the same type structure with different amounts of metadata attached (e.g., before type checking we have an untyped_program which only has nodes and their source locations, after type checking we have typed_program which features nodes, locations, and types, in the same basic tree structure.

The way that this is implemented is a bit non-obvious at first. Essentially, many of the tree variant types are parameterized by something that ends up being a placeholder not for just metadata but for the recursive type including metadata, sometimes called the fixed point. So instead of recursively referencing expression, you would instead reference type parameter 'e, which will later be filled in with something like type expr_with_meta = metadata expression.

This takes some getting used to, and also can lead to some unhelpful type signatures in editors such as VSCode, because abbreviations are not always used in hover-over text. For example, Expr.Typed.t, the MIR's typed expression type, actually has a signature of Expr.Typed.Meta.t Expr.Fixed.t.

The Fmt library and pretty-printing

We extensively use the Fmt library for our pretty-printing and code generation. We have an existing guide on the wiki which covers the core ideas.

diff --git a/stanc/cpp_ir.html b/stanc/cpp_ir.html new file mode 100644 index 000000000..0ae5ff590 --- /dev/null +++ b/stanc/cpp_ir.html @@ -0,0 +1,6 @@ + +cpp_ir (stanc.cpp_ir)

C++ Code Generation

The main backend of the compiler is the "Stan Math" (C++) backend. We represent C++ code with a data types and functions found in Stan_math_backend.Cpp.

We also define a sort of miniature embedded domain specific language (DSL) for using these types. These helper functions and operators are all in sub-modules of Stan_math_backend.Cpp, for example Stan_math_backend.Cpp.Expression_syntax.

These allow writing OCaml code which looks or feels more like the C++ it will generate. These constructs should be used when they improve clarity, and avoided when they make the code harder to read. When combined with good variable names, this can lead to code like lp_accum__.@?(("add", [Var "lp__"])) , which hopefully reads quite clearly as equivalent to the C++ lp_accum__.add(lp__).

After a Stan program is lowered to this type, it can be printed to C++ using Stan_math_backend.Cpp.Printing. This module uses Fmt, but keeps the question of how C++ should be formatted separate from the question of what the generated C++ is.

DSL Example

For example, lets say one wanted to generate the expression

(Eigen::Matrix<double,1,-1>(3) << 1, a, 3).finished()

This could be written down as the literal OCaml type it is:

(MethodCall (Parens (StreamInsertion (Constructor (Matrix (Double, 1, -1), [Literal "3"]), [Literal "1"; Var "a"; Literal "3"]), "finished", [], [])

Or, using the DSL constructs, the same expression could be written

let open Expression_syntax in
+let open Types in
+let vector = Constructor (row_vector Double, [Literal "3"]) in
+let values = [Literal "1"; Var "a"; Literal "3"] in
+(vector << values).@!("finished")
diff --git a/stanc/dependencies.html b/stanc/dependencies.html new file mode 100644 index 000000000..478a3b444 --- /dev/null +++ b/stanc/dependencies.html @@ -0,0 +1,2 @@ + +dependencies (stanc.dependencies)

Dependencies

Stanc3 is programmed in OCaml and built with dune.

Build Dependencies

We rely on the following packages. Note that because of the requirements for Cross Compilation for Windows, these versions are exactly pinned.

These are automatically installed through the scripts/install_ocaml.sh and scripts/install_build_deps.sh scripts provided in the stanc3 repository.

  • OCaml 4.14.1
  • Dune 3.0+
  • Core v0.16.1 (a standard library replacement)
  • Menhir 20230608 (a parser generator and parsing library)
  • ppx_deriving 5.2.1 (a tool for generating boilerplate code)
  • fmt 0.9.0 (a library for pretty-printing of formatted text)
  • yojson 2.1.0 (a library for producing JSON files)

For the JavaScript interface to stanc3 we also use the following, installed via scripts/install_js_deps.sh

  • js_of_ocaml 5.4.0

The stancjs executable can be built with

dune build src/stancjs

Development Dependencies

There are several packages which are useful for development but not required for building stanc3. These can be installed with scripts/install_dev_deps.sh, or (alongside the above build requirements) with scripts/setup_dev_env.sh. Versioning of these dependencies is less strict, though some (like ocamlformat) are used to ensure a standard format across developers and must use the same version.

  • ocamlformat 0.26.1
  • merlin
  • ocaml-lsp-server
  • utop
  • ocp-indent
  • patdiff
  • odoc
  • bisect_ppx

Cross Compilation for Windows

To support Windows binaries, we use versions of OCaml and all our dependencies which are available on opam-cross-windows. This allows us to build Windows-compatible versions on non-Windows machines.

For more information on cross-compilation, see the dune docs.

To build Windows binaries, the above build requirements must have their opam-cross-windows equivalents installed. This can be done by executing scripts/install_build_deps_windows.sh.

Then, the command

dune build -x windows

will build a Windows binary.

diff --git a/stanc/exposing_new_functions.html b/stanc/exposing_new_functions.html new file mode 100644 index 000000000..36fadf2ba --- /dev/null +++ b/stanc/exposing_new_functions.html @@ -0,0 +1,8 @@ + +exposing_new_functions (stanc.exposing_new_functions)

Exposing New Functions to stanc3

Background

For a function to be built into Stan, it has to be included in the Stan Math library and its signature has to be exposed to the compiler.

To do the latter, we have to add a corresponding line in src/middle/Stan_math_signatures.ml. The compiler uses the signatures defined there to do type checking.

Adding a distribution function

To add a distribution, we have to find the line containing let distributions =. The existing distributions can be used for reference. The first argument defines the kind of function we want to add. The second argument is the base function name without the _... suffixes. The third argument specifies the argument types of the function. The last argument describes the memory pattern supported by this function, either an Array of Structs (AoS) or a Struct of Arrays (SoA). The following line exposes a function foo_lpdf which takes in a (non-vectorizable) real number and a (non-vectorizable) integer :

; ([Lpdf], "foo", [DReal; DInt], SoA)

To see the exact signatures created, we can recompile stanc using make all and display the signatures using stanc --dump-stan-math-signatures. By filtering for foo (for example by using grep), we get the following output:

$ stanc --dump-stan-math-signatures | grep foo
+foo_lpdf(real, int) => real

If we want to allow the first parameter to be vectorizable, we can change the signature to

; ([Lpdf], "foo", [DVReal; DReal], SoA)

This produces the following signatures:

$ stanc --dump-stan-math-signatures | grep foo
+foo_lpdf(real, int) => real
+foo_lpdf(vector, int) => real
+foo_lpdf(row_vector, int) => real
+foo_lpdf(array[] real, int) => real

As we can see, allowing a parameter to be vectorized automatically produces signatures where the parameter is either base type, vector, row_vector or array[].

Available parameter types

The following parameter types are available:

  • DInt: Scalar integer -> int
  • DReal: Scalar real number -> real
  • DVector: Vector -> vector
  • DMatrix: Matrix -> matrix
  • DIntArray: Integer array -> array[] int
  • DVInt: Vectorizable integer -> int; array[] int
  • DVReal: Vectorizable real number -> real; vector; row_vector; array[] real
  • DVectors: Vectorizable vectors (for multivariate functions) -> vector, row_vector, array[] vector, array[] row_vector
  • (DDeepVectorized: all base types with up to 8 levels of nested containers)

Available types of distribution functions

As we have seen above, specifying our function as [Lpdf] added the suffix _lpdf to our base function name. There are several types available which specify the suffixes that will be added:

  • Lpmf: _lpmf
  • Lpdf: _lpdf
  • Rng: _rng
  • Cdf: _cdf, _lcdf
  • Ccdf: _lccdf

Additionally, full_lpdf combines all suffixes of Lpdf, Rng, Ccdf and Cdf. full_lpmf does the same, but using the suffixes of Lpmf instead of Lpdf. Note that these two have to be used without brackets. This means we would write

; ([Cdf], "foo", [DReal; DInt], SoA)

but

; (full_lpdf, "foo", [DReal; DInt], SoA)

which corresponds to

; ([Lpdf; Rng; Ccdf; Cdf], "foo", [DReal; DInt], SoA)

Adding a normal function

Standard functions (e.g., not distributions or variadic functions) are added to a list in the same file. This list begins near the bottom of the file with the line

(* -- Start populating stan_math_signaturess -- *)
+let () =

The statements in this list use several helper functions, such as add_unqualified, add_qualified, add_binary, etc.

The core function of these is add_qualified, which registers a function based on:

  1. The name of the function
  2. The return type (an UnsizedType.returntype)
  3. A list of argument types (A list of UnsizedType.autodifftype * UnsizedType.t tuples)
  4. The memory pattern supported by this function, Array of Structs (AoS) or Struct of Arrays (SoA)

All other functions are simply helpers for calling this one. For example, if a function does not have any arguments it requires to be of type data, then add_unqualified is provided for convience. It does the same thing as add_qualfied, but the third argument is just a list of UnsizedType.ts. Other helpers, such as add_binary, exist for common cases such as a function with a signature (real, real) => real

If a function has multiple signatures, it will generally need multiple calls to these functions. Some helpers, such as add_binary_vec add multiple signatures at once for vectorized functions.

For example, the following line defines the signature add(real, matrix) => matrix

add_unqualified ("add", ReturnType UMatrix, [UReal; UMatrix], SoA) ;

Higher-Order Variadic functions

Functions such as the ODE integrators or reduce_sum, which take in user-functions and a variable-length list of arguments, are NOT added to this list.

"Nice" variadic functions are added to the hashtable Stan_math_signatures.stan_math_variadic_signatures. This is probably sufficient for most variadic functions, e.g. all the ODE solvers and DAE solvers are done via this method. reduce_sum is not "nice", since it is both variadic and polymorphic, requiring certain arguments to have the same (but not predetermined) type. Therefore, reduce_sum is treated as special case in the Typechecker module in the frontend folder.

Note that higher-order functions also usually require changes to the C++ code generation to work properly. It is best to consult an existing example of how these are done before proceeding.

Testing

Functions exposed from the Stan Math Library are tested for all declared signatures. These tests live in the folder test/integration/good/function-signatures. They consist of a basic Stan program (or multiple programs for functions with a large number of overloads) which call the new function on each possible combination of arguments.

These tests confirm both that the typechecker accepts these signatures and that the C++ generated for them compiles against the Math Library implementations.

Documentation

Finally, before a function can be exposed in the Stan compiler it needs to be added to the Stan Functions Reference, which is stored at stan-dev/docs. New PRs to stanc3 will prompt you to link to the accompanying documentation PR.

diff --git a/stanc/getting_started.html b/stanc/getting_started.html new file mode 100644 index 000000000..f62a8adfc --- /dev/null +++ b/stanc/getting_started.html @@ -0,0 +1,25 @@ + +getting_started (stanc.getting_started)

Getting development on stanc3 up and running locally

Setup

Using Opam and Dune

The recommended way to develop stanc3 is using opam and dune on a Unix-like system (MacOS or Linux). See Windows development for tips on developing on Windows.

This requires you have make, git, curl, and m4 installed via apt, homebrew, or your system's package manager.

  1. Download the repository (or your fork of it) from Github
  2. Install the necessary dependencies by running

    cd scripts; bash -x ./setup_dev_env.sh.

    If you already have opam installed, you can instead run

    opam update; opam install --deps-only --with-test .

    If you wish to install stanc on your system, you can run the above opam command without --deps-only.

  3. You can now build a stanc binary by running make. If this succeeds, you have the required software.

Windows development

We recommend using Windows Subsystem for Linux (WSL) for development on Windows. While this will not produce native-Windows binaries by default (though they can be cross-compiled), it is far easier to use and set up than the other options for Windows development.

Once you have installed and configured WSL, you can proceed through the steps above through the WSL shell.

Alternative: Using Nix

Nix is a declarative package manager with a focus on reproducible builds. We provide the ability to use Nix to build, test and run Stanc3. We recommend trying the opam instructions first if you are not an existing Nix user, with these as a backup.

If you have nix installed, you can build Stanc3 by running the following command in the stanc3 directory:

nix-build

The binary will be in result/bin/stanc. It may take a minute the first time you run it. Alternatively, the following is sometimes a faster way to build:

nix-shell --command "dune build"

To run the test suite, run:

nix-shell --command "dune build --profile release @runtest"

To install Stanc3 to your system, run:

nix-env -i -f default.nix

To drop into a sandboxed development shell with all of the build dependencies of Stanc3 plus packages for an OCaml development environment (dune, ocp-indent, ocamlformat, merlin and utop), run:

nix-shell

Development

Useful commands

Testing

Once you have the necessary software, you can make your edits to the source files in src/ and tests in test/. Running the command dune runtest (or make test) will show any test output which is different from the expected output. In our continuous integration, this results in test failures. If you are knowingly changing the output, and the differences highlighted by dune runtest look correct, you can run dune promote to change the expected output to match your current tests.

Test coverage

We have support for computing test coverage using the bisect_ppx library. To generate a coverage report, run make testcoverage. This will print a summary of the coverage to the terminal, and generate a detailed HTML report in the _coverage directory. This report can be opened in a web browser.

Code coverage of the master branch is available on codecov.io.

Code formatting

We recommend setting up your editor to use OCamlformat automatically. This will differ by editor, but is possible in most popular editors such as Emacs, VSCode, etc. See Editor advice for more specific tips.

If you would like to manually run the auto-formatter on all OCaml code in the repository, run make format. Similar to the above, you will need to run dune promote to accept these changes into the code.

If you would like to run the formatter before each commit (recommended), run

scripts/hooks/install_hooks.sh

Note: ocamlformat does not support .mly or .mll files used in the frontend.

Updating the parser error messages

If the parser has been edited, the command dune build @update_messages will add any new error states to the parser.messages file. These will say

TODO: PARSER MESSAGE NEEDED HERE.

See adding or changing the syntax error messages for more information.

Note that python3 is required to run this command.

Building these docs

Docs can be built with make doc. This will generate a _build/default/_doc/_html/index.html file which can be opened in a web browser.

Developing with stanc3 and CmdStan

In order to use the locally built development version of stanc3 with CmdStan, you need to set the STANC3 makefile variable in the make/local file in CmdStan. Example:

STANC3=relative/or/absolute/path/to/the/cloned/stanc3/folder

This will automatically rebuild the stanc3 binary used in CmdStan if a change was made to the stanc3 source files.

Editor advice

For working on this project, we recommend using either VSCode or Emacs as an editor, due to their good OCaml support through Merlin: syntax highlighting, auto-completion, type inference, automatic case splitting, and more. For people who prefer a GUI and have not memorized all Emacs or Vim keystrokes, VSCode might have the less steep learning curve. Anything with Merlin support is fine.

Setting up VSCode

Install instructions for VSCode can be found here.

For Windows users: We recommend using Remote - WSL to program within WSL from a native Windows installation of VSCode. This extension allows you to connect to the WSL instance as if it is a remote machine, removing the need for an X11 server or other method of running a Linux GUI app directly.

Once in VSCode (on any platform), simply install the OCaml extension and you should be ready to go.

Setting up Emacs

The best way to edit OCaml in Emacs is through Tuareg mode.

To get full Merlin support, you will need to run opam user-setup install after installing Merlin in our dev dependencies.

If you use use-package.el, this snippet should set up Tuareg+Merlin+OCamlformat

(use-package tuareg
+  :config
+  (electric-indent-mode 0)
+  (face-spec-set
+   'tuareg-font-lock-constructor-face
+   '((((class color) (background light)) (:foreground "SaddleBrown"))
+     (((class color) (background dark)) (:foreground "burlywood1"))))
+  (add-hook 'tuareg-mode-hook
+            (lambda ()
+              (prettify-symbols-mode 0))))
+(use-package merlin
+  :config
+  (add-hook 'tuareg-mode-hook 'merlin-mode t)
+  (with-eval-after-load 'company
+    (add-to-list 'company-backends 'merlin-company-backend)))
+
+(require 'ocamlformat)
+(add-hook 'tuareg-mode-hook
+          (lambda ()
+            (define-key tuareg-mode-map (kbd "C-M-<tab>") #'ocamlformat)
+            (add-hook 'before-save-hook #'ocamlformat-before-save)))

Finding your way around the code

Even to an experienced OCaml developer, there are certain practices in the stanc3 codebase which might be unfamiliar. We have tried to document those on our Core ideas page.

Advanced development

Fuzzing

OCaml has support for building binaries instrumented for use with theAFL++ fuzzing tool. This requires a new opam switch which includes the ocaml-option-afl base package.

opam switch create "stanc-fuzz" --packages "ocaml-option-afl,ocaml.4.14.1"
+eval $(opam env)
+./scripts/install_build_deps.sh

After this, the normal build process will produce a binary ready for fuzzing.

Profiling

Profiling support is not directly provided in the stanc3 repository, but you can use the Landmarks library to profile the code.

This requires editing the dune files in the src/ directory to include the landmarks library, similar to how the bisect_ppx library is instrumented by default.

(instrumentation
+  (backend landmarks --auto))

You can then build a profiled version of the code by running dune build src/stanc/stanc.exe --instrument-with landmarks --force.

To configure the profiler at runtime, consult the Landmarks documentation. A good starting command is

OCAML_LANDMARKS="on,output=prof.txt" stanc.exe mymodel.stan
diff --git a/stanc/index.html b/stanc/index.html new file mode 100644 index 000000000..ec7338a5b --- /dev/null +++ b/stanc/index.html @@ -0,0 +1,2 @@ + +index (stanc.index)

stanc3 Developer Documentation

This document provides the documentation for the internals of the stanc3 compiler intended for developers.

If you are looking for the user-facing documentation, see this section of the Stan User's Guide.

Getting Started

See the Getting Started page for information on setting up a stanc3 development environment.

Resources

Here are some resources (internal and external) which may be useful to a new developer.

  • Real World OCaml, a free introduction to the OCaml language which features some of the libraries we use.

Getting Involved

  • Here are some good issues to tackle - make sure to comment on them first to see if they are still relevant.
  • We also always appreciated more documentation - either this documentation, which uses odoc, or the Stan user-facing documentation at stan-dev/docs.

Modules

The major code sections of the compiler are as follows (these are links):

These are related in the following architecture diagram

We additionally use several outside dependencies.

diff --git a/stanc/parser_messages.html b/stanc/parser_messages.html new file mode 100644 index 000000000..c13d6d698 --- /dev/null +++ b/stanc/parser_messages.html @@ -0,0 +1,19 @@ + +parser_messages (stanc.parser_messages)

Adding or changing the syntax error messages

Background

Stanc3 uses Menhir's Incremental API to provide custom error messages for when the parser detects an error. Menhir and the Incremental API are documented in the reference manual. We write the custom error messages in src/frontend/parser.messages file, which follows Menhir's messages format (documented here. Those messages are automatically integrated into the parser by the build rules defined in src/frontend/dune.

This process is less obvious than it seems and has some important to understand caveats. Please read the above section of the Menhir manual before making changes to the parser or syntax errors.

Each rule in parser.messages indicates the error state it corresponds to by specifying any stack of tokens which result in that error state.

There may be many such stacks of tokens which could correspond to the same error. Menhir will point out if there are two rules defined for the same error, but it will only show you one of them.

Modifying an existing message

  1. Find the existing error message for the parser error in question by either:

    • Searching the message file for the current error message test,
    • Compiling a stan program which throws the error message with the `--debug-parse` flag, then search for the error state number
    • OR a new rule to parser.messages corresponding to *any* stack of tokens which could trigger the error you're interested in, then let Menhir tell you the line number of the existing rule the new rule collides with
  2. Update the message of the existing rule

Example

Suppose I want to change the error message for when the program is missing a { after the model keyword.

I write an example Stan program that has the error:

parameters {
+  real x;
+}
+model
+  x ~ normal(0, 1);
+}

Now I compile this program with stanc3 using the --debug-parse option. The result:

...
+Expected "{" after "model".
+(Parse error state 685)

The parse error state I'm looking for is 685. I search the parser.messages file for "685" (perhaps with the command `grep -n 685 src/frontend/parser.messages`), and I find:

program: MODELBLOCK WHILE
+##
+## Ends in an error in state: 685.
+##
+## model_block -> MODELBLOCK . LBRACE list(vardecl_or_statement) RBRACE [ GENERATEDQUANTITIESBLOCK EOF ]
+##
+## The known suffix of the stack is as follows:
+## MODELBLOCK
+##
+
+Expected "{" after "model".

I can now replace this message with my new version

Adding new messages after the parser has been changed

Often a new language feature will need new syntax messages. The command dune build @update_messages will add dummy error messages to parser.messages that you can replace. This sub-command requires Python 3 to be installed.

It is crucial to understand that the example programs Menhir provides in this file may not represent all possible programs leading to this state. See this section of the Menhir manual for specific advice.

Adding new parser states

Sometimes it is desirable to give a more specific error message than is possible with the default construction of the parser. One way around this is to add an additional state to the parser which matches the desired structure, followed by a token which cannot ever be reached. We define UNREACHABLE for this purpose.

Suppose I actually wanted to add a new message that would only show when a more specific error is made; maybe I want a special message for when model followed by a declaration. To do this I need to change the parser grammar in src/frontent/parser.mly to split off a new error state for the situation I want to catch. It is important to make sure not to change the behavior of the parser, so I should guarantee that he new rule will never successfully be built by terminating it with a token that can never occur. For example, I could change model = MODELBLOCK LBRACE ... to model = MODELBLOCK LBRACE ... | MODELBLOCK REAL UNREACHABLE.

This is enough to create a new parser state with a different error message.

Much like after a change to the parser for a new feature, after creating a new parser state, you should run dune build @update_messsages to check the new entry and generate a error template in parser.messages.