diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/.latexmkrc b/.latexmkrc index 0302729..837504c 100644 --- a/.latexmkrc +++ b/.latexmkrc @@ -1,4 +1,6 @@ -ensure_path( 'TEXINPUTS', './configuration/' ); +ensure_path( 'TEXINPUTS', 'configuration' ); +ensure_path( 'TEXINPUTS', 'configuration/packages//'); +ensure_path( 'LUAINPUTS', 'configuration' ); $pdf_mode=4; $lualatex = 'lualatex %O -halt-on-error -synctex=1 --shell-escape %S'; $out_dir = '.'; @@ -23,7 +25,7 @@ sub mmz_analyze { my $base = $$Pbase; my $mmz_file = "$aux_dir1$base.mmz"; $mmz_has_new = ''; - + if (! -e $mmz_file) { print "mmz_analyze: No mmz file '$mmz_file', so memoize is not being used.\n"; return 0; @@ -46,7 +48,7 @@ sub mmz_analyze { s/\s*$//; # Remove trailing space, including new lines if ( /^\\mmzNewExtern\s+{([^}]+)}/ ) { # We have a new memo item without a corresponding pdf file. - # It will be put in the aux directory. + # It will be put in the aux directory. my $file = "$aux_dir1$1"; print "mmz_analyze: new extern for memoize: '$file'\n"; push @externs, $file; @@ -64,11 +66,11 @@ sub mmz_analyze { close $mmz_fh; foreach (@dirs) { if ( ! -e ) { - my @cmd = ( @memoize_extract, '--mkdir', $_ ); + my @cmd = ( @memoize_extract, '--mkdir', $_ ); print "mmz_analyze: Making directory '$_' safely by running\n", " @cmd\n"; mkdir $_; - } + } } rdb_ensure_files_here( @externs ); @@ -77,7 +79,7 @@ sub mmz_analyze { if (@externs ) { $mmz_has_new = $mmz_file; } - return 0; + return 0; } #----------------------------------------------------- @@ -94,7 +96,7 @@ sub mmz_extract_new { print "mmz_extract_new : ENV{$_} = '$ENV{$_}'\n"; } my @cmd = (@memoize_extract, '--format', 'latex', - '--pdf', $pdf_file, $mmz_file_no_path ); + '--pdf', $pdf_file, $mmz_file_no_path ); if ( ! -e $pdf_file ) { warn "mmz_extract_new: Cannot generate externs here, since no pdf file generated\n"; @@ -116,7 +118,7 @@ sub mmz_cleanup { use strict; print "============= I am mmz_cleanup \n"; my @cmd = ( @memoize_clean, '--all', '--yes', - '--prefix', $aux_dir, + '--prefix', $aux_dir, "$aux_dir1$$Pbase.mmz" ); print "mmz_cleanup: Running\n @cmd\n"; my $ret = system @cmd; @@ -125,4 +127,3 @@ sub mmz_cleanup { } #----------------------------------------------------- - diff --git a/configuration.lua b/configuration.lua new file mode 100644 index 0000000..2256b18 --- /dev/null +++ b/configuration.lua @@ -0,0 +1,259 @@ +--- Configuration module for LuaLaTeX document +-- +-- This module provides a centralized configuration system for LaTeX document settings, +-- asset management, references, and typesetting options. The configuration can be +-- overridden by a user-specific configuration file in the repository root. +-- +-- @module configuration +-- @return Configuration table + +local configuration = {} + +-- Build system configuration +-- Controls output directories and build artifacts +configuration.build = { + -- Directory for intermediate build files (aux, log, etc.) + dir = 'build/', + -- Directory for final output files (PDFs) + out = 'pdf/' +} + +-- Asset management configuration +-- Controls how external assets (images, tables, etc.) are handled +configuration.assets = { + -- Root directory for all assets + root = 'assets/', + -- Enable custom LaTeX macros for quick insertion of figures/tables/etc. + shortcuts = true, + -- Enable externalization of assets (caching processed versions) + -- For externalization 'memoize' package is used. Note that this + -- requires quite modern LaTeX version, as well as some external + --- dependicies, like Perl and PDF::API2 library + externalize = true, + -- Asset type configurations: + -- 'keep' - memoize puts files in the same directory as source + -- 'build' - memoize puts files into build directory + -- 'none' - disable memoization for this asset type + dirs = { + images = { path = 'images/', extern = 'keep' }, -- Raster/vector images + tables = { path = 'tables/', extern = 'build' }, -- Data tables, CSV files + diagrams = { path = 'diagrams/', extern = 'keep' }, -- Diagram source files + listings = { path = 'listings/', extern = 'keep' } -- Code listings + } +} + +-- References and bibliography configuration +-- Manages citations, indexes, and knowledge graphs +configuration.references = { + enable = true, + --- Tooling for references + hyperref = { + shortref = { + {csname = 'picref', reftext = 'рис.'}, + {csname = 'tabref', reftext = 'табл.'}, + {csname = 'lstref', reftext = 'листинг'}, + {csname = 'digref', reftext = 'диаг.'}, + {csname = 'secref', reftext = 'разд.'} + }, + hypersetup = { + breaklinks=true, + hyperindex=true, + colorlinks=true, + hidelinks=false, + hypertexnames='false', --- fix, cause right now false boolean filds are ignored + unicode=true, + pdfauthor={'Unknown Author'}, + pdfsubject={'Document Subject'}, + pdfkeywords={'keyword1, keyword2'}, + pdftitle={'Document Title'}, + bookmarksopen=false, + linktocpage=true, + plainpages=false, + pdfpagelabels=true, + -- Link colors + urlcolor='blue', + linkcolor='red', + filecolor='red', + citecolor='blue' + } + }, + -- Bibliography sources configuration + bibtex = { + -- Base path for bibliography files + path = 'assets/bibliography', + style = 'numeric', + -- List of bibliography databases with display names + bibliographies = { + { + name = 'main', -- Main literature bibliography + title = 'Список литературы', -- Main literature bibliography + files = 'main.bib', + }, + -- { + -- name = 'git', -- Software/online sources + -- title = 'Репозитории, трекеры, обсуждения', -- Software/online sources + -- files = { 'repos.bib', 'issues.bib' }, + -- } + } + }, + -- Index generation configuration (imakeidx package) + indexes = { + -- Enable index generation + enable = true, + -- imakeidx options + build = {'makeindex'}, + -- Configure individual indexes + list = { + -- Symbol index + { + name = 'notation', + title = 'Список обозначений', + intoc = true, + --columns = 2, + --columnsep = '15pt', + --columnseprule = true, + }, + -- Main subject index + { + name = nil, + title = 'Предметный указатель', + intoc = true, + } + } + }, + -- Knowledge configuration (knowledge package) + -- knowledge = { + -- Enable knowledge graph functionality + -- enable = true, + -- Configuration file for knowledge package + -- config = '.knowledgerc.tex' + -- } +} + +-- Float environment configuration +-- Controls figures, tables, listings, and other floating elements +configuration.floats = { + -- Enable plugin for handling macroses + enable = true, + -- Graphics scaling and sizing options + images = { + -- Enable quiver package for commutative diagrams + quiver = 'enabled', -- alternative is 'draft' or 'disabled' + -- TODO: Enable drawio package for draw.io diagram integration + -- drawio = 'enabled', -- alternative is 'draft' or 'disabled' + + -- Default caption position + caption = 'below', + -- Default width ratio to \linewidth for regular figures (0.0-1.0) + figurewidth = 0.9, + -- Default width ratio for wrapfigure environments (0.0-1.0) + wrapfigurewidth = 0.4, + --- Whether or not create separate list of figures + makeidx = true, + }, + tables = { + enables = true, + caption = 'above', + makeidx = true, + }, + -- Code listing configuration + listing = { + -- Enable listing environment support + enable = true, + caption = 'above', + -- Enable syntax highlighting via pygmentize + pygmentize = true, + makeidx = true, + }, + -- Caption and labeling configuration + captions = { + -- Language for automatic captions (e.g., "Figure", "Table") + lang = 'ru', + } +} + +-- Typesetting and text macros configuration +-- Controls custom text formatting, shortcuts, and theorem environments +configuration.typesetting = { + -- Enable custom typesetting macros + enable = true, + + -- Text shortcut configuration + shortcuts = true, + + -- Formatting features + formatting = { + todo = true, + ulem = true, + }, + -- Theorem and proof environment configuration + theorems = { + -- Enable theorem-like environments (theorem, lemma, proof, etc.) + enable = true, + --- Theorem naming style + --- plain: + --- theorem - numbered theorem + --- theorem* - unnumbered theorem + --- framed: + --- Theorem - numbered theorem, framed + --- Theorem* - unnumbered theorem, framed + --- theorem - numbered theorem, not framed + --- theorem* - unnumbered theorem, not framed + thmstyle = 'framed', + enviroments = { + {envname = 'theorem', name = 'Теорема'}, + {envname = 'lemma', name = 'Лемма'}, + {envname = 'proposition', name = 'Предложение'}, + {envname = 'definition', name = 'Определение'}, + {envname = 'remark', name = 'Замечание'}, + + } + } +} + +-- Mathematical typesetting configuration +-- Controls math macros, symbols, and specialized notation +configuration.mathematics = { + -- Enable mathematical typesetting macros + enable = true, + mathcommand = 'error', + -- Mathematical domain-specific plugin configuration + plugins = { + -- Algebra plugin: groups, rings, fields, linear algebra + algebra = { + enable = true, -- Enable algebra macros + --knowledgify = true, -- Generate knowledge graph entries + --indexify = false, -- Add to index automatically + }, + -- Calculus plugin: limits, derivatives, integrals + calculus = { + enable = true, + --knowledgify = true, + --indexify = false + }, + -- Combinatorics plugin: combinations, permutations, graphs + combinatorics = { + enable = true, + --knowledgify = true, + --indexify = false + }, + -- Probability plugin: distributions, expectations, random variables + probability = { + enable = true, + --knowledgify = true, + --indexify = false, + }, + -- Foundations plugin: set theory, logic, category theory + foundations = { + enable = true, + --knowledgify = true, + --indexify = false + }, + -- Complexity plugin: Big-O notation, complexity classes + complexity = { + enable = false -- Disabled by default + } + } +} + +return configuration diff --git a/configuration/designdoc.cls b/configuration/designdoc.cls deleted file mode 100644 index 6299715..0000000 --- a/configuration/designdoc.cls +++ /dev/null @@ -1,93 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{designdoc}[2025/09/07 Design Document class] -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}} -\ProcessOptions\relax -\LoadClass[a4paper]{report} - -\usepackage{iftex} -%% Разрешить компиляцию только с движком LuaTex -\makeatletter -\ifLuaTeX -\else - \ifXeTeX - \else - \newlinechar 64\relax - \errorcontextlines -1\relax - \immediate\write20{@ - *********************************************************@ - * LuaLaTex or XeTeX is required to compile this document.@ - * Sorry!@ - **********************************************************}% - \batchmode\read -1 to \@tempa - \fi -\fi -\makeatother - -%% Для русификации достаточно подключить пакет fontspec и -%% выбрать Unicode шрифт в котором есть кириллические глифы. Ниже -%% основным шрифтом выбирается Unicode версия шрифта Computer Modern с заcечками -\RequirePackage{fontspec} -\setmainfont{CMU Serif} -\setsansfont{CMU Sans Serif} -\setmonofont{CMU Typewriter Text} - -%% В LuaLaTeX альтернативой известного пакета babel является пакет polyglossia. -%% Теперь у нас будут переносы слов -\RequirePackage{polyglossia} -\setdefaultlanguage{russian} -\setotherlanguage{english} - -\RequirePackage{fvextra} -\RequirePackage[autostyle]{csquotes} % Правильные кавычки в зависимости от языка - -%Отключить предупреждения об кастномной использовании пакетов "You have requested package..." -\RequirePackage{silence} -\WarningFilter{latex}{You have requested package} - - - -%%%%%%%%%%%%%%%%% -%% Page layout %% -%%%%%%%%%%%%%%%%% - -\RequirePackage{rotating} % Повороты страницы -\RequirePackage{pdflscape} % Правильное отображение альбомной страницы в pdf файле -\RequirePackage[pagestyles]{titlesec} -\RequirePackage{fancyhdr} % Настройка колонтиутулов -\RequirePackage{geometry} - - -\geometry{% - left=2cm, - right=2cm, - top=2cm, - bottom=2cm, - bindingoffset=0cm -} - -\geometry{% - a4paper, - margin=1cm, - includefoot, - includehead -} - -\titleformat{\chapter}[frame]{\Large}{% - \filright - \footnotesize - \enspace Раздел~\arabic{chapter}\enspace% -}{1.5ex}{\bfseries\filcenter} - - -\usepackage{xparse} -\usepackage{macroses/references} -\usepackage{macroses/mathematics} -\usepackage{macroses/typesetting} -\usepackage{macroses/floats} - -%\input{configuration/macroses/utils/references/knowledgeconf.tex} -\AtBeginDocument{% - \allowdisplaybreaks - \tikzset{every picture/.style={line width=0.75pt}} %set default line width to 0.75pt -} -\sloppy diff --git a/configuration/macroses/floats.sty b/configuration/macroses/floats.sty deleted file mode 100644 index 932a73b..0000000 --- a/configuration/macroses/floats.sty +++ /dev/null @@ -1,18 +0,0 @@ -\ProvidesPackage{macroses/floats}[2025/09/13 Utilities for handling floats] - - -\RequirePackage{float} -\RequirePackage{caption} -\RequirePackage{subcaption} -\RequirePackage{adjustbox} - -% Библиотека для экстернализации tikz-графики и других графических объектов -% Стандаратная библиотека externalize больше не поддерживается и там нет нужных -% вещей, например поддержки относительных путей -\RequirePackage{memoize} - - -\input{macroses/utils/floats/images} -\input{macroses/utils/floats/tables} -\input{macroses/utils/floats/listings} - diff --git a/configuration/macroses/mathematics.sty b/configuration/macroses/mathematics.sty deleted file mode 100644 index 2ecc53a..0000000 --- a/configuration/macroses/mathematics.sty +++ /dev/null @@ -1,215 +0,0 @@ -\ProvidesPackage{macroses/mathematics}[2025/09/13 Utilities for typsetting formulas] - -% AMS packages -\RequirePackage{amsmath} -\RequirePackage{amsfonts} -\RequirePackage{amssymb} -% Generic interfaces -\RequirePackage{mathcommand} -\RequirePackage{mathtools} -% Fonts -\RequirePackage{upgreek} -\RequirePackage{dsfont} -\RequirePackage{euscript} - - -% Additional fonts and symbols - -%% Importing usefull MnSymbol glyphs -%% Source: https://tex.stackexchange.com/questions/450691/create-diamond-with-a-dash-in-it/450703#450703 - -%%% MnSymbol Font Table -% \fonttable{MnSymbolA12} -% \newpage -% \fonttable{MnSymbolB12} -% \newpage -% \fonttable{MnSymbolC12} -% \newpage -% \fonttable{MnSymbolD12} -% \newpage -% \fonttable{MnSymbolE12} -% \newpage -% \fonttable{MnSymbolF12} - - -%\def\ImportFromMnSymbol#1{% -% \DeclareFontFamily{U} {MnSymbol#1}{} -% \DeclareFontShape{U}{MnSymbol#1}{m}{n}{ -% <-6> MnSymbol#15 -% <6-7> MnSymbol#16 -% <7-8> MnSymbol#17 -% <8-9> MnSymbol#18 -% <9-10> MnSymbol#19 -% <10-12> MnSymbol#110 -% <12-> MnSymbol#112}{} -% \DeclareFontShape{U}{MnSymbol#1}{b}{n}{ -% <-6> MnSymbol#1-Bold5 -% <6-7> MnSymbol#1-Bold6 -% <7-8> MnSymbol#1-Bold7 -% <8-9> MnSymbol#1-Bold8 -% <9-10> MnSymbol#1-Bold9 -% <10-12> MnSymbol#1-Bold10 -% <12-> MnSymbol#1-Bold12}{} -% \DeclareSymbolFont{MnSy#1} {U} {MnSymbol#1}{m}{n} -%} -%\newcommand\DeclareMnSymbol[4]{\DeclareMathSymbol{#1}{#2}{MnSy#3}{#4}} -%%%% - - - -% patch for diffuclt opearator limits, etc -\RequirePackage{stackrel} -% patch for scaleable sums, integrals products etc -\RequirePackage{scalerel} -\RequirePackage{exscale} -% patch for typographically inline fractions -\RequirePackage{xfrac} -% patch for typographically correct braces -\RequirePackage{mleftright} -% patch for vector arrows -\RequirePackage[d]{esvect} - -%% mathtools default behaviour is that *-command use auto-scaling -%% while non-* do not. Here we switch behaviour -\newcommand\swapifbranches[3]{#1{#3}{#2}} -\makeatletter -\MHInternalSyntaxOn -\patchcmd{\DeclarePairedDelimiter}{\@ifstar}{\swapifbranches\@ifstar}{}{} -\patchcmd{\DeclarePairedDelimiterXPP}{\@ifstar}{\swapifbranches\@ifstar}{}{} -\MHInternalSyntaxOff -\makeatother - -%% Correct bracing in commands -\newmathcommand{\leftoperatorbrace}{\mleft(} -\newmathcommand{\rightoperatorbrace}{\mright)} -\newmathcommand{\leftoperatorbracket}{\mleft[} -\newmathcommand{\rightoperatorbracket}{\mright]} - -%% Improve sizing of - and + in supscripts/subscripts -%%%% TODO: improve hardcoring -\newcommand{\medminus}{\mathop{\mathsmaller{-}}} -\newcommand{\medplus}{\mathop{\mathsmaller{+}}} -\newcommand{\pinfty}{{\raisebox{0.05ex}{\scaleobj{0.45}{+}}}\infty} -\newcommand{\ninfty}{{\raisebox{0.05ex}{\scaleobj{0.45}{-}}}\infty} - -%% Force usage of \leqslant and \geqslant instead of -%% \leq and \geq -%\disablecommand{\leq\geq} -%\suggestcommand{\leq}{Use the better looking \leqslant.} -%\suggestcommand{\geq}{Use the better looking \geqslant.} - - -%%%% Introduce some commons -\let\Proj\relax -\DeclareMathOperator{\Proj}{Proj} -\DeclareMathOperator{\argmax}{argmax} -\DeclareMathOperator{\argmin}{argmin} -\newmathcommand{\loc}{\mathrm{loc}} -\newmathcommand{\const}{\mathrm{const}} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%% CUSTOM COMMANDS %%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -\ExplSyntaxOn - -% Trick to define PIE commands that can absorbs PIE first and only then produce arguments. -% Define your command as usual PIE command (so, PIE's aren't expanded or parsed); -% BUT PIE's will be respectevly #1, #2 and #3 (for details see mathcommand docs). -% Then use this command to allow firstly parse PIEF and only then parse arguments; -\NewDocumentCommand{\piefication}{m}{ - \exp_args:Nc\NewCommandCopy{old_\cs_to_str:N#1}{#1} - \cs_set:cpn{internal_\cs_to_str:N#1:w}{\exp_args:Nc\__mathcommand_absorb_PIE:nw{old_\cs_to_str:N#1}} - \exp_args:Nnc\RenewCommandCopy{#1}{internal_\cs_to_str:N#1:w} -} - -% \DeclarePairedSplitDelimiter --- same as DeclarePairedDelimiter -% but also alignes vertical bar inside your command, see examples -% of set command. -%% WARNING:: If you use | inside sush delimeter it will fail. E.g. -%% \set{ x \in \R | |x| > 1} -%% will result in error. Use \lvert and \rvert instead, or abs: -%% \set{ x \in \X | \abs{x} > 1} -\NewDocumentCommand{\DeclarePairedSplitDelimiter}{mmm}{ - %% Firstly we define internal variants in case when there is split, and when there is none - \exp_args:Nc\DeclarePairedDelimiter{internal_base_\cs_to_str:N#1}{#2}{#3} - \exp_args:Nc\DeclarePairedDelimiterX{internal_split_\cs_to_str:N#1}[2]{#2}{#3} - {##1 \nonscript\:\delimsize\vert\allowbreak\nonscript\:\mathopen{} ##2} - %% Now we create internal version of command - \exp_args:Nc\NewDocumentCommand{internal_\cs_to_str:N#1}{omm}{ - \IfNoValueTF{##1}{ - \IfNoValueTF{##3}{ - \use:c{internal_base_\cs_to_str:N#1}{##2} - }{ - \use:c{internal_split_\cs_to_str:N#1}{##2}{##3} - } - }{ - \IfNoValueTF{##3}{ - \use:c{internal_base_\cs_to_str:N#1}*[##1]{##2} - }{ - \use:c{internal_split_\cs_to_str:N#1}*[##1]{##2}{##3} - } - } - } - %% Finaly, create latex2e interface - \NewDocumentCommand{#1}{o >{\SplitArgument{1}{|} } m}{ - \IfNoValueTF{##1}{ - \use:c{internal_\cs_to_str:N#1}##2 - }{ - \use:c{internal_\cs_to_str:N#1}[##1]##2 - } - } -} - -% \NewTemplateCommand creates a template-macro -% \TemplateInstance specifies template-args -\NewDocumentCommand{\NewTemplateCommand}{m r<> m m}{\NewDocumentCommand{#1}{#2#3}{#4}} -\NewDocumentCommand{\TemplateInstance}{m m >{\SplitList {,}}r<>}{\NewDocumentCommand{#1}{}{#2#3}} -\NewDocumentCommand{\TemplateInstancePIE}{m m >{\SplitList {,}}r<>}{\NewDocumentCommand{#1}{}{#2#3}\piefication{#1}} - -\ExplSyntaxOff - -%%%%%%%%%%%%%%%%%%%%% -%% Custom commands %% -%%%%%%%%%%%%%%%%%%%%% - - -% %%%% Some enhancements -% \newmathcommand{\eqdef}{% -% \mathrel{{\stackrel{\mbox{\tiny def}}{=}}}% -% } - -% % Shortcuts for math mode -% \renewmathcommand{\i}{\imath} -% \renewmathcommand{\j}{\jmath} - -% Bigger operators -%\sum_{i = 1}^{n}{ -% \mleft(....\mright. -%} -\ExplSyntaxOn -\NewTemplateCommand\tmpl_scalable_operation{mmmm}{ - \scalerel{#1\limits#3#4#2}{#5} -} -\NewCommandCopy{\sum_symbol:}{\sum} -\NewCommandCopy{\int_symbol:}{\int} -\NewCommandCopy{\prod_symbol:}{\prod} -\TemplateInstancePIE\scaled_sum_symbol:\tmpl_scalable_operation<\sum_symbol:> -\TemplateInstancePIE\scaled_int_symbol:\tmpl_scalable_operation<\int_symbol:> -\TemplateInstancePIE\scaled_prod_symbol:\tmpl_scalable_operation<\prod_symbol:> -\RenewDocumentCommand{\sum}{s}{\IfBooleanTF{#1}{\scaled_sum_symbol:}{\sum_symbol:}} -\RenewDocumentCommand{\int}{s}{\IfBooleanTF{#1}{\scaled_int_symbol:}{\int_symbol:}} -\RenewDocumentCommand{\prod}{s}{\IfBooleanTF{#1}{\scaled_prod_symbol:}{\prod_symbol:}} -\ExplSyntaxOff - -%%%%%%%%%%%%%%%%%%% -%% Math commands %% -%%%%%%%%%%%%%%%%%%% - -\input{macroses/utils/mathematics/algebra} -\input{macroses/utils/mathematics/calculus} -\input{macroses/utils/mathematics/combinatorics} -\input{macroses/utils/mathematics/foundations} -\input{macroses/utils/mathematics/probability} \ No newline at end of file diff --git a/configuration/macroses/quiver.sty b/configuration/macroses/quiver.sty deleted file mode 100644 index 83e65da..0000000 --- a/configuration/macroses/quiver.sty +++ /dev/null @@ -1,50 +0,0 @@ -% *** quiver *** -% A package for drawing commutative diagrams exported from https://q.uiver.app. -% -% This package is currently a wrapper around the `tikz-cd` package, importing necessary TikZ -% libraries, and defining new TikZ styles for curves of a fixed height and for shortening paths -% proportionally. -% -% Version: 1.5.5 -% Authors: -% - varkor (https://github.com/varkor) -% - AndréC (https://tex.stackexchange.com/users/138900/andr%C3%A9c) - - -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{quiver}[2025/06/24 quiver] - -% `tikz-cd` is necessary to draw commutative diagrams. -\RequirePackage{tikz-cd} -% `amssymb` is necessary for `\lrcorner` and `\ulcorner`. -\RequirePackage{amssymb} -% `calc` is necessary to draw curved arrows. -\usetikzlibrary{calc} -% `pathmorphing` is necessary to draw squiggly arrows. -\usetikzlibrary{decorations.pathmorphing} -% `spath3` is necessary to draw shortened edges. -\usetikzlibrary{spath3} - -% A TikZ style for curved arrows of a fixed height, due to AndréC. -\tikzset{curve/.style={settings={#1},to path={(\tikztostart) - .. controls ($(\tikztostart)!\pv{pos}!(\tikztotarget)!\pv{height}!270:(\tikztotarget)$) - and ($(\tikztostart)!1-\pv{pos}!(\tikztotarget)!\pv{height}!270:(\tikztotarget)$) - .. (\tikztotarget)\tikztonodes}}, - settings/.code={\tikzset{quiver/.cd,#1} - \def\pv##1{\pgfkeysvalueof{/tikz/quiver/##1}}}, - quiver/.cd,pos/.initial=0.35,height/.initial=0} - -% A TikZ style for shortening paths without the poor behaviour of `shorten <' and `shorten >'. -\tikzset{between/.style n args={2}{/tikz/spath/at end path construction={ - \tikzset{spath/split at keep middle={current}{#1}{#2}} -}}} - -% TikZ arrowhead/tail styles. -\tikzset{tail reversed/.code={\pgfsetarrowsstart{tikzcd to}}} -\tikzset{2tail/.code={\pgfsetarrowsstart{Implies[reversed]}}} -\tikzset{2tail reversed/.code={\pgfsetarrowsstart{Implies}}} -% TikZ arrow styles. -\tikzset{no body/.style={/tikz/dash pattern=on 0 off 1mm}} - -\endinput - diff --git a/configuration/macroses/references.sty b/configuration/macroses/references.sty deleted file mode 100644 index e4a1855..0000000 --- a/configuration/macroses/references.sty +++ /dev/null @@ -1,5 +0,0 @@ -\ProvidesPackage{references}[2025/09/13 Utilities for handling references] - -\input{macroses/utils/references/hyperrefconf} -\input{macroses/utils/references/biblatexconf} -%\input{macroses/utils/references/knowledgeconf} \ No newline at end of file diff --git a/configuration/macroses/typesetting.sty b/configuration/macroses/typesetting.sty deleted file mode 100644 index 162ef6b..0000000 --- a/configuration/macroses/typesetting.sty +++ /dev/null @@ -1,14 +0,0 @@ -\ProvidesPackage{macroses/typesetting}[2025/09/13 Utilities for typesetting text] - -\RequirePackage{stackengine} % Вертикальные стеки из box-ов -\RequirePackage{microtype} % Полезные типографические ништячки, по-хорошему требует LuaLaTeX -\RequirePackage[normalem]{ulem} % Дополнительные варианты форматирования текста, например подчеркивание или зачеркивание -\RequirePackage{multicol} % Текст в несколько колонок -\RequirePackage[useregional]{datetime2} % Форматирование дат - -\renewcommand*{\thefootnote}{\arabic{footnote}} % Сноски нумеруются (арабскими) цифрами -\setlength{\columnsep}{1cm} - -\input{macroses/utils/typesetting/mathematics} -\input{macroses/utils/typesetting/shorthands} -\input{macroses/utils/typesetting/lists} diff --git a/configuration/macroses/utils/floats/images.tex b/configuration/macroses/utils/floats/images.tex deleted file mode 100644 index 56b77c0..0000000 --- a/configuration/macroses/utils/floats/images.tex +++ /dev/null @@ -1,43 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%% -%% TikZ %% -%%%%%%%%%%%%%%%%%%%%%%%%% - -\RequirePackage{tikz} -\RequirePackage{pgfplots} -\RequirePackage{graphics} -\RequirePackage{pdfpages} -\RequirePackage{wrapfig} - - -\pgfplotsset{% - every tick label/.append style = {font=\tiny}, - every axis label/.append style = {font=\scriptsize} -} -\pgfplotsset{compat = newest} - -\newcommand{\includetikz}[1]{% - \input{assets/images/#1}% -} - -% `tikz-cd` is necessary to draw commutative diagrams. -\RequirePackage{tikz-cd} -\RequirePackage{macroses/quiver} - -% TikZ arrowhead/tail styles. -\tikzset{tail reversed/.code={\pgfsetarrowsstart{tikzcd to}}} -\tikzset{2tail/.code={\pgfsetarrowsstart{Implies[reversed]}}} -\tikzset{2tail reversed/.code={\pgfsetarrowsstart{Implies}}} -\tikzset{no body/.style={/tikz/dash pattern=on 0 off 1mm}} - - - -%%%% Graphics - -\graphicspath{{assets/images/}} -\DeclareGraphicsExtensions{.pdf,.png,.jpg} - -\newlength{\figurewidth} -\setlength{\figurewidth}{0.9\linewidth} -\newlength{\wrapfigurewidth} -\setlength{\wrapfigurewidth}{0.4\linewidth} - diff --git a/configuration/macroses/utils/floats/listings.tex b/configuration/macroses/utils/floats/listings.tex deleted file mode 100644 index 78eb61e..0000000 --- a/configuration/macroses/utils/floats/listings.tex +++ /dev/null @@ -1,37 +0,0 @@ -\RequirePackage{listings} -\RequirePackage[newfloat]{minted} - -% Перевод заголовков в листингах -\renewcommand\lstlistingname{Листинг} -\renewcommand\lstlistlistingname{Листинги} -% Отступ перед подписью листинга - -\DeclareCaptionFormat{listing}{ - \hspace{15pt}#1#2#3 -} -\captionsetup[lstlisting]{ - format=listing, - margin=0pt -} -\lstset{ - mathescape=true, - identifierstyle=\ttfamily, - keywordstyle=\bfseries, - commentstyle=\scriptsize\rmfamily, - basewidth={0.5em,0.5em}, - fontadjust=true, -} - -% Требует Python с пакетом pygmentize, зато позволяет верстать очень годные листинги с синтаксической подсветкой -% Запретим minted подсвечивать по его мнению лексические ошибки -\AtBeginEnvironment{minted}{\dontdofcolorbox} -\def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} - -% Общая настройка -\SetupFloatingEnvironment{listing}{name=Листинг} -\SetupFloatingEnvironment{listing}{listname=Листинги} -\captionsetup[listing]{ - format=listing, - margin=0pt, -} - diff --git a/configuration/macroses/utils/floats/tables.tex b/configuration/macroses/utils/floats/tables.tex deleted file mode 100644 index 1388d4c..0000000 --- a/configuration/macroses/utils/floats/tables.tex +++ /dev/null @@ -1,7 +0,0 @@ -\RequirePackage[table]{xcolor} -\RequirePackage{multirow} -\RequirePackage{colortbl} -\RequirePackage{makecell} -\RequirePackage{longtable} - - diff --git a/configuration/macroses/utils/mathematics/algebra.tex b/configuration/macroses/utils/mathematics/algebra.tex deleted file mode 100644 index 9ba5a55..0000000 --- a/configuration/macroses/utils/mathematics/algebra.tex +++ /dev/null @@ -1,59 +0,0 @@ - -%%%% -%% Algebra -%%%% - -%%%% Complex numbers -\let\Re=\undefined -\let\Im=\undefined -\newmathcommand{\Re}{\mathop{\mathrm{Re}}} % Real part -\newmathcommand{\Im}{\mathop{\mathrm{Im}}} % Imaginary part -\newmathcommand{\conj}[1]{\overline{#1}} % Complex conjugate -\DeclarePairedDelimiter\abs{\lvert}{\rvert} % Absolute value - -%%%% Basic algebraic structures -\newcommand*{\bbstruct}[1]{\mathbb{#1}} -\newmathcommand{\N}{\bbstruct{N}} -\newmathcommand{\Z}{\bbstruct{Z}} -\newmathcommand{\Q}{\bbstruct{Q}} -\newmathcommand{\R}{\bbstruct{R}} -\newmathcommand{\C}{\bbstruct{C}} -\ifdefined\H% - \renewmathcommand{\H}{\bbstruct{H}} -\else - \newmathcommand{\H}{\bbstruct{H}} -\fi - -%%%% Linear algebra: - -% norm, scalar and cross product -\DeclarePairedDelimiterX\norm[1]\lVert\rVert{\ifblank{#1}{\:\cdot\:}{#1}} % Vector norm -\DeclarePairedDelimiterX\spr[2]{\langle}{\rangle}{\ifblank{#1}{\:\cdot\:}{#1},\ifblank{#2}{\:\cdot\:}{#2}} % Scalar product -\DeclarePairedDelimiterX\cpr[2]{\lbrack}{\rbrack}{\ifblank{#1}{\:\cdot\:}{#1},\ifblank{#2}{\:\cdot\:}{#2}} % Cross product - -% Changing \vv to \vec and generating shorthands for vectors: -% \va is \vec{a}, \vb is \vec{b} and so on -\RenewCommandCopy{\vec}{\vv} -\let\vv\relax -\LoopCommands{abcdefghklmnopqrstuvwxyz}[v#1]{\newmathcommand#2{\vec{#1}}} -\newmathcommand{\vi}{\vec{\imath}} -\newmathcommand{\vj}{\vec{\jmath}} - - -% matrix operations -\DeclareMathOperator{\tr}{tr} % trace -\DeclareMathOperator{\rk}{rank} % rank -\DeclareMathOperator{\perm}{perm} % permament - - -%%%% Number theory - -% gcd, lcm -\let\gcd\relax -\DeclareMathOperator{\gcd}{gcd} % Greatest common divisior -\DeclareMathOperator{\lcm}{lcm} % lowest common multiple - -% Paired delimeters for ceil and floor -\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} -\DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor} - diff --git a/configuration/macroses/utils/mathematics/calculus.tex b/configuration/macroses/utils/mathematics/calculus.tex deleted file mode 100644 index 8976da7..0000000 --- a/configuration/macroses/utils/mathematics/calculus.tex +++ /dev/null @@ -1,36 +0,0 @@ - -%%%% -%% Calcus -%%%% - -%%%% Commons -\DeclarePairedDelimiterX\interval[2]{\langle}{\rangle}{#1;#2} % interval -\DeclareMathOperator{\sign}{sign} % signum function -\DeclareMathOperator{\supp}{supp} % funtction support -\newmathcommand{\dif}{\mathop{}\!d} % Small differntial -\newmathcommand{\Dif}{\mathop{}\!D} % Big differntial - -%%%% Derivative fractions -\ExplSyntaxOn -% Generic template -\NewTemplateCommand\tmpl_derivative_frac{mmm mm}{ - \IfEmptyTF{#3}{#2{#1#5#6}{#1#7#5#4}}{\PackageError{Primes are not allowed to be before \verb|od|-like commands}} -} - -\TemplateInstancePIE\od\tmpl_derivative_frac<\dif, \frac> -\TemplateInstancePIE\lod\tmpl_derivative_frac<\dif, \sfrac> -\TemplateInstancePIE\tod\tmpl_derivative_frac<\dif, \tfrac> -\TemplateInstancePIE\dod\tmpl_derivative_frac<\dif, \dfrac> - -\TemplateInstancePIE\pd\tmpl_derivative_frac<\partial, \frac> -\TemplateInstancePIE\lpd\tmpl_derivative_frac<\partial, \sfrac> -\TemplateInstancePIE\tpd\tmpl_derivative_frac<\partial, \tfrac> -\TemplateInstancePIE\dpd\tmpl_derivative_frac<\partial, \dfrac> -\ExplSyntaxOff - - -%%%% Multivariable derivatives -\let\div\relax -\DeclareMathOperator{\grad}{grad} -\DeclareMathOperator{\rot}{rot} -\DeclareMathOperator{\div}{div} diff --git a/configuration/macroses/utils/mathematics/combinatorics.tex b/configuration/macroses/utils/mathematics/combinatorics.tex deleted file mode 100644 index c5835e8..0000000 --- a/configuration/macroses/utils/mathematics/combinatorics.tex +++ /dev/null @@ -1,5 +0,0 @@ -\newmathcommand{\multbinom}[2]{\left(\kern-.3em\left(\genfrac{}{}{0pt}{}{#1}{#2}\right)\kern-.3em\right)} -\newmathcommand{\fallf}[4]{#1^\GetExponent{\underline{#4}}#3#2} -\newmathcommand{\risef}[4]{#1^\GetExponent{\overline{#4}}#3#2} -\piefication{\fallf} -\piefication{\risef} diff --git a/configuration/macroses/utils/mathematics/foundations.tex b/configuration/macroses/utils/mathematics/foundations.tex deleted file mode 100644 index 5f7ea48..0000000 --- a/configuration/macroses/utils/mathematics/foundations.tex +++ /dev/null @@ -1,51 +0,0 @@ - -%%%% -%% Foundations: Logic, set theory, topology %% -%%%% - -%%%% Logic -\newmathcommand{\excludeor}{\mathbin{\star}} - -%%%% Set theory -\DeclarePairedSplitDelimiter{\set}{\{}{\}} -% Class is a collection of sets -\newmathcommand{\class}[1]{\set{#1}} -% Class of all sets and class of all inductive sets -\newmathcommand{\UniversalClass}{\mathfrak{V}} -\newmathcommand{\InductiveClass}{\mathrm{Ind}} -% Cardinality of a set -\DeclareMathOperator{\card}{card} -% Use \varnothing as notation for empty set -\disablecommand{\emptyset} -\suggestcommand{\emptyset}{Use the better looking \varnothing.} -% Some operations on sets -\let\setminus\relax -\let\complement\relax -\newmathcommand{\setminus}{\mathbin{\circleddash}} -\newmathcommand{\symdiff}{\mathbin{\triangle}} -\newmathcommand{\complement}[1]{\overline{#1}} -\DeclareMathOperator{\powerset}{\mathcal{P}} -% Functions and relations -\let\im\relax -\let\ker\relax -\DeclareMathOperator{\im}{im} % image -\DeclareMathOperator{\dom}{dom} % domain -\DeclareMathOperator{\cod}{cod} % codomain -\DeclareMathOperator{\ran}{ran} % range (same as codomain) -\DeclareMathOperator{\ker}{ker} % kernel -\DeclareMathOperator{\field}{field} % field of relation -% Standart mappings -\DeclareMathOperator{\id}{id} % identity -\DeclareMathOperator{\ind}{\mathds{1}} % indicator function -% Injective, surjective and bijective mappings -\newmathcommand{\injto}{\hookrightarrow} -\newmathcommand{\surto}{\twoheadrightarrow} -\newmathcommand{\bijto}{\leftrightarrow} - -%%%% Topology -\DeclareMathOperator{\Cl}{Cl} % closure -\DeclareMathOperator{\Fr}{Fr} % boundary -\DeclareMathOperator{\Int}{Int} % interior -\DeclareMathOperator{\Out}{Out} % outerior -\DeclareMathOperator{\Hom}{Hom} % Hom-sets -\newmathcommand{\Borel}{\mathcal{B}} % Algebra of borel sets diff --git a/configuration/macroses/utils/mathematics/probability.tex b/configuration/macroses/utils/mathematics/probability.tex deleted file mode 100644 index 41405ce..0000000 --- a/configuration/macroses/utils/mathematics/probability.tex +++ /dev/null @@ -1,66 +0,0 @@ - -%% Probability and statistics -\DeclarePairedSplitDelimiter{\BracesSplit}() -\DeclarePairedSplitDelimiter{\BraketSplit}[] - -% Template for \P-like commands -\NewDocumentCommand{\ConditionalFunctional}{mm}{ - \NewDocumentCommand{#1}{mmm d()}{ - \IfNoValueTF{##4}{#2##1##2##3}{#2##1##2##3\BracesSplit{##4}} - } - \piefication{#1} -} -% Template for \E-like commands -\NewDocumentCommand{\ConditionalFunctionalOperator}{mm}{ - \NewDocumentCommand{#1}{mmm d[]}{ - \IfNoValueTF{##4}{#2##1##2##3}{#2##1##2##3\BraketSplit{##4}} - } - \piefication{#1} -} -\let\P\relax -\ConditionalFunctional{\P}{\mathbb{P}} -\ConditionalFunctional{\Law}{\mathrm{Law}} -\ConditionalFunctionalOperator{\E}{\mathbb{E}} -\ConditionalFunctionalOperator{\D}{\mathbb{D}} -\ConditionalFunctionalOperator{\Skew}{\mathrm{skew}} -\ConditionalFunctionalOperator{\Kurt}{\mathrm{kurt}} -\ConditionalFunctionalOperator{\Med}{\mathrm{Med}} -\NewDocumentCommand{\IQR}{d[]}{ - \IfNoValueTF{#1}{\mathrm{IQR}}{\mathrm{IQR}\BraketSplit{#1}} -} -\NewDocumentCommand{\Mode}{d[]}{ - \IfNoValueTF{#1}{\mathrm{Mode}}{\mathrm{Mode}\BraketSplit{#1}} -} -\NewDocumentCommand{\std}{d[]}{ - \IfNoValueTF{#1}{\mathrm{std}}{\mathrm{std}\BraketSplit{#1}} -} -\NewDocumentCommand{\mad}{d[]}{ - \IfNoValueTF{#1}{\mathrm{mad}}{\mathrm{mad}\BraketSplit{#1}} -} - - -\DeclarePairedDelimiterX\covbraces[2]{(}{)}{#1,#2} % Scalar product -\newmathcommand{\Cov}[2]{\mathrm{Cov}\covbraces{#1}{#2}} - -\newmathcommand{\BiLaplace}{\mathcal{B}} -\newmathcommand{\Mellin}{\mathcal{M}} - -% Covariance operator -% Common -\newmathcommand{\Uniform}{\mathcal{U}} -\newmathcommand{\Normal}{\mathcal{N}} -\newmathcommand{\Poiss}{\mathrm{Poiss}} -\newmathcommand{\Exp}{\mathrm{Exp}} - - - - - -\newcommand{\mleb}{m_{\mathrm{Leb}}} - -\newcommand{\V}{\mathbb{V}} -\newcommand{\deq}{\overset{\text{\tiny d}}{=}} -\newcommand{\Laplace}{\mathcal{L}} -\newcommand{\cadlag}{c\`adl\`ag} - - diff --git a/configuration/macroses/utils/references/biblatexconf.tex b/configuration/macroses/utils/references/biblatexconf.tex deleted file mode 100644 index 34e1d57..0000000 --- a/configuration/macroses/utils/references/biblatexconf.tex +++ /dev/null @@ -1,10 +0,0 @@ -\RequirePackage[ - backend=biber, - style=numeric, - sortlocale=ru_RU, - url=false, - doi=false, - eprint=false -]{biblatex} - -\addbibresource{assets/bibliography/main.bib} diff --git a/configuration/macroses/utils/references/hyperrefconf.tex b/configuration/macroses/utils/references/hyperrefconf.tex deleted file mode 100644 index 5650d3d..0000000 --- a/configuration/macroses/utils/references/hyperrefconf.tex +++ /dev/null @@ -1,29 +0,0 @@ -\RequirePackage[ - colorlinks=true, - urlcolor=blue, - linkcolor=red,filecolor=red, - citecolor=blue, - hypertexnames=false -]{hyperref} -\RequirePackage{etoolbox} - - -\newcommand{\picref}[1]{рис.~\ref{#1}} - - -\def\PDFMetaTitle{PySATL-Core-Design-Document} -\hypersetup{% - pdftitle={\PDFMetaTitle}, -} - - -\makeatletter -\patchcmd{\find@pdflink}{ - /C[\CurrentBorderColor]% - \fi -}{ - /C[\CurrentBorderColor]% - \fi - /BS <> -}{}{} -\makeatother diff --git a/configuration/macroses/utils/references/knowledgeconf.tex b/configuration/macroses/utils/references/knowledgeconf.tex deleted file mode 100644 index 94d0016..0000000 --- a/configuration/macroses/utils/references/knowledgeconf.tex +++ /dev/null @@ -1,3 +0,0 @@ -\RequirePackage[electronic]{knowledge} -\knowledgeconfigure{protect quotation={tikzcd}} -\knowledgeconfigure{notion} diff --git a/configuration/macroses/utils/typesetting/lists.tex b/configuration/macroses/utils/typesetting/lists.tex deleted file mode 100644 index 5780079..0000000 --- a/configuration/macroses/utils/typesetting/lists.tex +++ /dev/null @@ -1,6 +0,0 @@ -\RequirePackage{enumitem} - -\newlist{itemizecmp}{itemize}{1} -\setlist[itemizecmp]{label=\textbullet, noitemsep, topsep=0pt, parsep=0pt} -\newlist{enumeratecmp}{enumerate}{2} -\setlist[enumeratecmp, 1, 2]{label=\arabic*, noitemsep, topsep=0pt, parsep=0pt} diff --git a/configuration/macroses/utils/typesetting/mathematics.tex b/configuration/macroses/utils/typesetting/mathematics.tex deleted file mode 100644 index c114db2..0000000 --- a/configuration/macroses/utils/typesetting/mathematics.tex +++ /dev/null @@ -1,91 +0,0 @@ -\RequirePackage{amsthm} -\makeatletter - \def\renewtheorem#1{% - \expandafter\let\csname#1\endcsname\relax - \expandafter\let\csname c@#1\endcsname\relax - \gdef\renewtheorem@envname{#1} - \renewtheorem@secpar - } - \def\renewtheorem@secpar{\@ifnextchar[{\renewtheorem@numberedlike}{\renewtheorem@nonumberedlike}} - \def\renewtheorem@numberedlike[#1]#2{\newtheorem{\renewtheorem@envname}[#1]{#2}} - \def\renewtheorem@nonumberedlike#1{ - \def\renewtheorem@caption{#1} - \edef\renewtheorem@nowithin{\noexpand\newtheorem{\renewtheorem@envname}{\renewtheorem@caption}} - \renewtheorem@thirdpar - } - \def\renewtheorem@thirdpar{\@ifnextchar[{\renewtheorem@within}{\renewtheorem@nowithin}} - \def\renewtheorem@within[#1]{\renewtheorem@nowithin[#1]} -\makeatother - - -% Convention for theorems. -% {Theorem} --- framed theorem -% {theorem} --- non-framed theorem -% {Theorem*} --- framed theorem without numbering -% {theorem*} --- non-framed theorem without numbering - -\RequirePackage{mdframed} -\NewDocumentCommand{\framesetup}{m}{ - \IfNoValueTF{#1}{ - \mdfsetup{innertopmargin=-3pt,linecolor=black,% - linewidth=1pt,topline=true, frametitleaboveskip=\dimexpr-\ht\strutbox\relax,} - }{ - \mdfsetup{frametitle={% - \tikz[baseline=(current bounding box.east),outer sep=0pt] - \node[anchor=east,rectangle,fill=white]{\strut #1};}} - \mdfsetup{innertopmargin=-10pt,linecolor=black,% - linewidth=1pt,topline=true, frametitleaboveskip=\dimexpr-\ht\strutbox\relax,} - } -} - -\NewDocumentCommand{\MakeFramedTheorem}{mm}{ - \NewDocumentEnvironment{#1}{o} - {\framesetup{##1}\begin{mdframed}\begin{#2}} - {\end{#2}\end{mdframed}} -} - -\ExplSyntaxOn -\tl_new:N\l_env_name_tl -\tl_new:N\l_framed_env_name_tl - -\NewDocumentCommand{\NewDocumentTheorem}{md[]md[]}{ - \tl_set:Nn\l_env_name_tl{#1} - \tl_set:Nx\l_framed_env_name_tl{\str_uppercase:f{\tl_head:N\l_env_name_tl}\tl_tail:N\l_env_name_tl} - \IfNoValueTF{#2}{ - \IfNoValueTF{#4}{ - \newtheorem{\tl_use:N\l_env_name_tl}{#3} - \newtheorem*{\tl_use:N\l_env_name_tl*}{#3} - }{ - \newtheorem{\tl_use:N\l_env_name_tl}{#3}[#4] - \newtheorem*{\tl_use:N\l_env_name_tl*}{#3} - } - }{ - \IfNoValueTF{#4}{ - \newtheorem{\tl_use:N\l_env_name_tl}[#2]{#3} - \newtheorem*{\tl_use:N\l_env_name_tl*}{#3} - }{ - \PackageError{layout}{You can not use both counter and other theorem ref in definition} - } - } - \exp_args:Nxx\MakeFramedTheorem{\tl_use:N\l_framed_env_name_tl}{\tl_use:N\l_env_name_tl} - \exp_args:Nxx\MakeFramedTheorem{\tl_use:N\l_framed_env_name_tl*}{\tl_use:N\l_env_name_tl*} - -} -\ExplSyntaxOff - -\theoremstyle{plain} -\NewDocumentTheorem{theorem}{Теорема}[subsection] -\NewDocumentTheorem{corollary}[theorem]{Следствие} -\NewDocumentTheorem{lemma}[theorem]{Лемма} -\NewDocumentTheorem{proposition}[theorem]{Предложение} -\NewDocumentTheorem{axiom}{Аксиома} - -\theoremstyle{definition} -\NewDocumentTheorem{definition}[theorem]{Определение} -\NewDocumentTheorem{remark}[theorem]{Замечение} - - -%%%% Strange environments -\theoremstyle{definition} -\newtheorem*{example}{Пример} -\newtheorem*{notation}{Нотация} diff --git a/configuration/macroses/utils/typesetting/shorthands.tex b/configuration/macroses/utils/typesetting/shorthands.tex deleted file mode 100644 index dc2e51f..0000000 --- a/configuration/macroses/utils/typesetting/shorthands.tex +++ /dev/null @@ -1,3 +0,0 @@ -\newcommand{\ie}{т{.}~e{.}} -\newcommand{\SciPy}{\textsc{SciPy}} - diff --git a/core-design-document.pdf b/core-design-document.pdf deleted file mode 100644 index ad76e25..0000000 Binary files a/core-design-document.pdf and /dev/null differ diff --git a/core-design-document.tex b/core-design-document.tex index 3260350..da2fb85 100644 --- a/core-design-document.tex +++ b/core-design-document.tex @@ -1,7 +1,5 @@ \documentclass{designdoc} \setcounter{secnumdepth}{3} -\usepackage{todonotes} - \usetikzlibrary{babel} \newmathcommand{\pmf}{f} @@ -13,8 +11,27 @@ \newmathcommand{\chdf}{H} \newmathcommand{\MGF}{M} +\ConditionalFunctionalOperator{\IQR}{\mathrm{IQR}} +\ConditionalFunctionalOperator{\Med}{\mathrm{med}} +\ConditionalFunctionalOperator{\Mode}{\mathrm{mode}} + +\newmathcommand{\Mellin}{\mathcal{M}} +\newmathcommand{\Laplace}{\mathcal{L}} + +\newcommand{\mleb}{m_{\mathrm{Leb}}} +\newcommand{\deq}{\overset{\text{\tiny d}}{=}} -\title{Архитектурный документ. Ядро PySATL} +\newlength{\figurewidth} +\setlength{\figurewidth}{0.9\linewidth} +\newlength{\wrapfigurewidth} +\setlength{\wrapfigurewidth}{0.4\linewidth} +\newtheorem*{example}{Пример} +\graphicspath{{assets/images/}} +\DeclareGraphicsExtensions{.pdf,.png,.jpg} + +% BUGFIX +\DeclareBracedMathOperator*{\argmax}{argmax} +\title{Дизайн документ. Ядро PySATL} \author{Михаил Михайлов, Леонид Елкин} \date{\today} @@ -29,6 +46,6 @@ \input{src/chapter-04} \input{src/chapter-05} - +\nocite{*} \printbibliography \end{document} diff --git a/src/architectural-views/03-logical-structure.tex b/src/architectural-views/03-logical-structure.tex index 132aa6d..3b46f50 100644 --- a/src/architectural-views/03-logical-structure.tex +++ b/src/architectural-views/03-logical-structure.tex @@ -1,6 +1,6 @@ \section{Логическая структура} \input{src/architectural-views/logical-structure/01-overview} -\newpage +%\newpage \input{src/architectural-views/logical-structure/02-distributions} \newpage \input{src/architectural-views/logical-structure/03-parametric-families} diff --git a/src/architectural-views/logical-structure/03-parametric-families.tex b/src/architectural-views/logical-structure/03-parametric-families.tex index 68207aa..e3d55a0 100644 --- a/src/architectural-views/logical-structure/03-parametric-families.tex +++ b/src/architectural-views/logical-structure/03-parametric-families.tex @@ -15,10 +15,10 @@ \subsubsection{Общий обзор} Реестр семейств, используется, чтобы в будущем можно было реализовывать переходы между распределениями из семейств, при каких-то операциях Каждое семейство является объектом класса \texttt{ParametricFamily}. Это позволяет использовать систему с реестром, а также: -\begin{itemizecmp} +\begin{itemize}[compact] \item Добавлять пользовательские параметризации для распределений; \item Добавлять новые \texttt{AnalyticalComputation} для распределений, -\end{itemizecmp} +\end{itemize} не модифицируя исходный код семейства. На данный момент за работу с несколькими параметризациями отвечает класс \texttt{ParametrizationSpec}. Его объекты описывают какие параметризации есть у семейства, и кто из них является канонической. Сейчас используется следующий механизм: все аналитические вычисления задаются в базовой параметризации, далее каждая параметризация указывает, как из нее получить базовую параметризацию. @@ -28,15 +28,15 @@ \subsubsection{Основные компоненты системы} \noindent \texttt{ParametricFamiliesRegister} (Реестр параметрических семейств) \begin{itemize}[noitemsep, topsep=0pt, parsep=0pt] \item \textbf{Назначение}: Синглтон-класс для глобальной регистрации и доступа ко всем параметрическим семействам.\item \textbf{Поля}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{\_instance} - единственный экземпляр реестра \item \texttt{\_registered\_families} - словарь зарегистрированных семейств - \end{itemizecmp} + \end{itemize} \item \textbf{Методы}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{get(name)} - получение семейства по имени \item \texttt{register(family)} - регистрация нового семейства - \end{itemizecmp} + \end{itemize} \end{itemize} \noindent \texttt{ParametrizationConstraint} (Ограничение параметризации) @@ -44,10 +44,10 @@ \subsubsection{Основные компоненты системы} \item \textbf{Назначение}: Контейнер для ограничений на значения параметров распределения. \item \textbf{Поля}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{description} - текстовое описание ограничения \item \texttt{check} - функция проверки ограничения - \end{itemizecmp} + \end{itemize} \end{itemize} \noindent \texttt{Parametrization} (Абстрактный класс параметризации) @@ -55,39 +55,39 @@ \subsubsection{Основные компоненты системы} \item \textbf{Назначение}: Абстрактный базовый класс для всех параметризаций распределений. \item \textbf{Поля}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{constraints} - список ограничений параметров - \end{itemizecmp} + \end{itemize} \item \textbf{Абстрактные свойства}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{name} - имя параметризации \item \texttt{parameters} - словарь параметров - \end{itemizecmp} + \end{itemize} \item \textbf{Методы}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{validate()} - проверка всех ограничений \item \texttt{transform\_to\_base\_parametrization()} - преобразование к базовой параметризации. - \end{itemizecmp} + \end{itemize} \end{itemize} \noindent \texttt{ParametrizationSpec} (Спецификация параметризаций) - \begin{itemize}[noitemsep, topsep=0pt, parsep=0pt] +\begin{itemize}[noitemsep, topsep=0pt, parsep=0pt] \item \textbf{Назначение}: Контейнер для управления множественными параметризациями семейства. \item \textbf{Поля}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{parametrizations} - словарь всех параметризаций \item \texttt{base\_parametrization\_name} - имя базовой параметризации - \end{itemizecmp} + \end{itemize} \item \textbf{Методы}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{base} - получение класса базовой параметризации \item \texttt{add\_parametrization()} - добавление новой параметризации \item \texttt{get\_base\_parameters()} - преобразование параметров к базовой форме - \end{itemizecmp} + \end{itemize} \end{itemize} @@ -96,19 +96,19 @@ \subsubsection{Основные компоненты системы} \item \textbf{Назначение}: Представление семейства распределений с различными параметризациями. \item \textbf{Поля}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{name} - имя семейства \item \texttt{distr\_type} - тип распределения \item \texttt{parametrizations} - спецификация параметризаций \item \texttt{distr\_characteristics} - характеристики распределения \item \texttt{sampling\_strategy} - стратегия семплирования \item \texttt{computation\_strategy} - стратегия вычислений - \end{itemizecmp} + \end{itemize} \item \textbf{Методы}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{\_\_call\_\_()} - создание экземпляра распределения - \end{itemizecmp} + \end{itemize} \end{itemize} @@ -117,47 +117,44 @@ \subsubsection{Основные компоненты системы} \item \textbf{Назначение}: Конкретный экземпляр распределения с определенными параметрами. Реализует протокол \texttt{Distribution} \item \textbf{Поля}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{distr\_name} - имя семейства \item \texttt{distribution\_type} - тип распределения \item \texttt{parameters} - параметры распределения - \end{itemizecmp} + \end{itemize} \item \textbf{Свойства}: - \begin{itemizecmp} + \begin{itemize}[compact] \item \texttt{family} - ссылка на родительское семейство - \end{itemizecmp} + \end{itemize} \end{itemize} \subsubsection{Типичные сценарии использования} \paragraph{Определение нового семейства распределений} Пользователь создает новое параметрическое семейство, определяя: -\begin{itemizecmp} +\begin{itemize}[compact] \item Различные параметризации (каноническая, mean-var, etc.) \item Ограничения на параметры \item Функции для вычисления характеристик (PDF, CDF, etc.), доступные аналитически \item Стратегии семплирования и вычислений -\end{itemizecmp} +\end{itemize} \paragraph{Создание экземпляра распределения} Пользователь создает конкретное распределение, указывая: -\begin{itemizecmp} +\begin{itemize}[compact] \item Имя семейства \item Параметризацию (как минимум одну) \item Значения параметров -\end{itemizecmp} +\end{itemize} \paragraph{Вычисление характеристик распределения} Система автоматически: -\begin{itemizecmp} +\begin{itemize}[compact] \item Проверяет корректность параметров \item При необходимости преобразует к базовой параметризации \item Вычисляет запрошенные характеристики -\end{itemizecmp} +\end{itemize} \paragraph{Генерация выборок} Используется зарегистрированная стратегия семплирования для генерации данных из распределения. - - -\end{document} \ No newline at end of file diff --git a/src/chapter-01.tex b/src/chapter-01.tex index a42c876..1bd0def 100644 --- a/src/chapter-01.tex +++ b/src/chapter-01.tex @@ -8,12 +8,12 @@ \section{Назначение системы} \section{Область применимости} Вычислительное ядро \texttt{core} используется во всех подсистемах проекта PySATL, где требуется работа с распределениями вероятностей. Оно предназначено как для непосредственного вычисления характеристик распределений (например, плотности, функции распределения, квантилей), так и для построения и трансформации более сложных моделей на их основе. Оно может быть использовано: -\begin{itemizecmp} +\begin{itemize}[compact] \item при определении конкретных распределений, используемых в анализе данных; \item для задания пользовательских распределений, комбинации распределений и создания новых семейств; \item при трансформации распределений через функциональные отображения; \item в задачах символьной или численной обработки распределений. -\end{itemizecmp} +\end{itemize} Вне проекта PySATL ядро может быть применимо в любых системах, где необходима гибкая и расширяемая работа с вероятностными распределениями, особенно в контексте численных симуляций, статистического моделирования и прикладного машинного обучения. diff --git a/src/chapter-02.tex b/src/chapter-02.tex index d3394ef..7e6a879 100644 --- a/src/chapter-02.tex +++ b/src/chapter-02.tex @@ -3,13 +3,13 @@ \chapter{Глоссарий} \subsubsection*{Случайные величины и способы их задания} Для случайной величины $\xi$, принимающей значения в некотором пространстве $\mathcal{X}$, её распределением называется (см{.}~\cite{shiryaev2007prob}) вероятностная мера $\P_\xi(\cdot)$ на $\mathcal{X}$, такая что $\P_\xi(A)$ есть вероятность того что реализация $\xi$ попадет в множество $A \subset \mathcal{X}$\footnote{Строго говоря, $\mathcal{X}$ должно быть снабжено некоторой $\sigma$-алгеброй $\mathcal{F}$, и $\P_\xi$ должна быть определена только для $A \in \mathcal{F}$. Иначе говоря, тройка $(\mathcal{X}, \mathcal{F}, \P_\xi)$ должна образовывать вероятностное пространство.}. Как правило (см{.} \cite{Feller2013}), выделяют следующие виды случайных величин -\begin{itemize}[noitemsep, topsep=0pt, parsep=3pt] +\begin{itemize}[compact] \item Дискретные случайные величины. В этом случае $\mathcal{X}$ представляет собой некоторое дискретное (конечное или счетное) множество. Например число выпадений монеты орлом при нескольких бросках (биномиальное распределение); уровень образования у случайно выбранного человека (категориальное распределение); случайная величина которая принимает одно значение (вырожденное распределение); \item Одномерные непрерывные случайные величины\footnote{Здесь и далее под непрерывными случайными величинами подразумеваются абсолютно-непрерывные случайные величины, т.е. распределение которых имеет плотность относительно меры Лебега}. В этом случае $\mathcal{X} = \R$ или $\mathcal{X} \subset \R$ ненулевой меры. Такие величины используются для описания случайных времен, расстояний и т{.}д{.} Согласно \cite{knuth2014art} наиболее важными представителями являются: равномерное распределение $\Uniform(a; b)$ , нормальное распределение $\Normal(\mu, \sigma^2)$ и экспоненциальное распределение $\Exp(\lambda)$; \item Многомерные непрерывные случайные величины. В этом случае $\mathcal{X} \subseteq \R^d$, ненулевой меры. Во много многомерные случайные величины являются аналогами одномерных непрерывных случайных величин, однако решение стандартных задач, таких как моделирование или вычисление числовых характеристик затруднено из-за проклятия размерности \cite{donoho2000high}. \end{itemize} Отдельное направление статистики работает с данными о направлении (англ{.} directional data), в связи с этим часто можно также отдельно выделить следующую категорию случайных величин. -\begin{itemize}[noitemsep, topsep=0pt, parsep=3pt] +\begin{itemize}[compact] \item Случайные геометрические примитивы (англ{.} geometrical random primitives). Примерами таких случайных величин служат случайные углы или случайные матрицы симметрий. Согласно \cite{pennec1999probabilities}, геометрической случайной величиной называется случайная величина принимающая значения на замкнутой и ограниченной поверхности в евклидовом пространстве (более общо---компактном Римановом многообразии). \end{itemize} diff --git a/src/chapter-03.tex b/src/chapter-03.tex index f4ea3cc..c379f7a 100644 --- a/src/chapter-03.tex +++ b/src/chapter-03.tex @@ -8,26 +8,26 @@ \chapter{Заинтересованные лица} \section{Разработчики ядра PySATL} Это лица непосредственно принимающие участие в написании кода для ядра. Для них приоритетным является ряд возможностей: -\begin{itemizecmp} +\begin{itemize}[compact] \item Добавление новой функциональности или оптимизация уже существующей; \item Покрытие кодовой базы тестами; в частности регрессионными тестами; \item Сопровождение существующей кодовой базы; \item Расширение коллектива разработчиков; -\end{itemizecmp} +\end{itemize} \textbf{1. Добавление новой функциональности} \ Разработчики ядра расширяют и модифицируют библиотеку в контексте следующих задач: -\begin{itemizecmp} +\begin{itemize}[compact] \item Добавление новых параметрических семейств/новых операций над распределениями; \item Добавление новых числовых и/или функциональных характеристик распределений; \item Добавление новых численных методов для вычисления характеристик распределений; \item Добавление новых численных методов для вычисления операций над распределениями; -\end{itemizecmp} +\end{itemize} \textbf{2. Тестирование} \ Помимо расширения функциональности, разработчики ядра покрывают кодовую базу тестами; Им необходимо иметь ряд механизмов для: -\begin{itemizecmp} +\begin{itemize}[compact] \item автоматического тестирования новой функциональности, касающейся свойств добавляемых распределений/семейств/операций \item создания регрессионных тестов для функциональности, оперирующей с псевдо-случайным данными -\end{itemizecmp} +\end{itemize} \begin{example} При создании нового семейств распределений разработчик указывает что все его представители имеют носитель на отрезке $[0; 1]$. Это свойство распределения которое можно проверить например сгенерировав выборку из данного распределения и проверив что все элементы выборки лежат в этом отрезке. @@ -41,35 +41,33 @@ \section{Разработчики ядра PySATL} \textbf{3. Сопровождение кодовой базы и расширения коллектива разработчиков}\\ Сопровждение кодовой базы и расширенние коллектива разработчиков осуществляется засчет нескольких инструментов -\begin{itemizecmp} +\begin{itemize}[compact] \item Архитектурная документация; настоящий документ является её частью. В частности, так как ядро планируется активно использовать в других библиотеках, необходимо явно отразить какие части системы являются публично доступными \item Техническая и пользовательская документация; наличие качественной документации, содержащей примеры использования и описывающей роли компонент сисемы -\end{itemizecmp} +\end{itemize} \noindent\rule{\textwidth}{0.5pt} \section{Разработчики других библиотек в PySATL} К этой категории относятся все разработчики PySATL, которые либо не принимают непосредственного участия в разработке ядра, либо делают это эпизодически, добавляя функциональность под конкретные нужды проектов (в последнем случае они относятся к первой категории заинтерсованных лиц). Их основные интересы по отоншению к ядру состоят в следующем. -\begin{enumeratecmp} - \item Простота интеграции ядра в другие библиотеки PySATL; +\begin{enumerate}[compact] \item Простота интеграции ядра в другие библиотеки PySATL; \item Конфигурируемость ядра для типичных сценариев использования; -\end{enumeratecmp} +\end{enumerate} %#todo[ММ][На самом деле каждая библиотека является отдельным стейкхолдером; Так experiment нуждается в выше указанном конфигурировании семплинга, а mpest имеет совершенно другие запросы. nmvm это вообще отдельная головная боль] \textbf{1. Простота интеграции ядра в другие библиотеки PySATL}\\ Сейчас PySATL активно использует связку Numpy/SciPy для большинства математических вычислений; Это означает что при переходе на ядро, во всех местах использующих эту связку, замена не должна вызвать осложнений. В частности ядро -\begin{itemizecmp} +\begin{itemize}[compact] \item Не должно обязывать разработчика других библиотек к конфигурации численных методов, использующихся в ядре; \item Должно иметь всю ту же функциональность, что и модуль \texttt{statistics} библиотеки SciPy; \item Должно предоставлять унифицированный интерфейс для прочих математических функций; -\end{itemizecmp} +\end{itemize} Здесь надо пояснить что такое прочие математические функции. При реализации различных оценок, иногда вознкиают довольно нетривиальные объекты (так pysatl-nmvm использует многочлены Белла для вычислений, а mpest - различные методы оптимизации). Так как существует множество математических библиотек, которые могут предоставлять данные возможности, то: -\begin{enumeratecmp} - \item Возможно, конечный пользователь библиотеки (не обязательно ядра) захочет чтобы использовались какие-то конкретные математические пакеты (что очень может быть в случае интегрирования/оптимизации) +\begin{enumerate}[compact] \item Возможно, конечный пользователь библиотеки (не обязательно ядра) захочет чтобы использовались какие-то конкретные математические пакеты (что очень может быть в случае интегрирования/оптимизации) \item Наличие единного интерфейса для математических утилит не приведет к тому что внутри разных библиотек (или даже одной библиотеки) используются разные математические пакеты -\end{enumeratecmp} +\end{enumerate} К тому же, многие из математических пакетов, предоставляющих редкие, но нужные функции, являются либо проприетарными, либо с вирусными лицензиями. Использование и тех, и других, не подходит под лицензионные ограничения; создание единого интерфейса для математических утилит позволяет распостранять PySATL под MIT лицензией, используя вирусную лицензию только для реализации этих интерфейсов. Это значительно позволит сократить ресурсы на прототипирование разлчиных библиотек на базе ядра. @@ -79,17 +77,17 @@ \section{Разработчики других библиотек в PySATL} \begin{itemize}[noitemsep, topsep=0pt, parsep=0pt] \item \textbf{Выбор численных методов:} Возможность выбора конкретной реализации алгоритма (например, для вычисления интеграла или оптимизации) в зависимости от требований к точности, скорости или устойчивости. Библиотека \texttt{experiment} может требовать максимальной скорости для генерации больших выборок, в то время как \texttt{mpest} — максимальной надёжности и точности для сходимости алгоритмов оценки параметров. \item \textbf{Управление вычислительными ресурсами:} Настройка параметров, влияющих на производительность и использование памяти. Например: - \begin{itemizecmp} + \begin{itemize}[compact] \item Установка допусков (tolerances) для итеративных алгоритмов; \item Задание лимитов на количество итераций; \item Управление размером кэшей для повторных вычислений. - \end{itemizecmp} + \end{itemize} \item \textbf{Стратегии семплирования:} Конфигурация генераторов псевдослучайных чисел (ГПСЧ), включая: - \begin{itemizecmp} + \begin{itemize}[compact] \item Выбор конкретного алгоритма ГПСЧ (например, Mersenne Twister, PCG64); \item Установка начального значения (seed) для обеспечения воспроизводимости результатов; \item Управление параллельными потоками генерации для эффективного использования многоядерных систем. - \end{itemizecmp} + \end{itemize} \item \textbf{Политики обработки ошибок:} Возможность настройки реакции на исключительные ситуации --- от строгого прерывания вычисления с выводом подробной ошибки до возврата специальных значений (NaN, inf) или использования fallback-алгоритмов для обеспечения отказоустойчивости. \item \textbf{Абстракция математического бэкенда:} Единый интерфейс для низкоуровневых математических операций (линейная алгебра, специальные функции, оптимизация), позволяющий подменять реализации без изменения кода, зависящего от ядра. Это гарантирует, что библиотеки \texttt{nmvm} и \texttt{mpest} будут использовать согласованный computational stack, конфигурируемый централизованно. \end{itemize} @@ -100,74 +98,74 @@ \section{Руководители проекта PySATL} Данная категория включает лиц, ответственных за планирование развития проекта в целом, распределение ресурсов и координацию между рабочими группами. Их интересы сфокусированы на стратегических аспектах разработки и эксплуатации ядра, а также на его интеграции в общую экосистему PySATL. -\begin{itemizecmp} +\begin{itemize}[compact] \item Представление о планах разработки ядра и его функциональности на каждом этапе; \item Гарантии, предоставляемые ядром; \item Эффективное использование ресурсов и соблюдение сроков; \item Минимизация рисков, связанных с техническим долгом и зависимостями. -\end{itemizecmp} +\end{itemize} \textbf{1. Планы разработки и функциональность} \\ Руководителям проекта необходимо иметь чёткое и актуальное представление о состоянии и roadmap ядра для принятия обоснованных решений. Это включает: -\begin{itemizecmp} +\begin{itemize}[compact] \item Соответствие фактической функциональности ядра заявленным планам и требованиям других подсистем PySATL; \item Наличие документации, достаточной для оценки готовности компонент к интеграции; \item Понятный и измеримый прогресс разработки, позволяющий оценивать выполнение этапов. -\end{itemizecmp} +\end{itemize} \textbf{2. Гарантии, предоставляемые ядром} \\ Поскольку ядро является фундаментальным компонентом всего проекта, от его качества и стабильности зависит работа всех надстроенных над ним библиотек. Руководители заинтересованы в наличии гарантий, обеспечиваемых за счёт: -\begin{itemizecmp} +\begin{itemize}[compact] \item Всестороннего тестирования, включая модульные, интеграционные и регрессионные тесты; \item Чёткого определения и поддержания публичных интерфейсов (API), что обеспечивает стабильность для потребителей ядра; \item Предсказуемой политики управления версиями, минимизирующей обратно несовместимые изменения; \item Исчерпывающей документации, снижающей риски misinterpretation API и его неправильного использования. -\end{itemizecmp} +\end{itemize} \textbf{3. Эффективность использования ресурсов и сроки} \\ Процесс разработки ядра должен быть организован таким образом, чтобы: -\begin{itemizecmp} +\begin{itemize}[compact] \item Архитектурные решения способствовали повторному использованию кода и сокращению избыточности; \item Существовали механизмы для быстрого прототипирования и валидации новых идей без угрозы нарушения стабильности основной codebase; \item Соблюдались согласованные сроки поставки критически важной для других подсистем функциональности. -\end{itemizecmp} +\end{itemize} \textbf{4. Управление рисками} \\ Ключевым аспектом является проактивное выявление и снижение потенциальных рисков, в частности: -\begin{itemizecmp} +\begin{itemize}[compact] \item Контроль над внешними зависимостями, их лицензионной чистотой и совместимостью; \item Минимизация накопления технического долга за счёт регулярного рефакторинга и применения современных практик разработки; \item Наличие плана по обеспечению долгосрочной поддерживаемости и расширяемости кодовой базы. -\end{itemizecmp} +\end{itemize} \noindent\rule{\textwidth}{0.5pt} \section{Инженеры-исследователи} К данной категории относятся специалисты, применяющие ядро PySATL для решения прикладных задач: программисты, математики, статистики и исследователи в области численных методов. Они используют систему как инструмент для реализации и проверки научных гипотез, прототипирования алгоритмов и проведения вычислительных экспериментов. -\begin{itemizecmp} +\begin{itemize}[compact] \item Поддержка сложных операций над распределениями, смесями и иерархическими моделями; \item Бенчмаркинг новых алгоритмов и сравнение с существующими аналогами; \item Гибкость и выразительность для описания нестандартных вероятностных моделей; \item Воспроизводимость и контролируемость вычислительных экспериментов. -\end{itemizecmp} +\end{itemize} \textbf{1. Поддержка сложных операций и моделей} \\ Инженеры-исследователи работают с комплексными вероятностными структурами, выходящими за рамки стандартных распределений. Их интерес заключается в возможности: -\begin{itemizecmp} +\begin{itemize}[compact] \item Конструировать составные распределения (смеси, свёртки, произведения); \item Определять иерархические (многоуровневые) вероятностные модели; \item Применять нелинейные функциональные преобразования к распределениям; \item Работать с усечёнными, цензурированными или модифицированными распределениями. -\end{itemizecmp} +\end{itemize} \textbf{2. Бенчмаркинг и валидация алгоритмов} \\ Для данной аудитории критически важна возможность оценивать эффективность и корректность реализуемых методов: -\begin{itemizecmp} +\begin{itemize}[compact] \item Наличие встроенных средств для замеров производительности (профилирования) отдельных операций; \item Возможность сравнивать численные результаты, полученные с помощью ядра, с эталонными реализациями или аналитическими выкладками; \item Доступ к низкоуровневым параметрам численных методов (таким как точность, допуски, критерии остановки) для тонкой настройки и исследования сходимости алгоритмов. -\end{itemizecmp} +\end{itemize} \begin{example} Исследователь, разрабатывающий новый метод оценки параметров, должен иметь возможность сгенерировать набор синтетических данных из известного распределения, применить свой метод, сравнить полученные оценки с истинными значениями параметров и измерить время выполнения алгоритма, обеспечивая при этом полную воспроизводимость эксперимента. @@ -175,16 +173,16 @@ \section{Инженеры-исследователи} \textbf{3. Гибкость и выразительность} \\ Система должна предоставлять достаточный уровень абстракции для лаконичного и интуитивно понятного выражения математических концепций: -\begin{itemizecmp} +\begin{itemize}[compact] \item Декларативный способ задания моделей, приближенный к математической нотации; \item Возможность легко комбинировать примитивы ядра для создания специализированных конструкций без необходимости написания большого объема boilerplate-кода; \item Доступ к символьным представлениям преобразований для анализа и оптимизации выражений до их численного вычисления. -\end{itemizecmp} +\end{itemize} \textbf{4. Воспроизводимость и контролируемость} \\ Так как работа инженера-исследователя носит экспериментальный характер, ядро должно предоставлять инструменты для обеспечения строгости научного процесса: -\begin{itemizecmp} +\begin{itemize}[compact] \item Детерминированная работа генератора псевдослучайных чисел с возможностью сохранения и восстановления состояния (seed); \item Логирование ключевых этапов вычислений и принятых решений (например, в алгоритмах оптимизации); \item Чёткое разделение между абстрактной спецификацией модели и конкретным численным методом её вычисления. -\end{itemizecmp} \ No newline at end of file +\end{itemize} \ No newline at end of file diff --git a/src/chapter-04.tex b/src/chapter-04.tex index 938bdfe..5ecfcf6 100644 --- a/src/chapter-04.tex +++ b/src/chapter-04.tex @@ -8,12 +8,12 @@ \section{Технические ограничения и качественны \subsection{Технические ограничения} В данном разделе перечислены внешние технические ограничения, влияющие на архитектуру и реализацию системы. Эти ограничения задаются проектом PySATL или внешними условиями и не подлежат изменению в рамках проектирования ядра. -\begin{itemizecmp} +\begin{itemize}[compact] \item \textit{Язык реализации}: система должна предоставлять основной пользовательский интерфейс на языке Python версии 3.x. Допускается использование других языков программирования (например, C/C++) во внутренней реализации с целью оптимизации вычислений, при условии полной прозрачности интерфейса для Python-пользователя. \item \textit{Лицензирование}: система должна распространяться под MIT-лицензией. Использование копилефт-лицензий (например, GPL) запрещено. \item \textit{Кроссплатформенность}: система должна работать на основных операционных системах (Linux, macOS, Windows) без необходимости установки платформозависимых компонентов или привязки к конкретной среде исполнения. \item \textit{Вычислительные ограничения}: система не должна требовать наличия GPU или специализированного оборудования. Все вычисления должны корректно выполняться на CPU без дополнительных зависимостей. -\end{itemizecmp} +\end{itemize} \subsection{Качественные характеристики системы} @@ -46,7 +46,7 @@ \subsubsection{Документируемость и визуализация:} \section{Ключевые функциональные требования} В данном разделе изложены функциональные требования к системе, определяющие её основную вычислительную модель, интерфейсы и возможности расширения. Эти требования отражают ожидаемое поведение ядра и набор поддерживаемых операций. Можно выделить следующие группы требований -\begin{itemizecmp} +\begin{itemize}[compact] \item[(ГФТ1)] \textit{Определение распределения}: каждое распределение должно быть определено посредством как минимум одной функциональной характеристики (например, функция плотности или функция распределения), поддерживать генерацию выборки и вычисление логарифма правдоподобия. Распределение должно быть связано с типом случайной величины (дискретной или непрерывной) и типом значений выборки(многомерной или одномерной). \item[(ГФТ2)] \textit{Функциональные и числовые характеристики}: система должна поддерживать вычисление основных и дополнительных характеристик распределений, включая возможность их добавления пользователем, а также предоставлять гарантии корректности вычислений. \item[(ГФТ3)] \textit{Семплирование распределений}. Для каждого распределения должна быть доступна генерация выборки. При этом, пользователь должен иметь возможность добавлять свои способы семплирования и настраивать используемый способ семплирования. Система также должна предоставлять механизмы проверки качества семплирования. @@ -54,59 +54,59 @@ \section{Ключевые функциональные требования} \item[(ГФТ5)] \textit{Работа с семействами распределений}: система должна поддерживать задание семейств распределений, определяемых через параметрические пространства. Необходимо обеспечить возможность описания связей между семействами, включая асимптотику и граничные переходы (например, предельные случаи распределений при изменении параметров). Поддержка пользовательских семейств и добавления новых связей обязательна. \item[(ГФТ6)] \textit{Преобразования распределений}: система должна поддерживать стандартные операции преобразования распределений, включая арифметические операции, функциональные отображения, свёртки, смеси и т.п. Должна быть предусмотрена возможность компоновки и каскадирования таких преобразований. -\end{itemizecmp} +\end{itemize} \subsection{Требования к числовым и функциональным характеристикам} Под корректным вычислением числовой или функциональной характеристики заданного распределения подразумевается следующее поведение системы: -\begin{enumeratecmp} +\begin{enumerate}[compact] \item В случае если значение характеристики определено и \textit{всегда} является числом, оно должно вычисляться с предопределенной гарантией точности (например, в виде верхней оценки на относительную погрешность); \item В случае если значение характеристики \textit{равно} $\pm \infty$, должно выдаваться значение специального типа, представляющего собой абстракцию бесконечности; \item В случае если значение характеристики \textit{неопределенно}, система должна выдать объект типа NaN. Опционально должно выдаваться предупреждение о том что соответствующее значение не является числом или $\pm\infty$. \item В случае если значение характеристики \textit{может быть равно $\pm \infty$ или может быть неопределенно}, и заранее это невозможно проверить, необходимо предоставлять набор условий, при выполнений которых, с близкой к 1 вероятностью, значение можно считать вычисленным корректно, в смысле п.1; -\end{enumeratecmp} +\end{enumerate} \textbf{Полнота:} -\begin{itemizecmp} +\begin{itemize}[compact] \item Для любого распределения должно быть доступно вычисление всех характеристик моментного/квантильного/информационного типа приведенных в глоссарии; \item Для любого распределения должно быть доступно вычисление всех функциональных характеристик (если они существуют для данного распределения) приведенных в глоссарии. -\end{itemizecmp} +\end{itemize} \textbf{Гибкость и конфигурируемость:} -\begin{itemizecmp} +\begin{itemize}[compact] \item При наличии нескольких алгоритмов для расчета числовой/функциональной характеристики данного распределения, должен быть определен алгоритм, который используется по умолчанию; \item При наличии нескольких алгоритмов для расчета числовой/функциональной характеристики пользователь должен иметь возможность указать, какой алгоритм использовать. -\end{itemizecmp} +\end{itemize} \textbf{Расширяемость:} -\begin{itemizecmp} +\begin{itemize}[compact] \item Пользователь должен иметь возможность добавлять свои собственные алгоритмы вычисления для уже существующих функциональных/числовых характеристик; \item Пользователь должен иметь возможность добавлять собственные числовые характеристики. В случае если числовая характеристика определена не для всех распределений, пользователь должен иметь возможность явно указать для какого класса распределений определена характеристика; \item Пользователь должен иметь возможность добавлять собственные функциональные характеристики. В случае если функциональная характеристика определена не для всех распределений, пользователь должен иметь возможность явно указать для какого класса распределений определена характеристика. -\end{itemizecmp} +\end{itemize} \subsection{Требования к семействам распределений} -\begin{itemizecmp} +\begin{itemize}[compact] \item Для любого семейства распределений должна быть возможность создать новое семейство распределений, получаемое из исходного частичной подстановкой значений параметров; \item Для любого семейства распределений должна быть определена каноническая параметризация; \item Для любого семейства распределений должна быть возможность добавления новой параметризации. При добавлении новой параметризации, пользователь должен указать как параметры добавляемой параметризации выражаются через каноническую параметризацию и наоборот; \item Над семействами необходимо уметь производить операции образования смесей: непрерывных и дискретных; \item Должна быть возможность указать как представители семейства взаимодействуют с представителями других семейств при выполнении операций. -\end{itemizecmp} +\end{itemize} \subsection{Требования к операциям над распределениями} -\begin{itemizecmp} +\begin{itemize}[compact] \item Для одномерных непрерывных распределений должны быть доступны операции описанные в параграфе «Преобразования распределений» в глоссарии; \item При наличии нескольких способов вычисления операции, должен быть определён способ вычисления по умолчанию. -\end{itemizecmp} +\end{itemize} \subsection{Требования к генерации выборок} -\begin{itemizecmp} +\begin{itemize}[compact] \item Для любого распределения, за исключением относящихся к распределениям геометрических примитивов, должна быть возможность генерации выборок; \item При создании пользовательского распределения, система должна предоставлять методы для генерации выборок без необходимости реализовывать алгоритмы генерации; \item При наличии нескольких алгоритмов генерации выборок, пользователь должен иметь возможность выбирать алгоритм; \item Если алгоритм генерации выборок имеет параметры, то пользователь должен уметь настраивать эти параметры. К числу параметров также относится используемый источник случайных или псевдослучайных чисел. -\end{itemizecmp} +\end{itemize} diff --git a/src/chapter-05.tex b/src/chapter-05.tex index 6026eb6..bf6c051 100644 --- a/src/chapter-05.tex +++ b/src/chapter-05.tex @@ -3,4 +3,4 @@ \chapter{Избранные архитектурные точки зрения} \input{src/architectural-views/01-context} \input{src/architectural-views/02-composition.tex} \input{src/architectural-views/03-logical-structure} -\input{src/architectural-views/04-interaction} +% \input{src/architectural-views/04-interaction}