diff --git a/.gitignore b/.gitignore index ef381743..e3af9ef1 100644 --- a/.gitignore +++ b/.gitignore @@ -259,55 +259,3 @@ codebase-map.html CLAUDE.md .luarc.json .mcp.json -/bart26g/.quarto -/bart26g/_manuscript -/bart26g/_freeze -/bart26g/runs -/bart26g/spotoptim_arxiv -bart26g/index.pdf -bart26g/index.tex -bart26g/index.quarto_ipynb_1 -bart26g/index.quarto_ipynb_2 -bart26g/index.quarto_ipynb_3 -bart26g/index.quarto_ipynb_4 -bart26g/index.quarto_ipynb_5 -bart26g/index.quarto_ipynb_6 -bart26g/index.quarto_ipynb_7 -bart26g/index.quarto_ipynb_8 -bart26g/index.quarto_ipynb_9 -bart26g/index.quarto_ipynb_10 -bart26g/index.quarto_ipynb_11 -bart26g/index.quarto_ipynb_12 -bart26g/index.quarto_ipynb_13 -bart26g/index.quarto_ipynb_14 -bart26g/index.quarto_ipynb_15 -bart26g/index.quarto_ipynb_16 -bart26g/index.quarto_ipynb_17 -bart26g/index.quarto_ipynb_18 -bart26g/index.quarto_ipynb_19 -bart26g/index.quarto_ipynb_20 -bart26g/index.quarto_ipynb_21 -bart26g/index.quarto_ipynb_22 -bart26g/index.quarto_ipynb_23 -bart26g/index.quarto_ipynb_24 -bart26g/index.quarto_ipynb_25 -bart26g/index.quarto_ipynb_26 -bart26g/index.quarto_ipynb_27 -bart26g/index.quarto_ipynb_28 -bart26g/index.quarto_ipynb_29 -bart26g/index.quarto_ipynb_30 -bart26g/index.quarto_ipynb_31 -bart26g/index.quarto_ipynb_32 -bart26g/index.quarto_ipynb_33 -bart26g/index.quarto_ipynb_34 -bart26g/index.quarto_ipynb_35 -bart26g/index.quarto_ipynb_36 -bart26g/index.quarto_ipynb_37 -bart26g/index.quarto_ipynb_38 -bart26g/index.quarto_ipynb_39 -bart26g/index.quarto_ipynb_40 -bart26g/index.quarto_ipynb_41 -bart26g/index.quarto_ipynb_42 -bart26g/index.quarto_ipynb_43 -bart26g/index.quarto_ipynb_44 -bart26g/index.quarto_ipynb_45 diff --git a/bart26g/.gitignore b/bart26g/.gitignore deleted file mode 100644 index ad293093..00000000 --- a/bart26g/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/.quarto/ -**/*.quarto_ipynb diff --git a/bart26g/_extensions/mikemahoney218/arxiv/_extension.yml b/bart26g/_extensions/mikemahoney218/arxiv/_extension.yml deleted file mode 100644 index 4318fdf0..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/_extension.yml +++ /dev/null @@ -1,39 +0,0 @@ -title: ArXiv Template -author: Mike Mahoney -version: 0.2.3 -contributes: - formats: - common: - # define below YAML configuration common to all formats -# filters: - # You can include here Lua filters from your extension format - shortcodes: - # You can include here Lua filters defining shortcodes from your extension - - shortcodes.lua - knitr: - opts_chunk: - echo: false - number-sections: true - pdf: - # define default configuration for the pdf version of your format - documentclass: article - linenumbers: false - doublespacing: false - authorcols: false - # Content to add in header that your format is using - header-includes: | - \usepackage{arxiv} - \usepackage{orcidlink} - \usepackage{amsmath} - \usepackage[T1]{fontenc} - template-partials: ["partials/_authors.tex", "partials/title.tex", "partials/before-body.tex"] - mathfont: "Latin Modern Math" - mainfont: "Latin Modern Roman" - format-resources: - # Add here the resources required for the PDF rendering - - arxiv.sty - - orcidlink.sty - html: - toc: true - # Use a CSL file to style (https://www.zotero.org/styles/) - csl: https://www.zotero.org/styles/chicago-author-date-16th-edition diff --git a/bart26g/_extensions/mikemahoney218/arxiv/arxiv.sty b/bart26g/_extensions/mikemahoney218/arxiv/arxiv.sty deleted file mode 100644 index 9373d527..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/arxiv.sty +++ /dev/null @@ -1,274 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} - -\ProcessOptions\relax - -% fonts -\renewcommand{\rmdefault}{ptm} -\renewcommand{\sfdefault}{phv} - -% set page geometry -\usepackage[verbose=true,letterpaper]{geometry} -\AtBeginDocument{ - \newgeometry{ - textheight=9in, - textwidth=6.5in, - top=1in, - headheight=14pt, - headsep=25pt, - footskip=30pt - } -} - -\widowpenalty=10000 -\clubpenalty=10000 -\flushbottom -\sloppy - -\usepackage{fancyhdr} -\fancyhf{} -\pagestyle{fancy} -\renewcommand{\headrulewidth}{0pt} -\fancyheadoffset{0pt} -\rhead{\scshape \runninghead - \today} -\cfoot{\thepage} - -% font sizes with reduced leading -\renewcommand{\normalsize}{% - \@setfontsize\normalsize\@xpt\@xipt - \abovedisplayskip 7\p@ \@plus 2\p@ \@minus 5\p@ - \abovedisplayshortskip \z@ \@plus 3\p@ - \belowdisplayskip \abovedisplayskip - \belowdisplayshortskip 4\p@ \@plus 3\p@ \@minus 3\p@ -} -\normalsize -\renewcommand{\small}{% - \@setfontsize\small\@ixpt\@xpt - \abovedisplayskip 6\p@ \@plus 1.5\p@ \@minus 4\p@ - \abovedisplayshortskip \z@ \@plus 2\p@ - \belowdisplayskip \abovedisplayskip - \belowdisplayshortskip 3\p@ \@plus 2\p@ \@minus 2\p@ -} -\renewcommand{\footnotesize}{\@setfontsize\footnotesize\@ixpt\@xpt} -\renewcommand{\scriptsize}{\@setfontsize\scriptsize\@viipt\@viiipt} -\renewcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt} -\renewcommand{\large}{\@setfontsize\large\@xiipt{14}} -\renewcommand{\Large}{\@setfontsize\Large\@xivpt{16}} -\renewcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{20}} -\renewcommand{\huge}{\@setfontsize\huge\@xxpt{23}} -\renewcommand{\Huge}{\@setfontsize\Huge\@xxvpt{28}} - -% sections with less space -\providecommand{\section}{} -\renewcommand{\section}{% - \@startsection{section}{1}{\z@}% - {-2.0ex \@plus -0.5ex \@minus -0.2ex}% - { 1.5ex \@plus 0.3ex \@minus 0.2ex}% - {\large\bf\raggedright}% -} -\providecommand{\subsection}{} -\renewcommand{\subsection}{% - \@startsection{subsection}{2}{\z@}% - {-1.8ex \@plus -0.5ex \@minus -0.2ex}% - { 0.8ex \@plus 0.2ex}% - {\normalsize\bf\raggedright}% -} -\providecommand{\subsubsection}{} -\renewcommand{\subsubsection}{% - \@startsection{subsubsection}{3}{\z@}% - {-1.5ex \@plus -0.5ex \@minus -0.2ex}% - { 0.5ex \@plus 0.2ex}% - {\normalsize\bf\raggedright}% -} -\providecommand{\paragraph}{} -\renewcommand{\paragraph}{% - \@startsection{paragraph}{4}{\z@}% - {1.5ex \@plus 0.5ex \@minus 0.2ex}% - {-1em}% - {\normalsize\bf}% -} -\providecommand{\subparagraph}{} -\renewcommand{\subparagraph}{% - \@startsection{subparagraph}{5}{\z@}% - {1.5ex \@plus 0.5ex \@minus 0.2ex}% - {-1em}% - {\normalsize\bf}% -} -\providecommand{\subsubsubsection}{} -\renewcommand{\subsubsubsection}{% - \vskip5pt{\noindent\normalsize\rm\raggedright}% -} - -% float placement -\renewcommand{\topfraction }{0.85} -\renewcommand{\bottomfraction }{0.4} -\renewcommand{\textfraction }{0.1} -\renewcommand{\floatpagefraction}{0.7} - -\newlength{\@abovecaptionskip}\setlength{\@abovecaptionskip}{7\p@} -\newlength{\@belowcaptionskip}\setlength{\@belowcaptionskip}{\z@} - -\setlength{\abovecaptionskip}{\@abovecaptionskip} -\setlength{\belowcaptionskip}{\@belowcaptionskip} - -% swap above/belowcaptionskip lengths for tables -\renewenvironment{table} - {\setlength{\abovecaptionskip}{\@belowcaptionskip}% - \setlength{\belowcaptionskip}{\@abovecaptionskip}% - \@float{table}} - {\end@float} - -% footnote formatting -\setlength{\footnotesep }{6.65\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\renewcommand{\footnoterule}{\kern-3\p@ \hrule width 12pc \kern 2.6\p@} -\setcounter{footnote}{0} - -% paragraph formatting -\setlength{\parindent}{\z@} -\setlength{\parskip }{5.5\p@} - -% list formatting -\setlength{\topsep }{4\p@ \@plus 1\p@ \@minus 2\p@} -\setlength{\partopsep }{1\p@ \@plus 0.5\p@ \@minus 0.5\p@} -\setlength{\itemsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@} -\setlength{\parsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@} -\setlength{\leftmargin }{3pc} -\setlength{\leftmargini }{\leftmargin} -\setlength{\leftmarginii }{2em} -\setlength{\leftmarginiii}{1.5em} -\setlength{\leftmarginiv }{1.0em} -\setlength{\leftmarginv }{0.5em} -\def\@listi {\leftmargin\leftmargini} -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep 2\p@ \@plus 1\p@ \@minus 0.5\p@ - \parsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@ - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@ - \parsep \z@ - \partopsep 0.5\p@ \@plus 0\p@ \@minus 0.5\p@ - \itemsep \topsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} - -% Boxes for deferred twocolumn title+abstract output -\newsavebox{\spot@titlebox} -\newsavebox{\spot@absbox} -\newif\ifspot@twocol - -% create title -\providecommand{\maketitle}{} -\renewcommand{\maketitle}{% - \par - \if@twocolumn - \global\spot@twocoltrue - \fi - \begingroup - \renewcommand{\thefootnote}{\fnsymbol{footnote}} - % for perfect author name centering - \renewcommand{\@makefnmark}{\hbox to \z@{$^{\@thefnmark}$\hss}} - % The footnote-mark was overlapping the footnote-text, - % added the following to fix this problem (MK) - \long\def\@makefntext##1{% - \parindent 1em\noindent - \hbox to 1.8em{\hss $\m@th ^{\@thefnmark}$}##1 - } - \thispagestyle{empty} - \ifspot@twocol - % Save title for deferred output with abstract - \global\setbox\spot@titlebox=\vbox{\@maketitle}% - \else - \@maketitle - \fi - \@thanks - %\@notice - \endgroup - \let\maketitle\relax - \let\thanks\relax -} - -% rules for title box at top of first page -\newcommand{\@toptitlebar}{ - \hrule height 2\p@ - \vskip 0.25in - \vskip -\parskip% -} -\newcommand{\@bottomtitlebar}{ - \vskip 0.29in - \vskip -\parskip - \hrule height 2\p@ - \vskip 0.09in% -} - -% create title (includes both anonymized and non-anonymized versions) -\providecommand{\@maketitle}{} -\renewcommand{\@maketitle}{% - \vbox{% - \hsize\textwidth - \linewidth\hsize - \vskip 0.1in - \@toptitlebar - \centering - {\LARGE\sc \@title\par} - \@bottomtitlebar - \textsc{\runninghead}\\ - \vskip 0.1in - \def\And{% - \end{tabular}\hfil\linebreak[0]\hfil% - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces% - } - \def\AND{% - \end{tabular}\hfil\linebreak[4]\hfil% - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces% - } - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\@author\end{tabular}% - \vskip 0.4in \@minus 0.1in \center{\today} \vskip 0.2in - } -} - -% add conference notice to bottom of first page -\newcommand{\ftype@noticebox}{8} -\newcommand{\@notice}{% - % give a bit of extra room back to authors on first page - \enlargethispage{2\baselineskip}% - \@float{noticebox}[b]% - \footnotesize\@noticestring% - \end@float% -} - -% abstract styling -\renewenvironment{abstract} -{% - \ifspot@twocol - \global\setbox\spot@absbox=\vbox\bgroup - \hsize\textwidth - \linewidth\hsize - \fi - \centerline{\large \bfseries \scshape Abstract}% - \begin{quote}% -} -{% - \end{quote}% - \ifspot@twocol - \egroup% ends the \vbox - \twocolumn[% - \unvbox\spot@titlebox - \vskip 0.5em% - \unvbox\spot@absbox - \vskip 1em% - ]% - \fi -} - -\endinput diff --git a/bart26g/_extensions/mikemahoney218/arxiv/orcidlink.sty b/bart26g/_extensions/mikemahoney218/arxiv/orcidlink.sty deleted file mode 100644 index cfa2f7fa..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/orcidlink.sty +++ /dev/null @@ -1,63 +0,0 @@ -%% -%% This is file `orcidlink.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% orcidlink.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% Copyright (C) 2020 by Leo C. Stein -%% -------------------------------------------------------------------------- -%% This work may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either version 1.3 -%% of this license or (at your option) any later version. -%% The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% and version 1.3 or later is part of all distributions of LaTeX -%% version 2005/12/01 or later. -%% -\NeedsTeXFormat{LaTeX2e}[1994/06/01] -\ProvidesPackage{orcidlink} - [2021/06/11 v1.0.4 Linked ORCiD logo macro package] - -%% All I did was package up Milo's code on TeX.SE, -%% see https://tex.stackexchange.com/a/445583/34063 -\RequirePackage{hyperref} -\RequirePackage{tikz} - -\ProcessOptions\relax - -\usetikzlibrary{svg.path} - -\definecolor{orcidlogocol}{HTML}{A6CE39} -\tikzset{ - orcidlogo/.pic={ - \fill[orcidlogocol] svg{M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z}; - \fill[white] svg{M86.3,186.2H70.9V79.1h15.4v48.4V186.2z} - svg{M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z} - svg{M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1C84.2,46.7,88.7,51.3,88.7,56.8z}; - } -} - -%% Reciprocal of the height of the svg whose source is above. The -%% original generates a 256pt high graphic; this macro holds 1/256. -\newcommand{\@OrigHeightRecip}{0.00390625} - -%% We will compute the current X height to make the logo the right height -\newlength{\@curXheight} - -\DeclareRobustCommand\orcidlink[1]{% -\texorpdfstring{% -\setlength{\@curXheight}{\fontcharht\font`X}% -\href{https://orcid.org/#1}{\XeTeXLinkBox{\mbox{% -\begin{tikzpicture}[yscale=-\@OrigHeightRecip*\@curXheight, -xscale=\@OrigHeightRecip*\@curXheight,transform shape] -\pic{orcidlogo}; -\end{tikzpicture}% -}}}}{}} - -\endinput -%% -%% End of file `orcidlink.sty'. diff --git a/bart26g/_extensions/mikemahoney218/arxiv/partials/_authors.tex b/bart26g/_extensions/mikemahoney218/arxiv/partials/_authors.tex deleted file mode 100644 index 60feb815..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/partials/_authors.tex +++ /dev/null @@ -1,9 +0,0 @@ -$-- You can use as many custom partials as you need. Convention is to prefix name with '_' -$-- It can be useful to use such template to split some template parts in smaller pieces, which is easier to reuse. -$-- This '_custom.tex' is used on 'title.tex' as example. -$-- See other existing format in quarto-journals/ organisation. -$-- %%%% TODO %%%%% -$-- Use it if you need to insert content at this specific place of the main Pandoc's template. Otherwise, remove it. -$-- Here we are using it to format the authors part of the template. -$-- %%%%%%%%%%%%%%% -\textbf{$it.name.literal$}$if(it.orcid)$~\orcidlink{$it.orcid$}$endif$$for(it.affiliations)$\\$it.department$\\$it.name$\\$if(it.city)$$it.city$$if(it.postal-code)$,\ $it.postal-code$$endif$$endif$$endfor$\\$if(it.email)$\href{mailto:$it.email$}{$it.email$}$endif$ diff --git a/bart26g/_extensions/mikemahoney218/arxiv/partials/before-body.tex b/bart26g/_extensions/mikemahoney218/arxiv/partials/before-body.tex deleted file mode 100644 index 541b672b..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/partials/before-body.tex +++ /dev/null @@ -1,27 +0,0 @@ -$-- Implements the frontmatter, title page, and abstract. -$-- -$-- %%%% TODO %%%%% -$-- Customize is needed, otherwise remove this partials to use Quarto default one -$-- %%%%%%%%%%%%%%%% -$if(has-frontmatter)$ -\frontmatter -$endif$ -$if(title)$ -$if(beamer)$ -\frame{\titlepage} -$else$ -\maketitle -$endif$ -$if(abstract)$ -\begin{abstract} -$abstract$ -\end{abstract} -$endif$ -$endif$ -$if(keywords)$ -{\bfseries \emph Keywords} -\def\sep{\textbullet\ } -$for(keywords/allbutlast)$$keywords$ \sep $endfor$ -$for(keywords/last)$$keywords$$endfor$ - -$endif$ diff --git a/bart26g/_extensions/mikemahoney218/arxiv/partials/title.tex b/bart26g/_extensions/mikemahoney218/arxiv/partials/title.tex deleted file mode 100644 index 4bfc0f21..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/partials/title.tex +++ /dev/null @@ -1,40 +0,0 @@ -$-- Provides configuration of document metadata for writing the title block. -$-- Note that in addition to these templates and partials, Quarto will also make normalized authors and affiliations data available to the template, -$-- making is easy to write custom title blocks against a standard schema. -$-- -$-- %%%% TODO %%%%% -$-- Customize is needed, like below for printing the authors. Otherwise remove this partials to use Quarto default one. -$-- %%%%%%%%%%%%%%%% -$if(linenumbers)$ -\usepackage{lineno} -\linenumbers -$endif$ -$if(doublespacing)$ -\usepackage{setspace} -\doublespacing -$endif$ -$if(date)$ -\renewcommand{\today}{$date$} -$endif$ -\newcommand{\runninghead}{A Preprint } -$if(runninghead)$ -\renewcommand{\runninghead}{$runninghead$ } -$endif$ -$if(title)$ -\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} -$endif$ -$if(subtitle)$ -\usepackage{etoolbox} -\makeatletter -\providecommand{\subtitle}[1]{% add subtitle to \maketitle - \apptocmd{\@title}{\par {\large #1 \par}}{}{} -} -\makeatother -\subtitle{$subtitle$} -$endif$ -\def\asep{\\\\\\ } % default: all authors on same column -$if(authorcols)$ -\def\asep{\And } -$endif$ -\author{${ by-author:_authors.tex()[\asep] }} -\date{$date$} diff --git a/bart26g/_extensions/mikemahoney218/arxiv/shortcodes.lua b/bart26g/_extensions/mikemahoney218/arxiv/shortcodes.lua deleted file mode 100644 index 007540d5..00000000 --- a/bart26g/_extensions/mikemahoney218/arxiv/shortcodes.lua +++ /dev/null @@ -1,17 +0,0 @@ ---[[ - This file defines the shortcodes that your extension will make available - https://quarto.org/docs/authoring/shortcodes.html#custom-shortcodes - Quarto exports utils function that can be used in all filters. See - https://github.com/quarto-dev/quarto-cli/blob/main/src/resources/pandoc/datadir/init.lua#L1522-L1576 -]]-- - --- Example shortcode that provides a nicely formatted 'LaTeX' string -function latex() - if quarto.doc.isFormat("pdf") then - return pandoc.RawBlock('tex', '{\\LaTeX}') - elseif quarto.doc.isFormat("html") then - return pandoc.Math('InlineMath', "\\LaTeX") - else - return pandoc.Span('LaTeX') - end -end \ No newline at end of file diff --git a/bart26g/_quarto.yml b/bart26g/_quarto.yml deleted file mode 100644 index 621237d9..00000000 --- a/bart26g/_quarto.yml +++ /dev/null @@ -1,10 +0,0 @@ -project: - type: default - render: - - index.qmd - -execute: - freeze: auto - echo: false - -bibliography: bart26g.bib diff --git a/bart26g/arxiv.sty b/bart26g/arxiv.sty deleted file mode 100644 index 9373d527..00000000 --- a/bart26g/arxiv.sty +++ /dev/null @@ -1,274 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} - -\ProcessOptions\relax - -% fonts -\renewcommand{\rmdefault}{ptm} -\renewcommand{\sfdefault}{phv} - -% set page geometry -\usepackage[verbose=true,letterpaper]{geometry} -\AtBeginDocument{ - \newgeometry{ - textheight=9in, - textwidth=6.5in, - top=1in, - headheight=14pt, - headsep=25pt, - footskip=30pt - } -} - -\widowpenalty=10000 -\clubpenalty=10000 -\flushbottom -\sloppy - -\usepackage{fancyhdr} -\fancyhf{} -\pagestyle{fancy} -\renewcommand{\headrulewidth}{0pt} -\fancyheadoffset{0pt} -\rhead{\scshape \runninghead - \today} -\cfoot{\thepage} - -% font sizes with reduced leading -\renewcommand{\normalsize}{% - \@setfontsize\normalsize\@xpt\@xipt - \abovedisplayskip 7\p@ \@plus 2\p@ \@minus 5\p@ - \abovedisplayshortskip \z@ \@plus 3\p@ - \belowdisplayskip \abovedisplayskip - \belowdisplayshortskip 4\p@ \@plus 3\p@ \@minus 3\p@ -} -\normalsize -\renewcommand{\small}{% - \@setfontsize\small\@ixpt\@xpt - \abovedisplayskip 6\p@ \@plus 1.5\p@ \@minus 4\p@ - \abovedisplayshortskip \z@ \@plus 2\p@ - \belowdisplayskip \abovedisplayskip - \belowdisplayshortskip 3\p@ \@plus 2\p@ \@minus 2\p@ -} -\renewcommand{\footnotesize}{\@setfontsize\footnotesize\@ixpt\@xpt} -\renewcommand{\scriptsize}{\@setfontsize\scriptsize\@viipt\@viiipt} -\renewcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt} -\renewcommand{\large}{\@setfontsize\large\@xiipt{14}} -\renewcommand{\Large}{\@setfontsize\Large\@xivpt{16}} -\renewcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{20}} -\renewcommand{\huge}{\@setfontsize\huge\@xxpt{23}} -\renewcommand{\Huge}{\@setfontsize\Huge\@xxvpt{28}} - -% sections with less space -\providecommand{\section}{} -\renewcommand{\section}{% - \@startsection{section}{1}{\z@}% - {-2.0ex \@plus -0.5ex \@minus -0.2ex}% - { 1.5ex \@plus 0.3ex \@minus 0.2ex}% - {\large\bf\raggedright}% -} -\providecommand{\subsection}{} -\renewcommand{\subsection}{% - \@startsection{subsection}{2}{\z@}% - {-1.8ex \@plus -0.5ex \@minus -0.2ex}% - { 0.8ex \@plus 0.2ex}% - {\normalsize\bf\raggedright}% -} -\providecommand{\subsubsection}{} -\renewcommand{\subsubsection}{% - \@startsection{subsubsection}{3}{\z@}% - {-1.5ex \@plus -0.5ex \@minus -0.2ex}% - { 0.5ex \@plus 0.2ex}% - {\normalsize\bf\raggedright}% -} -\providecommand{\paragraph}{} -\renewcommand{\paragraph}{% - \@startsection{paragraph}{4}{\z@}% - {1.5ex \@plus 0.5ex \@minus 0.2ex}% - {-1em}% - {\normalsize\bf}% -} -\providecommand{\subparagraph}{} -\renewcommand{\subparagraph}{% - \@startsection{subparagraph}{5}{\z@}% - {1.5ex \@plus 0.5ex \@minus 0.2ex}% - {-1em}% - {\normalsize\bf}% -} -\providecommand{\subsubsubsection}{} -\renewcommand{\subsubsubsection}{% - \vskip5pt{\noindent\normalsize\rm\raggedright}% -} - -% float placement -\renewcommand{\topfraction }{0.85} -\renewcommand{\bottomfraction }{0.4} -\renewcommand{\textfraction }{0.1} -\renewcommand{\floatpagefraction}{0.7} - -\newlength{\@abovecaptionskip}\setlength{\@abovecaptionskip}{7\p@} -\newlength{\@belowcaptionskip}\setlength{\@belowcaptionskip}{\z@} - -\setlength{\abovecaptionskip}{\@abovecaptionskip} -\setlength{\belowcaptionskip}{\@belowcaptionskip} - -% swap above/belowcaptionskip lengths for tables -\renewenvironment{table} - {\setlength{\abovecaptionskip}{\@belowcaptionskip}% - \setlength{\belowcaptionskip}{\@abovecaptionskip}% - \@float{table}} - {\end@float} - -% footnote formatting -\setlength{\footnotesep }{6.65\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\renewcommand{\footnoterule}{\kern-3\p@ \hrule width 12pc \kern 2.6\p@} -\setcounter{footnote}{0} - -% paragraph formatting -\setlength{\parindent}{\z@} -\setlength{\parskip }{5.5\p@} - -% list formatting -\setlength{\topsep }{4\p@ \@plus 1\p@ \@minus 2\p@} -\setlength{\partopsep }{1\p@ \@plus 0.5\p@ \@minus 0.5\p@} -\setlength{\itemsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@} -\setlength{\parsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@} -\setlength{\leftmargin }{3pc} -\setlength{\leftmargini }{\leftmargin} -\setlength{\leftmarginii }{2em} -\setlength{\leftmarginiii}{1.5em} -\setlength{\leftmarginiv }{1.0em} -\setlength{\leftmarginv }{0.5em} -\def\@listi {\leftmargin\leftmargini} -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep 2\p@ \@plus 1\p@ \@minus 0.5\p@ - \parsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@ - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@ - \parsep \z@ - \partopsep 0.5\p@ \@plus 0\p@ \@minus 0.5\p@ - \itemsep \topsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} - -% Boxes for deferred twocolumn title+abstract output -\newsavebox{\spot@titlebox} -\newsavebox{\spot@absbox} -\newif\ifspot@twocol - -% create title -\providecommand{\maketitle}{} -\renewcommand{\maketitle}{% - \par - \if@twocolumn - \global\spot@twocoltrue - \fi - \begingroup - \renewcommand{\thefootnote}{\fnsymbol{footnote}} - % for perfect author name centering - \renewcommand{\@makefnmark}{\hbox to \z@{$^{\@thefnmark}$\hss}} - % The footnote-mark was overlapping the footnote-text, - % added the following to fix this problem (MK) - \long\def\@makefntext##1{% - \parindent 1em\noindent - \hbox to 1.8em{\hss $\m@th ^{\@thefnmark}$}##1 - } - \thispagestyle{empty} - \ifspot@twocol - % Save title for deferred output with abstract - \global\setbox\spot@titlebox=\vbox{\@maketitle}% - \else - \@maketitle - \fi - \@thanks - %\@notice - \endgroup - \let\maketitle\relax - \let\thanks\relax -} - -% rules for title box at top of first page -\newcommand{\@toptitlebar}{ - \hrule height 2\p@ - \vskip 0.25in - \vskip -\parskip% -} -\newcommand{\@bottomtitlebar}{ - \vskip 0.29in - \vskip -\parskip - \hrule height 2\p@ - \vskip 0.09in% -} - -% create title (includes both anonymized and non-anonymized versions) -\providecommand{\@maketitle}{} -\renewcommand{\@maketitle}{% - \vbox{% - \hsize\textwidth - \linewidth\hsize - \vskip 0.1in - \@toptitlebar - \centering - {\LARGE\sc \@title\par} - \@bottomtitlebar - \textsc{\runninghead}\\ - \vskip 0.1in - \def\And{% - \end{tabular}\hfil\linebreak[0]\hfil% - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces% - } - \def\AND{% - \end{tabular}\hfil\linebreak[4]\hfil% - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces% - } - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\@author\end{tabular}% - \vskip 0.4in \@minus 0.1in \center{\today} \vskip 0.2in - } -} - -% add conference notice to bottom of first page -\newcommand{\ftype@noticebox}{8} -\newcommand{\@notice}{% - % give a bit of extra room back to authors on first page - \enlargethispage{2\baselineskip}% - \@float{noticebox}[b]% - \footnotesize\@noticestring% - \end@float% -} - -% abstract styling -\renewenvironment{abstract} -{% - \ifspot@twocol - \global\setbox\spot@absbox=\vbox\bgroup - \hsize\textwidth - \linewidth\hsize - \fi - \centerline{\large \bfseries \scshape Abstract}% - \begin{quote}% -} -{% - \end{quote}% - \ifspot@twocol - \egroup% ends the \vbox - \twocolumn[% - \unvbox\spot@titlebox - \vskip 0.5em% - \unvbox\spot@absbox - \vskip 1em% - ]% - \fi -} - -\endinput diff --git a/bart26g/arxiv_submission/arxiv.sty b/bart26g/arxiv_submission/arxiv.sty deleted file mode 100644 index 9373d527..00000000 --- a/bart26g/arxiv_submission/arxiv.sty +++ /dev/null @@ -1,274 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} - -\ProcessOptions\relax - -% fonts -\renewcommand{\rmdefault}{ptm} -\renewcommand{\sfdefault}{phv} - -% set page geometry -\usepackage[verbose=true,letterpaper]{geometry} -\AtBeginDocument{ - \newgeometry{ - textheight=9in, - textwidth=6.5in, - top=1in, - headheight=14pt, - headsep=25pt, - footskip=30pt - } -} - -\widowpenalty=10000 -\clubpenalty=10000 -\flushbottom -\sloppy - -\usepackage{fancyhdr} -\fancyhf{} -\pagestyle{fancy} -\renewcommand{\headrulewidth}{0pt} -\fancyheadoffset{0pt} -\rhead{\scshape \runninghead - \today} -\cfoot{\thepage} - -% font sizes with reduced leading -\renewcommand{\normalsize}{% - \@setfontsize\normalsize\@xpt\@xipt - \abovedisplayskip 7\p@ \@plus 2\p@ \@minus 5\p@ - \abovedisplayshortskip \z@ \@plus 3\p@ - \belowdisplayskip \abovedisplayskip - \belowdisplayshortskip 4\p@ \@plus 3\p@ \@minus 3\p@ -} -\normalsize -\renewcommand{\small}{% - \@setfontsize\small\@ixpt\@xpt - \abovedisplayskip 6\p@ \@plus 1.5\p@ \@minus 4\p@ - \abovedisplayshortskip \z@ \@plus 2\p@ - \belowdisplayskip \abovedisplayskip - \belowdisplayshortskip 3\p@ \@plus 2\p@ \@minus 2\p@ -} -\renewcommand{\footnotesize}{\@setfontsize\footnotesize\@ixpt\@xpt} -\renewcommand{\scriptsize}{\@setfontsize\scriptsize\@viipt\@viiipt} -\renewcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt} -\renewcommand{\large}{\@setfontsize\large\@xiipt{14}} -\renewcommand{\Large}{\@setfontsize\Large\@xivpt{16}} -\renewcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{20}} -\renewcommand{\huge}{\@setfontsize\huge\@xxpt{23}} -\renewcommand{\Huge}{\@setfontsize\Huge\@xxvpt{28}} - -% sections with less space -\providecommand{\section}{} -\renewcommand{\section}{% - \@startsection{section}{1}{\z@}% - {-2.0ex \@plus -0.5ex \@minus -0.2ex}% - { 1.5ex \@plus 0.3ex \@minus 0.2ex}% - {\large\bf\raggedright}% -} -\providecommand{\subsection}{} -\renewcommand{\subsection}{% - \@startsection{subsection}{2}{\z@}% - {-1.8ex \@plus -0.5ex \@minus -0.2ex}% - { 0.8ex \@plus 0.2ex}% - {\normalsize\bf\raggedright}% -} -\providecommand{\subsubsection}{} -\renewcommand{\subsubsection}{% - \@startsection{subsubsection}{3}{\z@}% - {-1.5ex \@plus -0.5ex \@minus -0.2ex}% - { 0.5ex \@plus 0.2ex}% - {\normalsize\bf\raggedright}% -} -\providecommand{\paragraph}{} -\renewcommand{\paragraph}{% - \@startsection{paragraph}{4}{\z@}% - {1.5ex \@plus 0.5ex \@minus 0.2ex}% - {-1em}% - {\normalsize\bf}% -} -\providecommand{\subparagraph}{} -\renewcommand{\subparagraph}{% - \@startsection{subparagraph}{5}{\z@}% - {1.5ex \@plus 0.5ex \@minus 0.2ex}% - {-1em}% - {\normalsize\bf}% -} -\providecommand{\subsubsubsection}{} -\renewcommand{\subsubsubsection}{% - \vskip5pt{\noindent\normalsize\rm\raggedright}% -} - -% float placement -\renewcommand{\topfraction }{0.85} -\renewcommand{\bottomfraction }{0.4} -\renewcommand{\textfraction }{0.1} -\renewcommand{\floatpagefraction}{0.7} - -\newlength{\@abovecaptionskip}\setlength{\@abovecaptionskip}{7\p@} -\newlength{\@belowcaptionskip}\setlength{\@belowcaptionskip}{\z@} - -\setlength{\abovecaptionskip}{\@abovecaptionskip} -\setlength{\belowcaptionskip}{\@belowcaptionskip} - -% swap above/belowcaptionskip lengths for tables -\renewenvironment{table} - {\setlength{\abovecaptionskip}{\@belowcaptionskip}% - \setlength{\belowcaptionskip}{\@abovecaptionskip}% - \@float{table}} - {\end@float} - -% footnote formatting -\setlength{\footnotesep }{6.65\p@} -\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} -\renewcommand{\footnoterule}{\kern-3\p@ \hrule width 12pc \kern 2.6\p@} -\setcounter{footnote}{0} - -% paragraph formatting -\setlength{\parindent}{\z@} -\setlength{\parskip }{5.5\p@} - -% list formatting -\setlength{\topsep }{4\p@ \@plus 1\p@ \@minus 2\p@} -\setlength{\partopsep }{1\p@ \@plus 0.5\p@ \@minus 0.5\p@} -\setlength{\itemsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@} -\setlength{\parsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@} -\setlength{\leftmargin }{3pc} -\setlength{\leftmargini }{\leftmargin} -\setlength{\leftmarginii }{2em} -\setlength{\leftmarginiii}{1.5em} -\setlength{\leftmarginiv }{1.0em} -\setlength{\leftmarginv }{0.5em} -\def\@listi {\leftmargin\leftmargini} -\def\@listii {\leftmargin\leftmarginii - \labelwidth\leftmarginii - \advance\labelwidth-\labelsep - \topsep 2\p@ \@plus 1\p@ \@minus 0.5\p@ - \parsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@ - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii - \advance\labelwidth-\labelsep - \topsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@ - \parsep \z@ - \partopsep 0.5\p@ \@plus 0\p@ \@minus 0.5\p@ - \itemsep \topsep} -\def\@listiv {\leftmargin\leftmarginiv - \labelwidth\leftmarginiv - \advance\labelwidth-\labelsep} -\def\@listv {\leftmargin\leftmarginv - \labelwidth\leftmarginv - \advance\labelwidth-\labelsep} -\def\@listvi {\leftmargin\leftmarginvi - \labelwidth\leftmarginvi - \advance\labelwidth-\labelsep} - -% Boxes for deferred twocolumn title+abstract output -\newsavebox{\spot@titlebox} -\newsavebox{\spot@absbox} -\newif\ifspot@twocol - -% create title -\providecommand{\maketitle}{} -\renewcommand{\maketitle}{% - \par - \if@twocolumn - \global\spot@twocoltrue - \fi - \begingroup - \renewcommand{\thefootnote}{\fnsymbol{footnote}} - % for perfect author name centering - \renewcommand{\@makefnmark}{\hbox to \z@{$^{\@thefnmark}$\hss}} - % The footnote-mark was overlapping the footnote-text, - % added the following to fix this problem (MK) - \long\def\@makefntext##1{% - \parindent 1em\noindent - \hbox to 1.8em{\hss $\m@th ^{\@thefnmark}$}##1 - } - \thispagestyle{empty} - \ifspot@twocol - % Save title for deferred output with abstract - \global\setbox\spot@titlebox=\vbox{\@maketitle}% - \else - \@maketitle - \fi - \@thanks - %\@notice - \endgroup - \let\maketitle\relax - \let\thanks\relax -} - -% rules for title box at top of first page -\newcommand{\@toptitlebar}{ - \hrule height 2\p@ - \vskip 0.25in - \vskip -\parskip% -} -\newcommand{\@bottomtitlebar}{ - \vskip 0.29in - \vskip -\parskip - \hrule height 2\p@ - \vskip 0.09in% -} - -% create title (includes both anonymized and non-anonymized versions) -\providecommand{\@maketitle}{} -\renewcommand{\@maketitle}{% - \vbox{% - \hsize\textwidth - \linewidth\hsize - \vskip 0.1in - \@toptitlebar - \centering - {\LARGE\sc \@title\par} - \@bottomtitlebar - \textsc{\runninghead}\\ - \vskip 0.1in - \def\And{% - \end{tabular}\hfil\linebreak[0]\hfil% - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces% - } - \def\AND{% - \end{tabular}\hfil\linebreak[4]\hfil% - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces% - } - \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\@author\end{tabular}% - \vskip 0.4in \@minus 0.1in \center{\today} \vskip 0.2in - } -} - -% add conference notice to bottom of first page -\newcommand{\ftype@noticebox}{8} -\newcommand{\@notice}{% - % give a bit of extra room back to authors on first page - \enlargethispage{2\baselineskip}% - \@float{noticebox}[b]% - \footnotesize\@noticestring% - \end@float% -} - -% abstract styling -\renewenvironment{abstract} -{% - \ifspot@twocol - \global\setbox\spot@absbox=\vbox\bgroup - \hsize\textwidth - \linewidth\hsize - \fi - \centerline{\large \bfseries \scshape Abstract}% - \begin{quote}% -} -{% - \end{quote}% - \ifspot@twocol - \egroup% ends the \vbox - \twocolumn[% - \unvbox\spot@titlebox - \vskip 0.5em% - \unvbox\spot@absbox - \vskip 1em% - ]% - \fi -} - -\endinput diff --git a/bart26g/arxiv_submission/fig-actual-vs-predicted-output-1.pdf b/bart26g/arxiv_submission/fig-actual-vs-predicted-output-1.pdf deleted file mode 100644 index 2c202e63..00000000 Binary files a/bart26g/arxiv_submission/fig-actual-vs-predicted-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-contour-output-1.pdf b/bart26g/arxiv_submission/fig-contour-output-1.pdf deleted file mode 100644 index b83aff88..00000000 Binary files a/bart26g/arxiv_submission/fig-contour-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-design-points-output-1.pdf b/bart26g/arxiv_submission/fig-design-points-output-1.pdf deleted file mode 100644 index aa71d69f..00000000 Binary files a/bart26g/arxiv_submission/fig-design-points-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-hpt-importances-output-1.pdf b/bart26g/arxiv_submission/fig-hpt-importances-output-1.pdf deleted file mode 100644 index 4f3feb29..00000000 Binary files a/bart26g/arxiv_submission/fig-hpt-importances-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-hpt-progress-output-1.pdf b/bart26g/arxiv_submission/fig-hpt-progress-output-1.pdf deleted file mode 100644 index 6f19dc48..00000000 Binary files a/bart26g/arxiv_submission/fig-hpt-progress-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-importances-output-1.pdf b/bart26g/arxiv_submission/fig-importances-output-1.pdf deleted file mode 100644 index 9cc8aa47..00000000 Binary files a/bart26g/arxiv_submission/fig-importances-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-mo-contour-output-1.pdf b/bart26g/arxiv_submission/fig-mo-contour-output-1.pdf deleted file mode 100644 index 548bc2c4..00000000 Binary files a/bart26g/arxiv_submission/fig-mo-contour-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-pareto-output-1.pdf b/bart26g/arxiv_submission/fig-pareto-output-1.pdf deleted file mode 100644 index 6a087d38..00000000 Binary files a/bart26g/arxiv_submission/fig-pareto-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-progress-output-1.pdf b/bart26g/arxiv_submission/fig-progress-output-1.pdf deleted file mode 100644 index cf2807ee..00000000 Binary files a/bart26g/arxiv_submission/fig-progress-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/fig-surrogate-output-1.pdf b/bart26g/arxiv_submission/fig-surrogate-output-1.pdf deleted file mode 100644 index 2ea7f194..00000000 Binary files a/bart26g/arxiv_submission/fig-surrogate-output-1.pdf and /dev/null differ diff --git a/bart26g/arxiv_submission/index.tex b/bart26g/arxiv_submission/index.tex deleted file mode 100644 index 5108a781..00000000 --- a/bart26g/arxiv_submission/index.tex +++ /dev/null @@ -1,2160 +0,0 @@ -% Options for packages loaded elsewhere -% Options for packages loaded elsewhere -\PassOptionsToPackage{unicode}{hyperref} -\PassOptionsToPackage{hyphens}{url} -\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor} -% -\documentclass[ - twocolumn]{article} -\usepackage{xcolor} -\usepackage{amsmath,amssymb} -\setcounter{secnumdepth}{5} -\usepackage{iftex} -\ifPDFTeX - \usepackage[T1]{fontenc} - \usepackage[utf8]{inputenc} - \usepackage{textcomp} % provide euro and other symbols -\else % if luatex or xetex - \usepackage{unicode-math} % this also loads fontspec - \defaultfontfeatures{Scale=MatchLowercase} - \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} -\fi -\ifPDFTeX - \usepackage{tgtermes} -\fi -% Use upquote if available, for straight quotes in verbatim environments -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -\IfFileExists{microtype.sty}{% use microtype if available - \usepackage[]{microtype} - \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts -}{} -\makeatletter -\@ifundefined{KOMAClassName}{% if non-KOMA class - \IfFileExists{parskip.sty}{% - \usepackage{parskip} - }{% else - \setlength{\parindent}{0pt} - \setlength{\parskip}{6pt plus 2pt minus 1pt}} -}{% if KOMA class - \KOMAoptions{parskip=half}} -\makeatother -% Make \paragraph and \subparagraph free-standing -\makeatletter -\ifx\paragraph\undefined\else - \let\oldparagraph\paragraph - \renewcommand{\paragraph}{ - \@ifstar - \xxxParagraphStar - \xxxParagraphNoStar - } - \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}} - \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}} -\fi -\ifx\subparagraph\undefined\else - \let\oldsubparagraph\subparagraph - \renewcommand{\subparagraph}{ - \@ifstar - \xxxSubParagraphStar - \xxxSubParagraphNoStar - } - \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}} - \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}} -\fi -\makeatother - -\usepackage{color} -\usepackage{fancyvrb} -\newcommand{\VerbBar}{|} -\newcommand{\VERB}{\Verb[commandchars=\\\{\}]} -\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} -% Add ',fontsize=\small' for more characters per line -\usepackage{framed} -\definecolor{shadecolor}{RGB}{241,243,245} -\newenvironment{Shaded}{\begin{snugshade}}{\end{snugshade}} -\newcommand{\AlertTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}} -\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.40,0.45,0.13}{#1}} -\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\BuiltInTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}} -\newcommand{\CharTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}} -\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}} -\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{\textit{#1}}} -\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{#1}} -\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{\textbf{#1}}} -\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{\textit{#1}}} -\newcommand{\ErrorTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\ExtensionTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}} -\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.28,0.35,0.67}{#1}} -\newcommand{\ImportTok}[1]{\textcolor[rgb]{0.00,0.46,0.62}{#1}} -\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}} -\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{\textbf{#1}}} -\newcommand{\NormalTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}} -\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}} -\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}} -\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.68,0.00,0.00}{#1}} -\newcommand{\RegionMarkerTok}[1]{\textcolor[rgb]{0.00,0.23,0.31}{#1}} -\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{#1}} -\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}} -\newcommand{\StringTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}} -\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.07,0.07,0.07}{#1}} -\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.13,0.47,0.30}{#1}} -\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.37,0.37,0.37}{\textit{#1}}} - -\usepackage{longtable,booktabs,array} -\newcounter{none} % for unnumbered tables -\usepackage{calc} % for calculating minipage widths -% Correct order of tables after \paragraph or \subparagraph -\usepackage{etoolbox} -\makeatletter -\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} -\makeatother -% Allow footnotes in longtable head/foot -\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} -\makesavenoteenv{longtable} -\usepackage{graphicx} -\makeatletter -\newsavebox\pandoc@box -\newcommand*\pandocbounded[1]{% scales image to fit in text height/width - \sbox\pandoc@box{#1}% - \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}% - \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}% - \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both - \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}% - \else\usebox{\pandoc@box}% - \fi% -} -% Set default figure placement to htbp -\def\fps@figure{htbp} -\makeatother - - -% definitions for citeproc citations -\NewDocumentCommand\citeproctext{}{} -\NewDocumentCommand\citeproc{mm}{% - \begingroup\def\citeproctext{#2}\cite{#1}\endgroup} -\makeatletter - % allow citations to break across lines - \let\@cite@ofmt\@firstofone - % avoid brackets around text for \cite: - \def\@biblabel#1{} - \def\@cite#1#2{{#1\if@tempswa , #2\fi}} -\makeatother -\newlength{\cslhangindent} -\setlength{\cslhangindent}{1.5em} -\newlength{\csllabelwidth} -\setlength{\csllabelwidth}{3em} -\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing - {\begin{list}{}{% - \setlength{\itemindent}{0pt} - \setlength{\leftmargin}{0pt} - \setlength{\parsep}{0pt} - % turn on hanging indent if param 1 is 1 - \ifodd #1 - \setlength{\leftmargin}{\cslhangindent} - \setlength{\itemindent}{-1\cslhangindent} - \fi - % set entry spacing - \setlength{\itemsep}{#2\baselineskip}}} - {\end{list}} -\usepackage{calc} -\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}} -\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}} -\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}} -\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1} - - - -\setlength{\emergencystretch}{3em} % prevent overfull lines - -\providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} - - - - - - -\usepackage{arxiv} -\usepackage{orcidlink} -\usepackage{amsmath} -\usepackage[T1]{fontenc} -\usepackage{dirtree} -\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},fontsize=\small} -\makeatletter -\@ifpackageloaded{caption}{}{\usepackage{caption}} -\AtBeginDocument{% -\ifdefined\contentsname - \renewcommand*\contentsname{Table of contents} -\else - \newcommand\contentsname{Table of contents} -\fi -\ifdefined\listfigurename - \renewcommand*\listfigurename{List of Figures} -\else - \newcommand\listfigurename{List of Figures} -\fi -\ifdefined\listtablename - \renewcommand*\listtablename{List of Tables} -\else - \newcommand\listtablename{List of Tables} -\fi -\ifdefined\figurename - \renewcommand*\figurename{Figure} -\else - \newcommand\figurename{Figure} -\fi -\ifdefined\tablename - \renewcommand*\tablename{Table} -\else - \newcommand\tablename{Table} -\fi -} -\@ifpackageloaded{float}{}{\usepackage{float}} -\floatstyle{ruled} -\@ifundefined{c@chapter}{\newfloat{codelisting}{h}{lop}}{\newfloat{codelisting}{h}{lop}[chapter]} -\floatname{codelisting}{Listing} -\newcommand*\listoflistings{\listof{codelisting}{List of Listings}} -\makeatother -\makeatletter -\makeatother -\makeatletter -\@ifpackageloaded{caption}{}{\usepackage{caption}} -\@ifpackageloaded{subcaption}{}{\usepackage{subcaption}} -\makeatother -\usepackage{bookmark} -\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available -\urlstyle{same} -\hypersetup{ - pdftitle={Optimization with SpotOptim}, - colorlinks=true, - linkcolor={blue}, - filecolor={Maroon}, - citecolor={Blue}, - urlcolor={Blue}, - pdfcreator={LaTeX via pandoc}} - - -\newcommand{\runninghead}{A Preprint } -\renewcommand{\runninghead}{SpotOptim } -\title{Optimization with SpotOptim} -\def\asep{\And} -\def\arowsep{\AND} -\author{\textbf{Thomas -Bartz-Beielstein}~\orcidlink{0000-0002-5938-5158}\\\\Bartz \& Bartz -GmbH, 51643 Gummersbach, -Germany\\\\\href{mailto:bartzbeielstein@gmail.com}{bartzbeielstein@gmail.com}} -\date{} -\begin{document} -\maketitle -\begin{abstract} -The \texttt{spotoptim} package implements surrogate-model-based -optimization of expensive black-box functions in Python. Building on two -decades of Sequential Parameter Optimization (SPO) methodology, it -provides a Kriging-based optimization loop with Expected Improvement, -support for continuous, integer, and categorical variables, noise-aware -evaluation via Optimal Computing Budget Allocation (OCBA), and -multi-objective extensions. A steady-state parallelization strategy -overlaps surrogate search with objective evaluation on multi-core -hardware, and a success-rate-based restart mechanism detects stagnation -while preserving the best solution found. The package returns -scipy-compatible \texttt{OptimizeResult} objects and accepts any -scikit-learn-compatible surrogate model. Built-in TensorBoard logging -provides real-time monitoring of convergence and surrogate quality. This -paper describes the architecture and module structure of spotoptim, -provides worked examples including neural network hyperparameter tuning, -and compares the framework with BoTorch, Optuna, Ray Tune, BOHB, SMAC, -and Hyperopt. The package is open-source (AGPL-3.0). - -\textbf{Keywords:} Surrogate modeling, Sequential parameter -optimization, Bayesian optimization, Hyperparameter tuning, Kriging -\end{abstract} - - -\section{Introduction}\label{sec-introduction} - -Problems in engineering, simulation, and machine and deep learning (or -generally in artificial intelligence) require the optimization of -functions that are expensive to evaluate. Training a deep neural network -to convergence, running a computational fluid dynamics simulation, or -evaluating a reinforcement learning policy may take minutes to hours per -function call, making exhaustive search impractical. -Surrogate-model-based optimization addresses this challenge by -constructing a cheap statistical approximation of the objective function -and using it to guide the search toward promising regions of the -parameter space (Forrester et al. 2008; Gramacy 2020). Sequential -Parameter Optimization (SPO) was introduced by Bartz-Beielstein et al. -(2005) as a principled framework for tuning the parameters of -metaheuristic algorithms. Rather than relying on default settings or -ad-hoc parameter sweeps, SPO fits a Kriging (Gaussian process) model to -the observed function evaluations, selects the next evaluation point by -optimizing an acquisition function such as Expected Improvement (EI) -(Donald R. Jones et al. 1998), and iterates until the evaluation budget -is exhausted. This approach generalizes the Efficient Global -Optimization algorithm (D. R. Jones et al. 1998) to a broader class of -tuning and optimization problems, including noisy objectives and mixed -variable types. - -The SPO methodology has been implemented in several software packages -over the past two decades. The original R package SPOT, which was -available on the Comprehensive R Archive Network (CRAN)\footnote{\url{https://cran.r-project.org/web/packages/SPOT/index.html}}, -provided the first publicly available implementation and was used -extensively in the companion volume ``Hyperparameter Tuning for Machine -and Deep Learning with R'' (Bartz et al. 2022)\footnote{With more than - 150k accesses, it is one of the most popular publications in the - field. See - \url{https://link.springer.com/book/10.1007/978-981-19-5170-1}.}. An -overview of the SPOT methodology and its R implementation is given by -Bartz-Beielstein et al. (2021). The R package was subsequently ported to -Python as SpotPython, which extended the framework with PyTorch -integration and a hyperparameter tuning cookbook (Bartz-Beielstein -2023a). The \texttt{spotoptim} package\footnote{\url{https://github.com/sequential-parameter-optimization/spotoptim}} -is the current generation of this lineage. It is a complete rewrite that -preserves the core SPO algorithm while modernizing the architecture, -improving extensibility, and integrating with the Python scientific -computing ecosystem. The package is part of a family of related tools. -Together, these packages form an ecosystem for optimization-driven -scientific computing research and practice. - -The contributions of this report are threefold. First, it positions -spotoptim within the landscape of hyperparameter optimization frameworks -by comparing it with BoTorch, Optuna, Ray Tune, BOHB, SMAC, and Hyperopt -(Section~\ref{sec-related}). Second, it provides a comprehensive -description of the \texttt{spotoptim} architecture, covering the -optimization algorithm, surrogate models, acquisition functions, and -supporting modules (Section~\ref{sec-algorithm} through -Section~\ref{sec-modules}). Third, it presents worked examples that -demonstrate the package API for tasks ranging from simple function -optimization to end-to-end neural network hyperparameter tuning -(Section~\ref{sec-examples} and Section~\ref{sec-hpt}). - -The remainder of this paper is organized as follows. -Section~\ref{sec-related} reviews related work and competing frameworks. -Section~\ref{sec-examples} introduces the package through three -progressively complex examples. Section~\ref{sec-algorithm} describes -the SPO algorithm as implemented in \texttt{spotoptim}. -Section~\ref{sec-modules} details each module of the package. -Section~\ref{sec-hpt} presents an end-to-end hyperparameter tuning -workflow. Section~\ref{sec-outlook} concludes with a summary. - -\section{Related Work}\label{sec-related} - -Hyperparameter optimization has received sustained attention over the -past decade, resulting in several mature software frameworks. These -tools differ along multiple axes: the search strategy they employ -(random, bandit-based, or model-based), the type of surrogate model they -use (if any), their parallelism model (single-machine or distributed), -and the interface they present to the user. This section reviews the -most widely used frameworks and highlights how SPO, as implemented in -\texttt{spotoptim}, relates to each of them. - -Hyperopt (Bergstra et al. 2011) introduced Tree-structured Parzen -Estimators (TPE) as an alternative to Gaussian-process-based Bayesian -optimization. TPE avoids the \(\mathcal{O}(n^3)\) cost of fitting a -Gaussian process, making it more scalable to large numbers of -observations. However, it does not yield a global surrogate model and -therefore cannot produce uncertainty estimates or support acquisition -functions like Expected Improvement in their standard form. - -Optuna (Akiba et al. 2019) is a popular hyperparameter optimization -framework in the Python ecosystem. It employs a ``define-by-run'' API in -which the search space is specified implicitly through trial -suggestions, rather than declared upfront. The default search strategy -uses TPE. Optuna also supports Covariance Matrix Adaptation Evolution -Strategy (CMA-ES) and provides a pruning mechanism based on successive -halving that allows unpromising trials to be terminated early. - -Bayesian Optimization and Hyperband (BOHB) (Falkner et al. 2018) -combines Bayesian optimization with Hyperband, a multi-fidelity method -that allocates resources adaptively across trials. The Bayesian -component uses TPE as its surrogate, similar to Optuna. BOHB's key -contribution is the integration of early stopping into the -surrogate-based search, allowing it to discard poorly performing -configurations after partial training. This multi-fidelity approach is -effective when intermediate performance measures (such as validation -loss after a few epochs) are available. In contrast, \texttt{spotoptim} -treats the objective function as a black box that returns a single -scalar per evaluation and does not currently incorporate multi-fidelity -scheduling. - -SMAC (Hutter et al. 2011) (Sequential Model-based Algorithm -Configuration) is the framework most closely related to SPO in its -algorithmic philosophy. Like SPO, SMAC iteratively fits a surrogate -model and selects new configurations by optimizing an acquisition -function. The key difference lies in the choice of surrogate: SMAC uses -random forests which handle high-dimensional and categorical parameter -spaces well but do not provide the smooth, differentiable uncertainty -estimates that Gaussian processes offer. SMAC has its roots in SPO -(Hutter et al. 2010): similar to SPO, it was originally designed for -algorithm configuration, where the goal is to find parameter settings -that minimize the runtime or solution quality of a target algorithm -across a distribution of problem instances. \texttt{spotoptim} targets a -broader class of optimization problems, including engineering design and -simulation-based optimization, and returns scipy-compatible results that -integrate directly with the scientific Python ecosystem. - -Ray Tune (Liaw et al. 2018) is a distributed hyperparameter tuning -platform built on top of the Ray framework. Rather than implementing a -single search strategy, Ray Tune serves as an orchestrator that wraps -external search algorithms including Optuna, Hyperopt, and Bayesian -optimization libraries. Its primary strength lies in scalable trial -scheduling across clusters, making it well-suited for large-scale -distributed training. While Ray Tune excels at distributed scheduling, -it is not itself a surrogate-based optimizer and delegates the actual -search logic to external backends. - -BoTorch (Balandat et al. 2020) is a PyTorch-based library for Bayesian -optimization developed at Meta. It provides Gaussian process surrogates -and enables efficient handling of batch, multi-objective, and -constrained settings. BoTorch is designed as a modular research toolkit -and assumes familiarity with PyTorch idioms such as tensors, devices, -and custom training loops. In contrast, \texttt{spotoptim} targets -practitioners working within the scipy/scikit-learn ecosystem. - -Several features distinguish SPO and its implementation in -\texttt{spotoptim} from the frameworks reviewed above. First, -\texttt{spotoptim} uses Kriging as its default surrogate, providing -principled uncertainty quantification through the predictive variance of -the Gaussian process. This enables acquisition functions such as -Expected Improvement (Donald R. Jones et al. 1998) and Probability of -Improvement with a sound statistical foundation. Second, the package -returns scipy-compatible \texttt{OptimizeResult} objects, allowing -results to be consumed by any tool in the scipy ecosystem without -conversion. Third, \texttt{spotoptim} natively supports mixed variable -types (continuous, integer, and categorical) with appropriate handling -within the surrogate model. Fourth, noisy objectives are handled through -built-in repeated evaluations combined with Optimal Computing Budget -Allocation (OCBA) (Bartz-Beielstein and Friese 2011; Bartz-Beielstein et -al. 2011), a feature not available in any of the competing frameworks -reviewed here. Fifth, multi-objective optimization is supported and -scalarization via desirability functions is available (Bartz-Beielstein -2025a, 2025b). Finally, the surrogate interface follows the scikit-learn -estimator convention (\texttt{fit}/\texttt{predict}), making it -straightforward to substitute Kriging with any compatible model, -including scikit-learn's \texttt{GaussianProcessRegressor}, random -forests, or the package's own neural-network-based -\texttt{MLPSurrogate}. - -\section{Simple Examples}\label{sec-examples} - -This section introduces the \texttt{spotoptim} API through three -progressively complex examples. Each example is self-contained and -demonstrates a different aspect of the optimization workflow. - -\subsection{Minimizing the Sphere -Function}\label{minimizing-the-sphere-function} - -The simplest use case is the optimization of a scalar-valued function -over continuous variables. The following code minimizes the sphere -function \(f(\mathbf{x}) = \sum_{i=1}^d x_i^2\), where \(d\) denotes the -number of dimensions, in two dimensions: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ sphere} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{sphere,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{20}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best value: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.6f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best point: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{x}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Best value: 0.000001 -Best point: [-0.00016718 0.00071419] -\end{verbatim} - -Three ingredients are required: a callable \texttt{fun} that accepts an -\((n, d)\) array (where \(n\) is the number of samples to evaluate) and -returns an \((n,)\) array, a list of \texttt{bounds} as -\texttt{(lower,\ upper)} tuples, and an evaluation budget via -\texttt{max\_iter}. The \texttt{n\_initial} parameter controls how many -points are evaluated in the initial Latin Hypercube design before the -surrogate-based sequential phase begins. The \texttt{optimize()} method -returns a \texttt{scipy.optimize.OptimizeResult}, which carries the best -point (\texttt{result.x}), the corresponding objective value -(\texttt{result.fun}), and the total number of function evaluations -(\texttt{result.nfev}), among other fields. - -\subsection{Expected Improvement with Explicit -Kriging}\label{expected-improvement-with-explicit-kriging} - -The default acquisition function is \texttt{"y"} (predicted value), -which performs pure exploitation by selecting the point where the -surrogate predicts the lowest value. For problems with multiple local -minima, Expected Improvement (EI) provides a better -exploration-exploitation trade-off. EI accounts for both the predicted -value and the surrogate's uncertainty: - -\begin{equation}\protect\phantomsection\label{eq-ei}{ -\begin{aligned} -\text{EI}(\mathbf{x}) &= (y_{\min} - \mu(\mathbf{x})) \, \Phi(Z) + \sigma(\mathbf{x}) \, \phi(Z), \\ -Z &= \frac{y_{\min} - \mu(\mathbf{x})}{\sigma(\mathbf{x})} -\end{aligned} -}\end{equation} - -where \(\mu(\mathbf{x})\) and \(\sigma(\mathbf{x})\) are the Kriging -mean and standard deviation, \(y_{\min}\) is the best observed value, -and \(\Phi\) and \(\phi\) are the standard normal cumulative -distribution function and probability density function, respectively -(Forrester et al. 2008). - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.surrogate }\ImportTok{import}\NormalTok{ Kriging} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ rosenbrock} - -\NormalTok{kriging }\OperatorTok{=}\NormalTok{ Kriging(} -\NormalTok{ method}\OperatorTok{=}\StringTok{"regression"}\NormalTok{,} -\NormalTok{ noise}\OperatorTok{=}\FloatTok{1e{-}3}\NormalTok{, seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{)} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{rosenbrock,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{2}\NormalTok{, }\DecValTok{2}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{2}\NormalTok{, }\DecValTok{2}\NormalTok{)],} -\NormalTok{ surrogate}\OperatorTok{=}\NormalTok{kriging,} -\NormalTok{ acquisition}\OperatorTok{=}\StringTok{"ei"}\NormalTok{,} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{25}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} - -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best value: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.6f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best point: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{x}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Best value: 0.013070 -Best point: [0.89033462 0.7894651 ] -\end{verbatim} - -Here the Kriging surrogate is constructed explicitly with a noise term -for regularization. The \texttt{acquisition="ei"} argument switches the -infill criterion from predicted value to Expected Improvement. Any -surrogate model that supports \texttt{predict(X,\ return\_std=True)} can -be used with EI and Probability of Improvement, which is also available -via the \texttt{acquisition="pi"} argument, see -Section~\ref{sec-optimizer}. - -\subsection{Mixed Variable Types}\label{mixed-variable-types} - -Many practical optimization problems involve a mixture of continuous, -integer, and categorical variables. \texttt{spotoptim} handles this -natively through the \texttt{var\_type} parameter: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np} -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} - -\KeywordTok{def}\NormalTok{ mixed\_objective(X):} -\NormalTok{ X }\OperatorTok{=}\NormalTok{ np.atleast\_2d(X)} -\NormalTok{ continuous }\OperatorTok{=}\NormalTok{ X[:, }\DecValTok{0}\NormalTok{]} -\NormalTok{ integer\_val }\OperatorTok{=}\NormalTok{ X[:, }\DecValTok{1}\NormalTok{]} -\NormalTok{ factor\_val }\OperatorTok{=}\NormalTok{ X[:, }\DecValTok{2}\NormalTok{]} - \ControlFlowTok{return}\NormalTok{ (continuous}\OperatorTok{**}\DecValTok{2} - \OperatorTok{+}\NormalTok{ (integer\_val }\OperatorTok{{-}} \DecValTok{3}\NormalTok{)}\OperatorTok{**}\DecValTok{2} - \OperatorTok{+}\NormalTok{ factor\_val)} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{mixed\_objective,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\FloatTok{5.0}\NormalTok{, }\FloatTok{5.0}\NormalTok{), (}\DecValTok{0}\NormalTok{, }\DecValTok{10}\NormalTok{), (}\DecValTok{0}\NormalTok{, }\DecValTok{4}\NormalTok{)],} -\NormalTok{ var\_type}\OperatorTok{=}\NormalTok{[}\StringTok{"float"}\NormalTok{, }\StringTok{"int"}\NormalTok{, }\StringTok{"factor"}\NormalTok{],} -\NormalTok{ var\_name}\OperatorTok{=}\NormalTok{[}\StringTok{"x\_cont"}\NormalTok{, }\StringTok{"x\_int"}\NormalTok{, }\StringTok{"x\_cat"}\NormalTok{],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{25}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} - -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best value: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.6f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best point: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{x}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Best value: 0.000001 -Best point: [-9.98879117e-04 3.00000000e+00 0.00000000e+00] -\end{verbatim} - -The three supported variable types are \texttt{"float"} (continuous), -\texttt{"int"} (integer-constrained, rounded after surrogate -prediction), and \texttt{"factor"} (categorical, encoded internally). -When \texttt{var\_type} is omitted, all variables default to -\texttt{"float"}. - -\section{The SPO Algorithm}\label{sec-algorithm} - -The default optimization loop implemented in -\texttt{SpotOptim.optimize()} follows the general structure of -surrogate-model-based optimization, also known as Bayesian optimization -when the surrogate is a Gaussian process (Gramacy 2020). The algorithm -proceeds in two phases: an initial design phase that builds a -preliminary picture of the response surface, and a sequential phase that -iteratively refines the surrogate model and proposes new evaluation -points. - -In the initial design phase, \texttt{n\_initial} points are generated -according to a space-filling design. The default is a quasi-Monte Carlo -Latin Hypercube Sampling (LHS) design (QMC-LHS), which ensures that the -marginal distribution of each variable is well-covered. Alternative -designs include Sobol sequences, regular grids, uniform random sampling, -and clustered designs. The user may also provide a custom initial design -via the \texttt{X0} argument. All initial points are evaluated on the -true objective function, and the results form the initial training set -for the surrogate. In the sequential phase, the algorithm repeats the -following steps until the evaluation budget (\texttt{max\_iter}) or the -wall-clock time limit (\texttt{max\_time}) is reached: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Fit the surrogate model to all observed data \((X, \mathbf{y})\). -\item - Optimize the acquisition function over the search space to identify - the next candidate point \(\mathbf{x}_{\text{new}}\). -\item - Evaluate \(f(\mathbf{x}_{\text{new}})\) on the true objective. -\item - Append the new observation to the data set and update running - statistics. -\end{enumerate} - -Three acquisition functions are supported, which are optimized over the -search space using one of several methods. When more than one worker is -available (\texttt{n\_jobs\ \textgreater{}\ 1}), \texttt{spotoptim} -switches from the default sequential loop to a steady-state -parallelization strategy. In the sequential mode, the surrogate is -refitted after every single evaluation; in steady-state mode, surrogate -search and objective evaluation overlap asynchronously. A thread pool -generates candidate points by optimizing the acquisition function (under -a lock that serializes surrogate reads), while a separate executor pool -evaluates the objective function in parallel. Candidates are collected -into batches of size \texttt{eval\_batch\_size} and dispatched together. -As soon as a batch of evaluations returns, the results are incorporated -into the data set, the surrogate is refitted, and new search tasks are -launched to fill the freed worker slots. This design keeps all workers -busy: while one batch is being evaluated, the next batch of candidates -is already being generated. -Figure\textasciitilde{}\ref{fig-steady-state} illustrates this two-phase -pipeline. In Phase 1, the initial design points are evaluated in -parallel and the surrogate is fitted for the first time. In Phase 2, the -steady-state loop checks the evaluation budget, dispatches search tasks -to the thread pool, collects candidates into batches, and sends them to -the evaluation pool. After each batch completes, the storage is updated, -the surrogate is refitted under a lock, and new search tasks fill the -freed worker slots. - -\begin{figure*}[t] -\centering -\includegraphics[width=0.95\textwidth]{steady-state.pdf} -\caption{Steady-state parallelization in \texttt{spotoptim}. Phase~1 evaluates the initial design in parallel and fits the first surrogate. Phase~2 overlaps surrogate search (thread pool) with objective evaluation (process or thread pool) in a steady-state loop until the budget is exhausted. Note, \texttt{Optimize acquisition} is the cheap evaluation on the surrogate, the expensive one is performed in the \texttt{eval\_pool} step.}\label{fig-steady-state} -\end{figure*} - -On standard CPython builds\footnote{With the Global Interpreter Lock - (GIL) enabled.}, the evaluation pool uses processes -(\texttt{ProcessPoolExecutor}) so that CPU-bound objective functions -achieve true parallelism, while the search pool uses threads to avoid -serialization overhead for surrogate access. On free-threaded Python -builds\footnote{Python Enhancement Proposal 703, \texttt{python3.13t}.}, -both pools use threads, eliminating \texttt{dill} serialization entirely -and reducing dispatch latency. The runtime detects the GIL state -automatically via \texttt{is\_gil\_disabled()} and selects the -appropriate executor. The following example runs a parallel optimization -with four workers: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ sphere} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{sphere,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{50}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{ n\_jobs}\OperatorTok{=}\DecValTok{4}\NormalTok{, }\CommentTok{\# parallel workers} -\NormalTok{ eval\_batch\_size}\OperatorTok{=}\DecValTok{2}\NormalTok{, }\CommentTok{\# batch size} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} - -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best value: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.6f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Total evaluations: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{nfev}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Best value: 0.000000 -Total evaluations: 50 -\end{verbatim} - -For noisy objective functions, \texttt{spotoptim} supports repeated -evaluations at each design point. The surrogate is fitted on the mean -values across repeats, reducing the influence of noise. When the noise -level varies across the search space, OCBA can be enabled through the -\texttt{ocba\_delta} parameter (Chen 2010). OCBA allocates additional -evaluation budget to the most promising and most uncertain designs, -following the theory developed by Bartz-Beielstein and Friese (2011) and -Bartz-Beielstein et al. (2011). This combination of repeated evaluations -and adaptive budget allocation provides a principled approach to noisy -optimization that is unique among the frameworks discussed in -Section~\ref{sec-related}. - -When the optimizer stalls, automatic restarts can help escape local -minima. \texttt{spotoptim} tracks a rolling success rate that measures -the fraction of recent evaluations that improved upon the incumbent best -value. A sliding window of size \texttt{window\_size} records whether -each sequential evaluation achieved a new best; the success rate is the -number of successes divided by the window length. By default -\texttt{window\_size} is set to \texttt{restart\_after\_n} (or 100 if -\texttt{restart\_after\_n} is also unset), so the success rate reflects -performance over the full restart horizon. When no improvement has -occurred for a full window, the success rate drops to zero, signalling -stagnation. The \texttt{restart\_after\_n} parameter (default 100) -specifies how many consecutive iterations with a zero success rate must -elapse before a restart is triggered. Upon restart, the optimizer -generates a fresh initial design and re-initializes the surrogate. If -\texttt{restart\_inject\_best} is \texttt{True} (the default), the best -solution found so far is injected into the new initial design, -preserving accumulated knowledge while allowing the surrogate to explore -a different region of the search space. The following example shows how -to configure the success-rate-based restart mechanism: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ sphere} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{sphere,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{20}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{42}\NormalTok{,} -\NormalTok{ window\_size}\OperatorTok{=}\DecValTok{5}\NormalTok{,} -\NormalTok{ restart\_after\_n}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ restart\_inject\_best}\OperatorTok{=}\VariableTok{True}\NormalTok{,} -\NormalTok{ verbose}\OperatorTok{=}\VariableTok{False}\NormalTok{,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} - -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Success rate: }\SpecialCharTok{\{}\NormalTok{opt}\SpecialCharTok{.}\NormalTok{success\_rate}\SpecialCharTok{:.2f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best value: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.6f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Evaluations: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{nfev}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Success rate: 0.40 -Best value: 0.000000 -Evaluations: 20 -\end{verbatim} - -A small \texttt{window\_size} makes the success rate sensitive to short -bursts of improvement, while a larger window smooths out isolated lucky -evaluations. A low \texttt{restart\_after\_n} triggers frequent -restarts, which favours exploration over exploitation; a high value -allows the optimizer to persist longer in a region before restarting. -The success rate is also available programmatically via the -\texttt{success\_rate} attribute, enabling custom termination logic or -logging. - -\section{Modules}\label{sec-modules} - -The \texttt{spotoptim} codebase is organized into focused modules -(subpackages), each responsible for a specific aspect of the -optimization workflow. Figure\textasciitilde{}\ref{fig-dirtree} shows -the top-level directory structure. This section describes each module, -its purpose, and its key components. Key abbreviations used in the -figure and throughout this section include multi-layer perceptron (MLP) -and principal component analysis (PCA). All modules are imported from -the top-level \texttt{spotoptim} namespace or from the corresponding -subpackage. - -\begin{figure*}[ht] -\dirtree{% -.1 src/spotoptim/. -.2 SpotOptim.py\DTcomment{Core optimizer}. -.2 core/\DTcomment{Protocol, storage, experiment control}. -.2 optimizer/\DTcomment{Acquisition, steady-state, scipy wrapper}. -.2 surrogate/\DTcomment{Kriging, MLP surrogate, Nystroem}. -.2 nn/\DTcomment{PyTorch MLP, LinearRegressor}. -.2 function/\DTcomment{Objective functions (single-/multi-objective, remote, torch)}. -.2 sampling/\DTcomment{LHS, Sobol, grid, clustered designs}. -.2 reporting/\DTcomment{Results extraction, analysis utilities}. -.2 plot/\DTcomment{Surrogate visualization, contour, multi-objective plots}. -.2 utils/\DTcomment{Boundaries, transforms, PCA, OCBA, TensorBoard, parallel}. -.2 mo/\DTcomment{Multi-objective: Morris--Mitchell, Pareto front}. -.2 hyperparameters/\DTcomment{Parameter set management for neural network tuning}. -.2 data/\DTcomment{Dataset loaders (e.g., DiabetesDataset)}. -.2 inspection/\DTcomment{Model/surrogate inspection}. -.2 factor\_analyzer/\DTcomment{Factor analysis}. -.2 eda/\DTcomment{Exploratory data analysis}. -.2 tricands/\DTcomment{Triangulation-based candidate generation}. -} -\caption{Top-level directory structure of the \texttt{spotoptim} package.}\label{fig-dirtree} -\end{figure*} - -\subsection{The SpotOptim Class}\label{sec-spotoptim-class} - -The \texttt{SpotOptim} class in \texttt{spotoptim.SpotOptim} is the -central orchestrator. Its constructor accepts the objective function, -bounds, and a comprehensive set of configuration parameters that control -every aspect of the optimization: the surrogate model, acquisition -function and optimizer, variable types and transformations, evaluation -budget, noise handling, restart policy, and parallelism. All parameters -are stored in a \texttt{SpotOptimConfig} dataclass and can be accessed -as attributes of the optimizer instance. The most commonly used -constructor parameters are \texttt{fun} (the objective function), -\texttt{bounds} (a list of lower/upper tuples), \texttt{max\_iter} -(total evaluation budget including the initial design), -\texttt{n\_initial} (number of initial design points), -\texttt{surrogate} (default: \texttt{Kriging(method="regression")}), -\texttt{acquisition} (\texttt{"y"}, \texttt{"ei"}, or \texttt{"pi"}), -\texttt{var\_type} (list of \texttt{"float"}, \texttt{"int"}, -\texttt{"factor"}), and \texttt{seed} (for reproducibility). The -\texttt{optimize()} method executes the algorithm described in -Section~\ref{sec-algorithm} and returns a -\texttt{scipy.optimize.OptimizeResult} with fields \texttt{x} (best -point), \texttt{fun} (best objective value), \texttt{nfev} (total -evaluations), \texttt{nit} (sequential iterations), \texttt{success}, -and \texttt{message}. The full evaluated data are available as -\texttt{result.X} and \texttt{result.y}, allowing post-hoc analysis -without re-running the optimization. - -Variable transformations can be applied through the \texttt{var\_trans} -parameter. For example, \texttt{var\_trans={[}"log10",\ None{]}} -optimizes the first variable in \(\log_{10}\) space internally while -specifying bounds in natural scale, which is useful for parameters that -span several orders of magnitude such as learning rates. The -\texttt{n\_jobs} parameter enables parallel evaluation of multiple -design points using joblib, and \texttt{eval\_batch\_size} controls how -many points are evaluated in each parallel batch. - -\subsection{Core Infrastructure}\label{sec-core} - -The \texttt{core} subpackage provides foundational components. -\texttt{SpotOptimProtocol} (defined in \texttt{core/protocol.py}) is a -structural typing protocol (PEP 544) that declares the interface -extracted modules expect from the optimizer. Modules such as -\texttt{optimizer.steady\_state} and \texttt{reporting.analysis} accept -any object matching this protocol rather than importing the concrete -\texttt{SpotOptim} class, avoiding circular imports and facilitating -independent testing. The \texttt{core.storage} module manages the -optimizer's internal data arrays through functions like -\texttt{init\_storage()} and \texttt{update\_storage()}, which handle -appending new evaluation results, updating running statistics, and -tracking the best solution found so far. \texttt{ExperimentControl} is a -dataclass that bundles dataset, model class, hyperparameters, device -settings, and training parameters into a single object for PyTorch-based -experiment workflows. - -\subsection{Surrogate Models}\label{sec-surrogate} - -The \texttt{surrogate} subpackage contains three surrogate -implementations. \texttt{Kriging} is the default and models the -objective as a Gaussian process with a Gaussian (squared-exponential) -kernel, yielding both a mean prediction \(\mu(\mathbf{x})\) and a -standard deviation \(\sigma(\mathbf{x})\) that is essential for -uncertainty-aware acquisition functions. Its key parameters include -\texttt{method} (see below), \texttt{noise} (regularization term), -\texttt{min\_theta} and \texttt{max\_theta} (bounds for log-scaled -kernel hyperparameters), and \texttt{seed}; a call to -\texttt{predict(X,\ return\_std=True)} returns both outputs. - -The kernel hyperparameters \(\boldsymbol{\theta}\) are estimated by -maximizing the concentrated log-likelihood using differential evolution. -Following Forrester et al. (2008),\footnote{Specifically, Section 2.4 - ``Kriging'' for the core predictor and likelihood, and Section 6 - ``Surrogate Modeling of Noisy Data'' for the \texttt{"regression"} and - \texttt{"reinterpolation"} methods. The Python code is based on - \texttt{likelihood.m} (concentrated log-likelihood) and - \texttt{pred.m} (prediction and error estimation) from the book's - codebase.} three fitting modes are available via the \texttt{method} -argument: \texttt{"regression"} (default) fits a generalized -least-squares model, \texttt{"interpolation"} passes exactly through the -data points, and \texttt{"reinterpolation"} applies Forrester's -correction for noisy data. The implementation is validated against the -Matlab code of Forrester et al. (2008). - -The Kriging implementation in SPO uses flexible kernel functions that -extend naturally to non-continuous parameter spaces. For categorical and -combinatorial variables, appropriate distance or similarity measures -replace the standard Euclidean distance in the correlation function, -enabling the surrogate to model landscapes over discrete, permutation, -or mixed search spaces (Bartz-Beielstein and Zaefferer 2017; Zaefferer -and Bartz-Beielstein 2016). This line of research has produced kernels -for permutation-based problems using tailored distance measures with -automated selection via maximum likelihood estimation (Zaefferer, Stork, -and Bartz-Beielstein 2014; Zaefferer, Stork, Friese, et al. 2014), as -well as kernels for hierarchical and conditional parameter spaces -arising in algorithm configuration (Gentile et al. 2021, 2018). - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np} -\ImportTok{from}\NormalTok{ spotoptim.surrogate }\ImportTok{import}\NormalTok{ Kriging} - -\NormalTok{X\_train }\OperatorTok{=}\NormalTok{ np.array([[}\FloatTok{0.0}\NormalTok{], [}\FloatTok{1.0}\NormalTok{], [}\FloatTok{3.0}\NormalTok{], [}\FloatTok{4.0}\NormalTok{]])} -\NormalTok{y\_train }\OperatorTok{=}\NormalTok{ np.array([}\FloatTok{0.0}\NormalTok{, }\FloatTok{1.0}\NormalTok{, }\FloatTok{9.0}\NormalTok{, }\FloatTok{16.0}\NormalTok{])} - -\NormalTok{model }\OperatorTok{=}\NormalTok{ Kriging(method}\OperatorTok{=}\StringTok{"regression"}\NormalTok{, seed}\OperatorTok{=}\DecValTok{0}\NormalTok{)} -\NormalTok{model.fit(X\_train, y\_train)} - -\NormalTok{X\_test }\OperatorTok{=}\NormalTok{ np.array([[}\FloatTok{0.5}\NormalTok{], [}\FloatTok{2.0}\NormalTok{], [}\FloatTok{3.5}\NormalTok{]])} -\NormalTok{y\_pred, y\_std }\OperatorTok{=}\NormalTok{ model.predict(} -\NormalTok{ X\_test, return\_std}\OperatorTok{=}\VariableTok{True} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\texttt{SimpleKriging} is a lightweight alternative for simple -continuous problems where computational speed takes priority over -flexibility. \texttt{MLPSurrogate} uses a multi-layer perceptron (MLP), -which is useful when the response surface is highly non-linear or when -the number of data points exceeds the practical limits of Kriging's -\(\mathcal{O}(n^3)\) fitting cost. Alternatively, a Nystroem -approximation module (\texttt{surrogate/nystroem.py}) provides further -scalability for large datasets. Uncertainty estimates from -\texttt{MLPSurrogate} are obtained by performing multiple forward passes -with dropout enabled and computing the empirical variance across passes. - -The surrogate interface follows the scikit-learn estimator convention. -Any model that implements \texttt{fit(X,\ y)} and \texttt{predict(X)} -can be passed as the \texttt{surrogate} argument to \texttt{SpotOptim}. -For acquisition functions that require uncertainty (\texttt{"ei"}, -\texttt{"pi"}), the model should additionally support -\texttt{predict(X,\ return\_std=True)}. This makes it straightforward to -use scikit-learn's \texttt{GaussianProcessRegressor} with custom -kernels, or any other regression model, as a drop-in replacement for -Kriging. - -Beyond single-surrogate optimization, \texttt{spotoptim} supports -multi-surrogate scheduling. The \texttt{surrogate} parameter accepts a -list of surrogate models together with a \texttt{prob\_surrogate} vector -that specifies the selection probability for each model. At every -surrogate refit step, one model is drawn at random according to these -weights and used for the next acquisition cycle. This introduces -diversity into the search: different surrogate types may fit different -regions of the landscape better, and alternating between them can reduce -the risk of systematic model bias. Each surrogate can also have its own -\texttt{max\_surrogate\_points} budget, passed as a list of the same -length. If \texttt{prob\_surrogate} is omitted, uniform weights are -assigned automatically. The following example combines a Kriging model -(selected with probability 0.7) and a random forest (selected with -probability 0.3): - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.surrogate }\ImportTok{import}\NormalTok{ Kriging} -\ImportTok{from}\NormalTok{ sklearn.ensemble }\ImportTok{import}\NormalTok{ RandomForestRegressor} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ sphere} - -\NormalTok{kriging }\OperatorTok{=}\NormalTok{ Kriging(method}\OperatorTok{=}\StringTok{"regression"}\NormalTok{, seed}\OperatorTok{=}\DecValTok{0}\NormalTok{)} -\NormalTok{rf }\OperatorTok{=}\NormalTok{ RandomForestRegressor(} -\NormalTok{ n\_estimators}\OperatorTok{=}\DecValTok{50}\NormalTok{, random\_state}\OperatorTok{=}\DecValTok{0} -\NormalTok{)} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{sphere,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{30}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{ surrogate}\OperatorTok{=}\NormalTok{[kriging, rf],} -\NormalTok{ prob\_surrogate}\OperatorTok{=}\NormalTok{[}\FloatTok{0.7}\NormalTok{, }\FloatTok{0.3}\NormalTok{],} -\NormalTok{ max\_surrogate\_points}\OperatorTok{=}\NormalTok{[}\VariableTok{None}\NormalTok{, }\DecValTok{50}\NormalTok{],} - \CommentTok{\# no cap for Kriging, 50 for RF} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} - -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best value: }\SpecialCharTok{\{}\NormalTok{result}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.6f\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Best value: 0.000000 -\end{verbatim} - -\subsection{Acquisition and Infill}\label{sec-optimizer} - -The \texttt{optimizer} subpackage implements the acquisition functions, -their optimizers as well as infill-point selection. - -\textbf{Acquisition functions.} The \texttt{acquisition\_function} -parameter selects which criterion is used to propose the next evaluation -point. Three options are available. \emph{Predicted value} -(\texttt{"y"}) selects the point where the surrogate predicts the lowest -(or highest, for maximization) objective value. This is the simplest -strategy and amounts to pure exploitation of the current model. It is -computationally cheap but can become trapped in local minima because it -does not account for surrogate uncertainty. \emph{Expected Improvement} -(\texttt{"ei"}) balances exploitation and exploration by weighting the -predicted improvement over the current best value \(y_{\min}\) against -the surrogate's predictive uncertainty \(\sigma(\mathbf{x})\). The EI -formula (Equation~\ref{eq-ei}) was introduced in -Section~\ref{sec-examples}; points with high predicted quality \emph{or} -high uncertainty receive large EI values, which encourages the optimizer -to explore under-sampled regions. \emph{Probability of Improvement} -(\texttt{"pi"}) selects the point with the highest probability of -producing an objective value below the current best \(y_{\min}\). -Probability of Improvement tends to be more exploitative than EI, -because it only measures the probability of any improvement, not its -expected magnitude. - -\textbf{Acquisition optimizers.} The \texttt{acquisition\_optimizer} -parameter determines how the acquisition function is maximized over the -search space. Differential evolution (the default) performs a global -search and is robust across a wide range of problem structures (Storn -1996). The triangulation candidates approach implements the approach -developed by Gramacy et al. (2022), generating candidate points -geometrically from the Delaunay triangulation of existing evaluations, -producing both interior candidates at simplex centroids and fringe -candidates that extend toward the search space boundary, see also -Section~\ref{sec-tricands}. The hybrid \texttt{de\_tricands} mode, which -is still experimental and has not been analyzed so far, alternates -between the two methods with probability controlled by -\texttt{prob\_de\_tricands}. Standard scipy minimizers are also -supported for local refinement. - -\textbf{Infill points.} Multiple infill points can be proposed per -iteration by setting \texttt{n\_infill\_points}, which is useful for -batch-parallel evaluation. When the acquisition optimizer fails to find -a valid new point (for example due to a flat surrogate surface), a -random fallback point is generated within bounds. For problems with many -evaluation points, the \texttt{max\_surrogate\_points} parameter limits -the number of data points used for surrogate fitting, keeping -computational cost manageable as the number of evaluations grows. Points -are selected using K-means clustering with either a space-filling -criterion (\texttt{"distant"}) or a quality-based criterion -(\texttt{"best"}). - -\subsection{Neural Network Models}\label{sec-nn} - -The \texttt{nn} subpackage provides two PyTorch modules designed for use -as objective functions and surrogates in hyperparameter tuning -workflows. The \texttt{MLP} class is a \texttt{torch.nn.Sequential} -subclass with configurable width, depth, activation, and dropout. The -architecture can be specified either explicitly through a -\texttt{hidden\_channels} list or compactly through \texttt{l1} (neurons -per hidden layer) and \texttt{num\_hidden\_layers}, which is the -representation used during hyperparameter tuning. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{import}\NormalTok{ torch} -\ImportTok{from}\NormalTok{ spotoptim.nn }\ImportTok{import}\NormalTok{ MLP} - -\NormalTok{model }\OperatorTok{=}\NormalTok{ MLP(} -\NormalTok{ in\_channels}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ l1}\OperatorTok{=}\DecValTok{64}\NormalTok{,} -\NormalTok{ num\_hidden\_layers}\OperatorTok{=}\DecValTok{2}\NormalTok{,} -\NormalTok{ output\_dim}\OperatorTok{=}\DecValTok{1}\NormalTok{,} -\NormalTok{ dropout}\OperatorTok{=}\FloatTok{0.1}\NormalTok{,} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\texttt{LinearRegressor} is a \texttt{torch.nn.Module} for regression -tasks that ranges from pure linear regression (with -\texttt{num\_hidden\_layers=0}) to a deep network with configurable -activation functions. Both classes provide a -\texttt{get\_default\_parameters()} class method that returns a -\texttt{ParameterSet} with sensible bounds for hyperparameter tuning, -and a \texttt{get\_optimizer()} method that maps string names to -\texttt{torch.optim} optimizer classes. Beyond standard PyTorch -optimizers, \texttt{spotoptim} bundles \texttt{AdamWScheduleFree}, a -schedule-free variant of AdamW that does not require a learning-rate -scheduler. - -\subsection{Built-in Test Functions}\label{sec-functions} - -The \texttt{function} subpackage contains analytical test functions for -benchmarking and testing. All functions accept a 2-D array of shape -\((n, d)\) and return a 1-D array of shape \((n,)\) for single-objective -functions, or \((n, m)\) for multi-objective functions, where \(n\), -\(d\), and \(m\) denote the number of samples, dimensions, and -objectives, respectively. - -The single-objective functions include sphere, noisy sphere (sphere with -additive Gaussian noise), Rosenbrock (narrow curved valley, minimum at -\(\mathbf{1}\)), Ackley (multi-modal with many local minima), and -Michalewicz (steep valleys with a tunable steepness parameter). -Engineering benchmark functions include \texttt{wingwt} (wing weight -estimation, 9--10 dimensions from Forrester et al. (2008)), -\texttt{robot\_arm\_hard} (10-link robot arm maze navigation), and -\texttt{lennard\_jones} (atomic cluster potential, 39 dimensions for 13 -atoms). Multi-objective functions include the ZDT family (\texttt{zdt1} -through \texttt{zdt6}), DTLZ problems (\texttt{dtlz1}, \texttt{dtlz2}), -Fonseca-Fleming, Schaffer N1, and Kursawe. Custom objective functions -can be defined by the user following the same array convention. - -\subsection{Sampling and Experimental Designs}\label{sec-sampling} - -The \texttt{sampling.design} module provides space-filling designs for -the initial evaluation phase. The default quasi-Monte Carlo Latin -Hypercube design (\texttt{generate\_qmc\_lhs\_design}) ensures that each -variable's marginal distribution is uniformly covered. Sobol sequences -(\texttt{generate\_sobol\_design}) provide quasi-random low-discrepancy -coverage that is particularly effective in higher dimensions. Regular -grids (\texttt{generate\_grid\_design}) place points at equal intervals; -the actual number of grid points is -\(\lfloor n_\text{design}^{1/d} \rfloor^d\), where \(n_\text{design}\) -is the requested number of points. Uniform random sampling -(\texttt{generate\_uniform\_design}) serves as a baseline, and clustered -designs (\texttt{generate\_clustered\_design}) produce non-uniform -distributions for testing optimizer robustness and generating so-called -``ill-conditioned'' designs. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.sampling.design }\ImportTok{import}\NormalTok{ (} -\NormalTok{ generate\_qmc\_lhs\_design,} -\NormalTok{ generate\_sobol\_design,} -\NormalTok{)} - -\NormalTok{bounds }\OperatorTok{=}\NormalTok{ [(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)]} -\NormalTok{X\_lhs }\OperatorTok{=}\NormalTok{ generate\_qmc\_lhs\_design(} -\NormalTok{ bounds, n\_design}\OperatorTok{=}\DecValTok{20}\NormalTok{, seed}\OperatorTok{=}\DecValTok{0} -\NormalTok{)} -\NormalTok{X\_sobol }\OperatorTok{=}\NormalTok{ generate\_sobol\_design(} -\NormalTok{ bounds, n\_design}\OperatorTok{=}\DecValTok{32}\NormalTok{, seed}\OperatorTok{=}\DecValTok{0} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -A pre-computed initial design can be passed to -\texttt{SpotOptim.optimize()} via the \texttt{X0} parameter, allowing -the user to incorporate prior knowledge or to resume an optimization -from a previous set of evaluations. - -\subsection{Reporting and Analysis}\label{sec-reporting} - -The \texttt{reporting} subpackage extracts and formats optimization -results. \texttt{print\_best} displays the best parameter vector and -objective value in a human-readable format, with factor variables mapped -back to their string labels. \texttt{get\_results\_table} produces a -formatted table showing each variable's name, type, bounds, default -value, and tuned (best) value, with an optional importance score column. -\texttt{get\_design\_table} summarizes the search space before -optimization, listing variable types, bounds, and transformations. For -post-hoc analysis, \texttt{get\_importance} computes a correlation-based -importance score for each variable on a 0--100 scale, and -\texttt{sensitivity\_spearman} reports Spearman rank correlations -between each parameter and the objective value, together with p-values -and significance stars. These tools help identify which hyperparameters -have the strongest influence on performance, guiding subsequent -refinements to the search space. - -\subsection{Visualization}\label{sec-plotting} - -The \texttt{plot} subpackage provides several visualization functions. -\texttt{plot\_progress} displays the full evaluation history as a -scatter plot with a best-so-far curve overlaid, distinguishing initial -design points from sequential evaluations. \texttt{plot\_surrogate} -renders a 2x2 panel showing the fitted surrogate model for a selected -pair of dimensions: the top row contains 3-D surfaces of predictions and -prediction uncertainty, while the bottom row shows the corresponding -contour plots with evaluated points overlaid. \texttt{simple\_contour} -draws a quick 2-D filled contour of any callable over a rectangular -region, and \texttt{plot\_design\_points} creates a scatter plot of -evaluated points with hidden-dimension aggregation. Multi-objective -visualization is provided through \texttt{mo\_pareto\_optx\_plot}, which -shows Pareto-optimal points in the input space, and -\texttt{mo\_xy\_contour} and \texttt{mo\_xy\_surface} for -surrogate-based objective-space visualization. The following examples -use the sphere function optimized over \([-5, 5]^2\) with 25 iterations. -Figure~\ref{fig-progress} shows a typical progress plot. The initial -design points appear as grey dots in a shaded background region; -sequential evaluations are connected by a line, and the red curve traces -the best objective value found so far. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ sphere} -\ImportTok{from}\NormalTok{ spotoptim.plot.visualization }\ImportTok{import}\NormalTok{ (} -\NormalTok{ plot\_progress} -\NormalTok{)} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{sphere,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{25}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{10}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} -\NormalTok{plot\_progress(opt, show}\OperatorTok{=}\VariableTok{False}\NormalTok{, figsize}\OperatorTok{=}\NormalTok{(}\DecValTok{6}\NormalTok{, }\DecValTok{4}\NormalTok{), log\_y}\OperatorTok{=}\VariableTok{True}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-progress-output-1.pdf}} - -} - -\caption{\label{fig-progress}Optimization progress for the sphere -function. Grey dots mark the initial Latin Hypercube design; subsequent -evaluations are connected by a line. The red curve shows the best -objective value found so far.} - -\end{figure}% - -Figure~\ref{fig-surrogate} shows the surrogate model fitted after -optimization. The top row displays 3-D surfaces of the predicted -objective value and the prediction uncertainty; the bottom row shows the -corresponding contour maps with the evaluated points overlaid as red -dots. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.plot.visualization }\ImportTok{import}\NormalTok{ (} -\NormalTok{ plot\_surrogate} -\NormalTok{)} -\NormalTok{plot\_surrogate(opt, i}\OperatorTok{=}\DecValTok{0}\NormalTok{, j}\OperatorTok{=}\DecValTok{1}\NormalTok{, show}\OperatorTok{=}\VariableTok{False}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-surrogate-output-1.pdf}} - -} - -\caption{\label{fig-surrogate}Surrogate model for dimensions \(x_0\) and -\(x_1\). Top row: 3-D surfaces of predictions (left) and prediction -uncertainty (right). Bottom row: contour plots with evaluated points -overlaid.} - -\end{figure}% - -Figure~\ref{fig-contour} illustrates \texttt{simple\_contour} applied to -the Rosenbrock function. The function accepts any callable that maps a -\((1, 2)\) array to a scalar, making it convenient for quick inspection -of objective landscapes independently of an optimization run. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ rosenbrock} -\ImportTok{from}\NormalTok{ spotoptim.plot.contour }\ImportTok{import}\NormalTok{ (} -\NormalTok{ simple\_contour} -\NormalTok{)} -\NormalTok{simple\_contour(rosenbrock,} -\NormalTok{ min\_x}\OperatorTok{={-}}\DecValTok{2}\NormalTok{, max\_x}\OperatorTok{=}\DecValTok{2}\NormalTok{, min\_y}\OperatorTok{={-}}\DecValTok{1}\NormalTok{, max\_y}\OperatorTok{=}\DecValTok{3}\NormalTok{,} -\NormalTok{ n\_levels}\OperatorTok{=}\DecValTok{30}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-contour-output-1.pdf}} - -} - -\caption{\label{fig-contour}Filled contour plot of the Rosenbrock -function over \([-2, 2] \times [-1, 3]\).} - -\end{figure}% - -For multi-objective problems, \texttt{mo\_pareto\_optx\_plot} visualizes -Pareto-optimal points in the input space. The surrogate-based -visualization functions \texttt{mo\_xy\_contour} and -\texttt{mo\_xy\_surface} generate contour and surface plots for each -objective from fitted surrogate models. Figure~\ref{fig-mo-contour} -shows the contour view for two Kriging surrogates fitted to the -Fonseca--Fleming objectives. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ fonseca\_fleming} -\ImportTok{from}\NormalTok{ spotoptim.surrogate }\ImportTok{import}\NormalTok{ Kriging} -\ImportTok{from}\NormalTok{ spotoptim.mo.pareto }\ImportTok{import}\NormalTok{ mo\_xy\_contour} - -\NormalTok{rng }\OperatorTok{=}\NormalTok{ np.random.default\_rng(}\DecValTok{0}\NormalTok{)} -\NormalTok{X\_mo }\OperatorTok{=}\NormalTok{ rng.uniform(}\OperatorTok{{-}}\DecValTok{4}\NormalTok{, }\DecValTok{4}\NormalTok{, size}\OperatorTok{=}\NormalTok{(}\DecValTok{50}\NormalTok{, }\DecValTok{2}\NormalTok{))} -\NormalTok{Y\_mo }\OperatorTok{=}\NormalTok{ fonseca\_fleming(X\_mo)} - -\NormalTok{m1 }\OperatorTok{=}\NormalTok{ Kriging()} -\NormalTok{m1.fit(X\_mo, Y\_mo[:, }\DecValTok{0}\NormalTok{])} -\NormalTok{m2 }\OperatorTok{=}\NormalTok{ Kriging()} -\NormalTok{m2.fit(X\_mo, Y\_mo[:, }\DecValTok{1}\NormalTok{])} -\NormalTok{mo\_xy\_contour(} -\NormalTok{ [m1, m2],} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{4}\NormalTok{, }\DecValTok{4}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{4}\NormalTok{, }\DecValTok{4}\NormalTok{)],} -\NormalTok{ target\_names}\OperatorTok{=}\NormalTok{[}\StringTok{"f1"}\NormalTok{, }\StringTok{"f2"}\NormalTok{],} -\NormalTok{ feature\_names}\OperatorTok{=}\NormalTok{[}\StringTok{"x0"}\NormalTok{, }\StringTok{"x1"}\NormalTok{],} -\NormalTok{ resolution}\OperatorTok{=}\DecValTok{50}\NormalTok{,} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-mo-contour-output-1.pdf}} - -} - -\caption{\label{fig-mo-contour}Surrogate contour plots for both -Fonseca--Fleming objectives, fitted from 50 random evaluations.} - -\end{figure}% - -\subsection{Utilities}\label{sec-utils} - -The \texttt{utils} subpackage collects helper functions that support the -optimization loop and post-hoc analysis. \texttt{get\_boundaries} -computes column-wise minima and maxima, and -\texttt{map\_to\_original\_scale} transforms points from the \([0, 1]\) -unit hypercube back to the original variable ranges. PCA utilities -(\texttt{get\_pca}, \texttt{get\_pca\_topk}) perform PCA on evaluation -data and identify the features with the strongest loadings on the first -two components. - -OCBA functions (\texttt{get\_ocba}, \texttt{get\_ranks}) implement the -OCBA algorithm for noisy optimization (Bartz-Beielstein and Friese -2011). Given current sample means, variances, and an incremental budget, -\texttt{get\_ocba} returns an allocation vector that concentrates -additional evaluations on the most promising and most uncertain designs. -\texttt{TorchStandardScaler} standardizes PyTorch tensors to zero mean -and unit variance, analogous to scikit-learn's \texttt{StandardScaler}. -The \texttt{is\_gil\_disabled} function checks whether the Python -interpreter is a free-threaded build (PEP 703), which \texttt{spotoptim} -uses internally to decide whether thread-based parallelism is safe for -objective evaluation. - -The TensorBoard integration (\texttt{utils/tensorboard.py}) provides -real-time monitoring of the optimization process. Setting -\texttt{tensorboard\_log=True} in the \texttt{SpotOptim} constructor -activates logging: at each iteration, the module writes scalar metrics -(current best objective value, last evaluation, success rate) and the -coordinates of the best design point to a TensorBoard event file. For -noisy optimization with repeated evaluations, additional statistics are -logged, including the best mean objective value and the variance at the -best design. Each evaluated hyperparameter configuration is also logged -via \texttt{add\_hparams}, which populates TensorBoard's HParams -dashboard and enables interactive comparison of configurations across -runs. The log directory defaults to -\texttt{runs/spotoptim\_YYYYMMDD\_HHMMSS} but can be customized via the -\texttt{tensorboard\_path} parameter. Setting -\texttt{tensorboard\_clean=True} removes all previous log directories -from the \texttt{runs} folder before a new optimization starts, -preventing clutter from accumulating across experiments. After -optimization completes, the writer is flushed and closed automatically. -The logs can then be viewed by running -\texttt{tensorboard\ -\/-logdir=runs} in a terminal and opening the -displayed URL in a browser. The integration works seamlessly with both -synchronous and steady-state (parallel) optimization modes: in the -latter case, the TensorBoard writer is temporarily detached before -pickling the optimizer for process-based parallelism and reattached -afterward, so logging continues uninterrupted. A minimal example that -enables TensorBoard logging\footnote{ View logs with: - \texttt{tensorboard\ -\/-logdir=runs/my\_experiment}.} is: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ sphere} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{sphere,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{5}\NormalTok{, }\DecValTok{5}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{20}\NormalTok{,} -\NormalTok{ tensorboard\_log}\OperatorTok{=}\VariableTok{True}\NormalTok{,} -\NormalTok{ tensorboard\_clean}\OperatorTok{=}\VariableTok{True}\NormalTok{,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} -\end{Highlighting} -\end{Shaded} - -\subsection{Multi-Objective Optimization}\label{sec-mo} - -The \texttt{mo} subpackage supports multi-objective optimization through -Pareto front analysis and scalarization. The -\texttt{is\_pareto\_efficient} function accepts a cost array of shape -\((n, m)\), where \(n\) is the number of solutions and \(m\) is the -number of objectives, and returns a boolean mask identifying the -non-dominated points. It works for any number of objectives and supports -both minimization and maximization. - -Since the surrogate model operates on scalar objectives, multi-objective -functions must be scalarized before fitting. The \texttt{fun\_mo2so} -parameter of \texttt{SpotOptim} converts the \((n, m)\) output of the -objective function into a scalar \((n,)\) vector. The simplest -scalarization is a weighted sum: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np} -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} -\ImportTok{from}\NormalTok{ spotoptim.function }\ImportTok{import}\NormalTok{ (} -\NormalTok{ fonseca\_fleming} -\NormalTok{)} - -\NormalTok{fun\_mo2so }\OperatorTok{=} \KeywordTok{lambda}\NormalTok{ y: np.}\BuiltInTok{sum}\NormalTok{(} -\NormalTok{ y }\OperatorTok{*}\NormalTok{ np.array([}\FloatTok{0.5}\NormalTok{, }\FloatTok{0.5}\NormalTok{]), axis}\OperatorTok{=}\DecValTok{1} -\NormalTok{)} - -\NormalTok{opt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{fonseca\_fleming,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{[(}\OperatorTok{{-}}\DecValTok{4}\NormalTok{, }\DecValTok{4}\NormalTok{), (}\OperatorTok{{-}}\DecValTok{4}\NormalTok{, }\DecValTok{4}\NormalTok{)],} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{30}\NormalTok{,} -\NormalTok{ n\_initial}\OperatorTok{=}\DecValTok{15}\NormalTok{,} -\NormalTok{ seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{ fun\_mo2so}\OperatorTok{=}\NormalTok{fun\_mo2so,} -\NormalTok{)} -\NormalTok{result }\OperatorTok{=}\NormalTok{ opt.optimize()} -\end{Highlighting} -\end{Shaded} - -Different weight vectors trace different regions of the Pareto front. -For more sophisticated multi-objective handling, the -\texttt{spotdesirability} package provides desirability functions that -map multiple objectives onto a single composite scale while respecting -individual target values and importance weights (Bartz-Beielstein 2025a, -2025b). - -\subsection{Hyperparameter Management}\label{sec-hyperparams} - -The \texttt{hyperparameters} subpackage provides the -\texttt{ParameterSet} class, a fluent API for defining search spaces -with typed variables. Parameters are added through chained calls to -\texttt{add\_float()}, \texttt{add\_int()}, and \texttt{add\_factor()}, -each specifying a name, bounds, default value, and optional -transformation. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.hyperparameters.parameters (} - \ImportTok{import}\NormalTok{ ParameterSet)} - -\NormalTok{ps }\OperatorTok{=}\NormalTok{ ParameterSet()} -\NormalTok{ps.add\_float(} - \StringTok{"learning\_rate"}\NormalTok{,} -\NormalTok{ low}\OperatorTok{={-}}\DecValTok{5}\NormalTok{, high}\OperatorTok{={-}}\DecValTok{1}\NormalTok{, default}\OperatorTok{={-}}\DecValTok{3}\NormalTok{,} -\NormalTok{ transform}\OperatorTok{=}\StringTok{"log10"}\NormalTok{,} -\NormalTok{)} -\NormalTok{ps.add\_int(} - \StringTok{"num\_layers"}\NormalTok{,} -\NormalTok{ low}\OperatorTok{=}\DecValTok{1}\NormalTok{, high}\OperatorTok{=}\DecValTok{5}\NormalTok{, default}\OperatorTok{=}\DecValTok{2}\NormalTok{,} -\NormalTok{)} -\NormalTok{ps.add\_float(} - \StringTok{"dropout"}\NormalTok{,} -\NormalTok{ low}\OperatorTok{=}\FloatTok{0.0}\NormalTok{, high}\OperatorTok{=}\FloatTok{0.5}\NormalTok{, default}\OperatorTok{=}\FloatTok{0.1}\NormalTok{,} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -The properties \texttt{ps.bounds}, \texttt{ps.var\_type}, -\texttt{ps.names()}, and \texttt{ps.var\_trans} map directly to the -corresponding \texttt{SpotOptim} constructor arguments, providing a -clean separation between search space definition and optimizer -configuration. The \texttt{MLP} and \texttt{LinearRegressor} classes -provide \texttt{get\_default\_parameters()} class methods that return -pre-configured \texttt{ParameterSet} instances with sensible bounds for -their hyperparameters. - -\subsection{Datasets}\label{sec-data} - -The \texttt{data} subpackage provides PyTorch \texttt{Dataset} wrappers -for use in hyperparameter tuning workflows. \texttt{DiabetesDataset} -wraps the scikit-learn diabetes regression dataset (442 samples, 10 -features) as a PyTorch \texttt{Dataset}, and -\texttt{get\_diabetes\_dataloaders()} creates train and test -\texttt{DataLoader} objects with configurable train/test split, batch -size, and optional feature scaling. These utilities simplify the setup -of neural network tuning experiments by providing ready-to-use data -pipelines. - -\subsection{Model Inspection}\label{sec-inspection} - -The \texttt{inspection} subpackage provides feature importance and -prediction diagnostics. \texttt{generate\_mdi()} trains a Random Forest -and extracts impurity-based feature importance scores. -\texttt{generate\_imp()} computes permutation importance by shuffling -each feature and measuring the degradation in model performance on a -held-out test set. \texttt{plot\_actual\_vs\_predicted()} creates -scatter plots comparing true values against model predictions, providing -a visual diagnostic of surrogate quality. - -Figure~\ref{fig-importances} shows impurity-based (Gini) and -permutation-based feature importances for the sphere optimization from -Section~\ref{sec-plotting}. Both methods correctly identify \(x_0\) and -\(x_1\) as equally important, which is expected for the symmetric sphere -function. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ sklearn.model\_selection }\ImportTok{import}\NormalTok{ (} -\NormalTok{ train\_test\_split} -\NormalTok{)} -\ImportTok{from}\NormalTok{ spotoptim.inspection }\ImportTok{import}\NormalTok{ (} -\NormalTok{ generate\_mdi, generate\_imp, plot\_importances} -\NormalTok{)} - -\NormalTok{X\_tr, X\_te, y\_tr, y\_te }\OperatorTok{=}\NormalTok{ train\_test\_split(} -\NormalTok{ opt.X\_, opt.y\_, test\_size}\OperatorTok{=}\FloatTok{0.3}\NormalTok{, random\_state}\OperatorTok{=}\DecValTok{42} -\NormalTok{)} -\NormalTok{df\_mdi }\OperatorTok{=}\NormalTok{ generate\_mdi(X\_tr, y\_tr)} -\NormalTok{perm\_imp }\OperatorTok{=}\NormalTok{ generate\_imp(X\_tr, X\_te, y\_tr, y\_te)} -\NormalTok{plot\_importances(} -\NormalTok{ df\_mdi, perm\_imp, X\_te,} -\NormalTok{ feature\_names}\OperatorTok{=}\NormalTok{[}\StringTok{"x0"}\NormalTok{, }\StringTok{"x1"}\NormalTok{],} -\NormalTok{ show}\OperatorTok{=}\VariableTok{False}\NormalTok{,} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-importances-output-1.pdf}} - -} - -\caption{\label{fig-importances}Feature importances for the sphere -optimization. Left: impurity-based (Gini) importances from a Random -Forest. Right: permutation importances on the test set.} - -\end{figure}% - -Figure~\ref{fig-actual-vs-predicted} compares the surrogate's -predictions against the true objective values for all evaluated points. -The left panel shows actual versus predicted values (points on the -diagonal indicate perfect agreement); the right panel shows residuals -versus predicted values. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.inspection }\ImportTok{import}\NormalTok{ (} -\NormalTok{ plot\_actual\_vs\_predicted} -\NormalTok{)} - -\NormalTok{y\_pred }\OperatorTok{=}\NormalTok{ opt.surrogate.predict(opt.X\_)} -\NormalTok{plot\_actual\_vs\_predicted(opt.y\_, y\_pred, show}\OperatorTok{=}\VariableTok{False}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-actual-vs-predicted-output-1.pdf}} - -} - -\caption{\label{fig-actual-vs-predicted}Surrogate prediction -diagnostics. Left: actual versus predicted objective values. Right: -residuals versus predicted values.} - -\end{figure}% - -\subsection{Factor Analysis}\label{sec-factor} - -The \texttt{factor\_analyzer} subpackage provides tools for exploratory -factor analysis of high-dimensional optimization data. It is a port of -the \texttt{factor\_analyzer} package for Python\footnote{\url{https://factor-analyzer.readthedocs.io/en/latest/index.html}}. -Before running the analysis, suitability tests (\texttt{calculate\_kmo} -for the Kaiser-Meyer-Olkin measure, -\texttt{calculate\_bartlett\_sphericity} for Bartlett's test) check -whether the data has sufficient correlational structure. The -\texttt{FactorAnalyzer} class extracts latent factors with optional -varimax or promax rotation, helping to reveal the latent structure in -large parameter spaces. - -\subsection{Exploratory Data Analysis}\label{sec-eda} - -The \texttt{eda} subpackage provides quick visualization functions for -inspecting optimization data. \texttt{plot\_ip\_histograms()} creates a -grid of histograms for each variable, with categorical variables shown -as bar charts. Specific configurations (such as the best solution) can -be overlaid as vertical lines using the \texttt{add\_points} parameter. - -\subsection{Triangulation Candidates}\label{sec-tricands} - -The \texttt{tricands} module generates candidate points for acquisition -optimization by computing the Delaunay triangulation of existing -evaluated points (Gramacy et al. 2022). Interior candidates are placed -at simplex centroids, exploring gaps between existing evaluations. -Fringe candidates extend beyond the convex hull toward the search space -boundary, encouraging exploration of unexplored regions. The \texttt{p} -parameter controls the extension fraction, and \texttt{nmax} limits the -total number of candidates. This geometry-aware approach complements the -global search performed by differential evolution and is particularly -effective in low-to-moderate dimensions where the triangulation remains -computationally tractable. - -\section{Hyperparameter Tuning with spotoptim}\label{sec-hpt} - -A primary application of \texttt{spotoptim} is the tuning of machine -learning hyperparameters, where each function evaluation corresponds to -training and validating a model with a specific configuration. This -section demonstrates a complete neural network tuning workflow using the -diabetes regression dataset, a multi-layer perceptron architecture, and -the \texttt{spotoptim} optimization loop. To keep execution time -manageable, the number of training epochs and optimization iterations -has been reduced. In practice, longer training runs (50--200 epochs per -evaluation) and larger evaluation budgets (\texttt{max\_iter} -\(\geq 30\)) are necessary to obtain reliable results. The short -configuration used here is intended solely as a demonstration of the -workflow and API; the best hyperparameters found in such a short run -should not be considered representative. - -The workflow follows five steps: define the search space, prepare the -dataset, define the objective function, run the optimization, and -analyze the results. This structure mirrors the hyperparameter tuning -methodology described in Bartz et al. (2022) and Bartz-Beielstein and -Zaefferer (2022), now implemented entirely in Python. - -\subsection{Defining the Search Space}\label{defining-the-search-space} - -The search space is defined using a \texttt{ParameterSet} that specifies -the hyperparameters to tune, their types, bounds, and transformations: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.hyperparameters }\OperatorTok{\textbackslash{}} -\NormalTok{ .parameters }\ImportTok{import}\NormalTok{ ParameterSet} - -\NormalTok{ps\_hpt }\OperatorTok{=}\NormalTok{ ParameterSet()} -\NormalTok{ps\_hpt.add\_float(}\StringTok{"lr"}\NormalTok{, low}\OperatorTok{=}\FloatTok{1e{-}5}\NormalTok{, high}\OperatorTok{=}\FloatTok{0.1}\NormalTok{,} -\NormalTok{ default}\OperatorTok{=}\FloatTok{0.001}\NormalTok{, transform}\OperatorTok{=}\StringTok{"log10"}\NormalTok{)} -\NormalTok{ps\_hpt.add\_int(}\StringTok{"l1"}\NormalTok{, low}\OperatorTok{=}\DecValTok{8}\NormalTok{, high}\OperatorTok{=}\DecValTok{128}\NormalTok{,} -\NormalTok{ default}\OperatorTok{=}\DecValTok{32}\NormalTok{)} -\NormalTok{ps\_hpt.add\_int(}\StringTok{"num\_hidden\_layers"}\NormalTok{,} -\NormalTok{ low}\OperatorTok{=}\DecValTok{1}\NormalTok{, high}\OperatorTok{=}\DecValTok{4}\NormalTok{, default}\OperatorTok{=}\DecValTok{2}\NormalTok{)} -\NormalTok{ps\_hpt.add\_float(}\StringTok{"dropout"}\NormalTok{, low}\OperatorTok{=}\FloatTok{0.0}\NormalTok{,} -\NormalTok{ high}\OperatorTok{=}\FloatTok{0.5}\NormalTok{, default}\OperatorTok{=}\FloatTok{0.1}\NormalTok{)} -\ControlFlowTok{for}\NormalTok{ n, t, b }\KeywordTok{in} \BuiltInTok{zip}\NormalTok{(} -\NormalTok{ ps\_hpt.names(),} -\NormalTok{ ps\_hpt.var\_type,} -\NormalTok{ ps\_hpt.bounds,} -\NormalTok{):} - \BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"}\SpecialCharTok{\{}\NormalTok{n}\SpecialCharTok{\}}\SpecialStringTok{ (}\SpecialCharTok{\{}\NormalTok{t}\SpecialCharTok{\}}\SpecialStringTok{): }\SpecialCharTok{\{}\NormalTok{b}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -lr (float): (1e-05, 0.1) -l1 (int): (8, 128) -num_hidden_layers (int): (1, 4) -dropout (float): (0.0, 0.5) -\end{verbatim} - -The learning rate bounds are specified in natural scale -(\([10^{-5}, 10^{-1}]\)); the \texttt{log10} transformation tells -SpotOptim to work internally in log space, so the surrogate models a -smooth landscape. SpotOptim automatically converts back to natural scale -before calling the objective function. The \texttt{ParameterSet} -properties (\texttt{ps\_hpt.bounds}, \texttt{ps\_hpt.var\_type}, -\texttt{ps\_hpt.names()}, \texttt{ps\_hpt.var\_trans}) map directly to -the \texttt{SpotOptim} constructor arguments. - -\subsection{Preparing the Dataset}\label{preparing-the-dataset} - -The diabetes dataset is loaded and split into training and test sets -using the provided data loader utility: - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.data }\ImportTok{import}\NormalTok{ (} -\NormalTok{ get\_diabetes\_dataloaders,} -\NormalTok{)} - -\NormalTok{train\_loader, test\_loader, scaler }\OperatorTok{=}\NormalTok{ (} -\NormalTok{ get\_diabetes\_dataloaders(} -\NormalTok{ test\_size}\OperatorTok{=}\FloatTok{0.2}\NormalTok{,} -\NormalTok{ batch\_size}\OperatorTok{=}\DecValTok{32}\NormalTok{,} -\NormalTok{ scale\_features}\OperatorTok{=}\VariableTok{True}\NormalTok{,} -\NormalTok{ random\_state}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{ )} -\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Training batches: }\SpecialCharTok{\{}\BuiltInTok{len}\NormalTok{(train\_loader)}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Test batches: }\SpecialCharTok{\{}\BuiltInTok{len}\NormalTok{(test\_loader)}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Training batches: 12 -Test batches: 3 -\end{verbatim} - -The \texttt{scale\_features=True} option standardizes input features to -zero mean and unit variance, which is important for neural network -training stability. - -\subsection{Defining the Objective -Function}\label{defining-the-objective-function} - -The objective function decodes hyperparameters from the search vector, -constructs a \texttt{LinearRegressor}, trains it on the training set, -and returns the mean squared error (MSE) on the test set. Because -SpotOptim applies the inverse of \texttt{var\_trans} before calling the -objective, the learning rate arrives in natural scale and can be used -directly. The number of epochs is set to 10 for this demo; production -runs should use 50--200. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{import}\NormalTok{ numpy }\ImportTok{as}\NormalTok{ np} -\ImportTok{import}\NormalTok{ torch} -\ImportTok{from}\NormalTok{ spotoptim.nn }\ImportTok{import}\NormalTok{ LinearRegressor} - -\NormalTok{N\_EPOCHS }\OperatorTok{=} \DecValTok{10} \CommentTok{\# short demo; use 50{-}200} - -\KeywordTok{def}\NormalTok{ nn\_objective(X):} -\NormalTok{ X }\OperatorTok{=}\NormalTok{ np.atleast\_2d(X)} -\NormalTok{ results }\OperatorTok{=}\NormalTok{ np.zeros(X.shape[}\DecValTok{0}\NormalTok{])} - \ControlFlowTok{for}\NormalTok{ i }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(X.shape[}\DecValTok{0}\NormalTok{]):} -\NormalTok{ lr }\OperatorTok{=}\NormalTok{ X[i, }\DecValTok{0}\NormalTok{]} -\NormalTok{ l1 }\OperatorTok{=} \BuiltInTok{int}\NormalTok{(X[i, }\DecValTok{1}\NormalTok{])} -\NormalTok{ n\_layers }\OperatorTok{=} \BuiltInTok{int}\NormalTok{(X[i, }\DecValTok{2}\NormalTok{])} -\NormalTok{ dropout }\OperatorTok{=}\NormalTok{ X[i, }\DecValTok{3}\NormalTok{]} -\NormalTok{ model }\OperatorTok{=}\NormalTok{ LinearRegressor(} -\NormalTok{ input\_dim}\OperatorTok{=}\DecValTok{10}\NormalTok{, output\_dim}\OperatorTok{=}\DecValTok{1}\NormalTok{,} -\NormalTok{ l1}\OperatorTok{=}\NormalTok{l1,} -\NormalTok{ num\_hidden\_layers}\OperatorTok{=}\NormalTok{n\_layers,} -\NormalTok{ activation}\OperatorTok{=}\StringTok{"ReLU"}\NormalTok{,} -\NormalTok{ )} -\NormalTok{ opt }\OperatorTok{=}\NormalTok{ torch.optim.Adam(} -\NormalTok{ model.parameters(), lr}\OperatorTok{=}\NormalTok{lr)} -\NormalTok{ loss\_fn }\OperatorTok{=}\NormalTok{ torch.nn.MSELoss()} -\NormalTok{ model.train()} - \ControlFlowTok{for}\NormalTok{ epoch }\KeywordTok{in} \BuiltInTok{range}\NormalTok{(N\_EPOCHS):} - \ControlFlowTok{for}\NormalTok{ xb, yb }\KeywordTok{in}\NormalTok{ train\_loader:} -\NormalTok{ opt.zero\_grad()} -\NormalTok{ loss }\OperatorTok{=}\NormalTok{ loss\_fn(model(xb), yb)} -\NormalTok{ loss.backward()} -\NormalTok{ opt.step()} -\NormalTok{ model.}\BuiltInTok{eval}\NormalTok{()} -\NormalTok{ total\_loss, n }\OperatorTok{=} \FloatTok{0.0}\NormalTok{, }\DecValTok{0} - \ControlFlowTok{with}\NormalTok{ torch.no\_grad():} - \ControlFlowTok{for}\NormalTok{ xb, yb }\KeywordTok{in}\NormalTok{ test\_loader:} -\NormalTok{ total\_loss }\OperatorTok{+=}\NormalTok{ (} -\NormalTok{ loss\_fn(model(xb), yb)} -\NormalTok{ .item() }\OperatorTok{*} \BuiltInTok{len}\NormalTok{(yb))} -\NormalTok{ n }\OperatorTok{+=} \BuiltInTok{len}\NormalTok{(yb)} -\NormalTok{ results[i] }\OperatorTok{=}\NormalTok{ total\_loss }\OperatorTok{/}\NormalTok{ n} - \ControlFlowTok{return}\NormalTok{ results} -\end{Highlighting} -\end{Shaded} - -The function follows \texttt{spotoptim}'s convention: it accepts a 2-D -array where each row is a configuration and returns a 1-D array of -objective values. - -\subsection{Running the Optimization}\label{running-the-optimization} - -With the search space and objective function defined, the optimization -is launched with a single call. The optimizer is configured with -Expected Improvement and a small budget suitable for a demo. Production -runs should increase \texttt{max\_iter} to 30 or more. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim }\ImportTok{import}\NormalTok{ SpotOptim} - -\NormalTok{opt\_hpt }\OperatorTok{=}\NormalTok{ SpotOptim(} -\NormalTok{ fun}\OperatorTok{=}\NormalTok{nn\_objective,} -\NormalTok{ bounds}\OperatorTok{=}\NormalTok{ps\_hpt.bounds,} -\NormalTok{ var\_type}\OperatorTok{=}\NormalTok{ps\_hpt.var\_type,} -\NormalTok{ var\_name}\OperatorTok{=}\NormalTok{ps\_hpt.names(),} -\NormalTok{ var\_trans}\OperatorTok{=}\NormalTok{ps\_hpt.var\_trans,} -\NormalTok{ acquisition}\OperatorTok{=}\StringTok{"ei"}\NormalTok{,} -\NormalTok{ max\_iter}\OperatorTok{=}\DecValTok{15}\NormalTok{, n\_initial}\OperatorTok{=}\DecValTok{8}\NormalTok{, seed}\OperatorTok{=}\DecValTok{0}\NormalTok{,} -\NormalTok{)} -\NormalTok{result\_hpt }\OperatorTok{=}\NormalTok{ opt\_hpt.optimize()} - -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Best MSE: }\SpecialCharTok{\{}\NormalTok{result\_hpt}\SpecialCharTok{.}\NormalTok{fun}\SpecialCharTok{:.4f\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f"Evaluations: }\SpecialCharTok{\{}\NormalTok{result\_hpt}\SpecialCharTok{.}\NormalTok{nfev}\SpecialCharTok{\}}\SpecialStringTok{"}\NormalTok{)} -\BuiltInTok{print}\NormalTok{(}\StringTok{"Best config:"}\NormalTok{)} -\ControlFlowTok{for}\NormalTok{ n, v }\KeywordTok{in} \BuiltInTok{zip}\NormalTok{(} -\NormalTok{ ps\_hpt.names(), result\_hpt.x} -\NormalTok{):} - \BuiltInTok{print}\NormalTok{(}\SpecialStringTok{f" }\SpecialCharTok{\{}\NormalTok{n}\SpecialCharTok{\}}\SpecialStringTok{: }\SpecialCharTok{\{}\NormalTok{v}\SpecialCharTok{:.6g\}}\SpecialStringTok{"}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} -Best MSE: 3534.6855 -Evaluations: 15 -Best config: - lr: 0.025114 - l1: 88 - num_hidden_layers: 2 - dropout: 0.408088 -\end{verbatim} - -The Kriging surrogate builds a model of the validation loss as a -function of the hyperparameters, and Expected Improvement guides the -search toward configurations that are either predicted to perform well -or that have high uncertainty. - -\subsection{Analyzing the Results}\label{analyzing-the-results} - -After optimization, the reporting utilities summarize which -hyperparameters were most influential and display the best -configuration. The progress plot (Figure~\ref{fig-hpt-progress}) shows -the convergence of the optimization. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.plot.visualization }\ImportTok{import}\NormalTok{ (} -\NormalTok{ plot\_progress,} -\NormalTok{)} -\NormalTok{plot\_progress(opt\_hpt, show}\OperatorTok{=}\VariableTok{False}\NormalTok{, log\_y}\OperatorTok{=}\VariableTok{True}\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-hpt-progress-output-1.pdf}} - -} - -\caption{\label{fig-hpt-progress}Hyperparameter tuning progress (demo -run with reduced epochs and budget). The red curve shows the best -validation MSE found so far.} - -\end{figure}% - -The feature importances (Figure~\ref{fig-hpt-importances}) reveal which -hyperparameters had the strongest influence on the validation loss. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ sklearn.model\_selection }\ImportTok{import}\NormalTok{ (} -\NormalTok{ train\_test\_split,} -\NormalTok{)} -\ImportTok{from}\NormalTok{ spotoptim.inspection }\ImportTok{import}\NormalTok{ (} -\NormalTok{ generate\_mdi, generate\_imp,} -\NormalTok{ plot\_importances,} -\NormalTok{)} - -\NormalTok{X\_tr, X\_te, y\_tr, y\_te }\OperatorTok{=}\NormalTok{ train\_test\_split(} -\NormalTok{ opt\_hpt.X\_, opt\_hpt.y\_,} -\NormalTok{ test\_size}\OperatorTok{=}\FloatTok{0.3}\NormalTok{, random\_state}\OperatorTok{=}\DecValTok{42}\NormalTok{,} -\NormalTok{)} -\NormalTok{df\_mdi }\OperatorTok{=}\NormalTok{ generate\_mdi(} -\NormalTok{ X\_tr, y\_tr,} -\NormalTok{ feature\_names}\OperatorTok{=}\NormalTok{ps\_hpt.names(),} -\NormalTok{)} -\NormalTok{perm\_imp }\OperatorTok{=}\NormalTok{ generate\_imp(} -\NormalTok{ X\_tr, X\_te, y\_tr, y\_te,} -\NormalTok{)} -\NormalTok{plot\_importances(} -\NormalTok{ df\_mdi, perm\_imp, X\_te,} -\NormalTok{ feature\_names}\OperatorTok{=}\NormalTok{ps\_hpt.names(),} -\NormalTok{ show}\OperatorTok{=}\VariableTok{False}\NormalTok{,} -\NormalTok{)} -\end{Highlighting} -\end{Shaded} - -\begin{figure}[H] - -\centering{ - -\pandocbounded{\includegraphics[keepaspectratio]{fig-hpt-importances-output-1.pdf}} - -} - -\caption{\label{fig-hpt-importances}Feature importances for the -hyperparameter tuning demo. Left: impurity-based (Gini) importances. -Right: permutation importances on the test set.} - -\end{figure}% - -The \texttt{sensitivity\_spearman} function reports Spearman rank -correlations between each hyperparameter and the objective value, with -significance stars indicating statistical confidence. This helps the -practitioner understand which hyperparameters merit further -investigation and which can be fixed at their default values. - -\begin{Shaded} -\begin{Highlighting}[] -\ImportTok{from}\NormalTok{ spotoptim.reporting.analysis }\ImportTok{import}\NormalTok{ (} -\NormalTok{ sensitivity\_spearman,} -\NormalTok{)} -\NormalTok{sensitivity\_spearman(opt\_hpt)} -\end{Highlighting} -\end{Shaded} - -\begin{verbatim} - -Sensitivity Analysis (Spearman Correlation): --------------------------------------------------- - lr : -0.676 (p=0.006) ** - l1 : -0.454 (p=0.089) - num_hidden_layers : +0.074 (p=0.794) - dropout : -0.533 (p=0.041) * -\end{verbatim} - -The complete workflow described here can be compared with the -corresponding Ray Tune setup documented by Bartz-Beielstein (2023b). -While Ray Tune provides distributed scheduling across multiple machines, -\texttt{spotoptim} offers a more transparent, model-centric approach -where the user controls the surrogate model, acquisition function, and -experimental design. For single-machine workflows with moderate -evaluation budgets (tens to hundreds of configurations), the -surrogate-based approach is typically more sample-efficient than the -random or bandit-based strategies employed by Ray Tune's default -schedulers. - -\section{Summary and Outlook}\label{sec-outlook} - -This paper has presented \texttt{spotoptim}, a Python package for -surrogate-model-based optimization of expensive black-box functions. The -package implements the Sequential Parameter Optimization methodology -with Kriging as the default surrogate, Expected Improvement and related -acquisition functions, native support for mixed variable types, -noise-aware evaluation through repeated evaluations and OCBA, and -multi-objective extensions via Pareto analysis and desirability -functions. The architecture is designed around scikit-learn -compatibility for surrogates and scipy compatibility for results, making -the package interoperable with the broader Python scientific computing -ecosystem. - -\texttt{spotoptim} represents the current generation of a two-decade -research lineage. It uses a modular architecture, structural typing -protocols, and comprehensive documentation. The package is part of an -ecosystem of related tools. For example, \texttt{spotdesirability} -provides desirability functions for multi-objective optimization, -enabling the user to express preferences over multiple objectives -through individual desirability curves and overall aggregation -(Bartz-Beielstein 2025a, 2025b), \texttt{spotforecast2} extends the -optimization framework to time-series forecasting, and -\texttt{spotforecast2\_safe} adds robustness guarantees for -safety-critical forecasting applications. The emergence of free-threaded -Python opens the possibility of true thread-level parallelism for -objective evaluation; \texttt{spotoptim} already includes a -\texttt{is\_gil\_disabled()} check that detects free-threaded builds and -can adapt its parallelism strategy accordingly. The \texttt{spotoptim} -package is open-source and available at -\url{https://github.com/sequential-parameter-optimization/spotoptim} -under the AGPL-3.0 license. Documentation, including an API reference -and a comprehensive user guide with executable code examples, is hosted -at \url{https://sequential-parameter-optimization.github.io/spotoptim/}. - -\section*{References}\label{references} -\addcontentsline{toc}{section}{References} - -\protect\phantomsection\label{refs} -\begin{CSLReferences}{1}{1} -\bibitem[\citeproctext]{ref-akib19a} -Akiba, Takuya, Shotaro Sano, Toshihiko Yanase, Takeru Ohta, and Masanori -Koyama. 2019. {``{Optuna: A Next-generation Hyperparameter Optimization -Framework}.''} \emph{Proceedings of the 25th ACM SIGKDD International -Conference on Knowledge Discovery \& Data Mining}, 2623--31. -\url{https://doi.org/10.1145/3292500.3330701}. - -\bibitem[\citeproctext]{ref-bala20a} -Balandat, Maximilian, Brian Karrer, Daniel R. Jiang, et al. 2020. -{``{BoTorch: A Framework for Efficient Monte-Carlo Bayesian -Optimization}.''} \emph{Advances in Neural Information Processing -Systems 33}. \url{https://arxiv.org/abs/1910.06403}. - -\bibitem[\citeproctext]{ref-bart21i} -Bartz, Eva, Thomas Bartz-Beielstein, Martin Zaefferer, and Olaf -Mersmann, eds. 2022. \emph{{Hyperparameter Tuning for Machine and Deep -Learning with R - A Practical Guide}}. Springer. - -\bibitem[\citeproctext]{ref-bart23iArXiv} -Bartz-Beielstein, Thomas. 2023a. {``{Hyperparameter Tuning Cookbook: A -guide for scikit-learn, PyTorch, river, and spotpython}.''} \emph{arXiv -e-Prints}, ahead of print, July. -\url{https://doi.org/10.48550/arXiv.2307.10262}. - -\bibitem[\citeproctext]{ref-bart23e} -Bartz-Beielstein, Thomas. 2023b. \emph{{PyTorch} Hyperparameter Tuning -with {SPOT}: Comparison with {Ray Tuner} and Default Hyperparameters on -{CIFAR10}}. -\url{https://github.com/sequential-parameter-optimization/spotpython/blob/main/notebooks/14_spot_ray_hpt_torch_cifar10.ipynb}. - -\bibitem[\citeproctext]{ref-bart25a} -Bartz-Beielstein, Thomas. 2025a. {``{Multi-Objective Optimization and -Hyperparameter Tuning With Desirability Functions}.''} \emph{arXiv -e-Prints}, March, arXiv:2503.23595. -\url{https://doi.org/10.48550/arXiv.2503.23595}. - -\bibitem[\citeproctext]{ref-bart25b} -Bartz-Beielstein, Thomas. 2025b. {``Surrogate Model-Based -Multi-Objective Optimization Using Desirability Functions.''} -\emph{Proceedings of the Genetic and Evolutionary Computation Conference -Companion} (New York, NY, USA), GECCO '25 companion, 2458--65. -\url{https://doi.org/10.1145/3712255.3734331}. - -\bibitem[\citeproctext]{ref-Bart11a} -Bartz-Beielstein, Thomas, and Martina Friese. 2011. \emph{{Sequential -Parameter Optimization and Optimal Computational Budget Allocation for -Noisy Optimization Problems}}. Cologne University of Applied Science, -Faculty of Computer Science; Engineering Science. - -\bibitem[\citeproctext]{ref-Bart11b} -Bartz-Beielstein, Thomas, Martina Friese, Martin Zaefferer, et al. 2011. -{``{Noisy optimization with sequential parameter optimization and -optimal computational budget allocation}.''} \emph{Proceedings of the -13th Annual Conference Companion on Genetic and Evolutionary -Computation} (New York, NY, USA), 119--20. - -\bibitem[\citeproctext]{ref-BLP05} -Bartz-Beielstein, Thomas, Christian Lasarczyk, and Mike Preuss. 2005. -{``{Sequential Parameter Optimization}.''} In \emph{{Proceedings 2005 -Congress on Evolutionary Computation (CEC'05), Edinburgh, Scotland}}, -{edited by B McKay et al.} {IEEE Press}. -\url{https://doi.org/10.1109/CEC.2005.1554761}. - -\bibitem[\citeproctext]{ref-Bart16n} -Bartz-Beielstein, Thomas, and Martin Zaefferer. 2017. {``Model-Based -Methods for Continuous and Discrete Global Optimization.''} -\emph{Applied Soft Computing} 55: 154--67. -\url{https://doi.org/10.1016/j.asoc.2017.01.039}. - -\bibitem[\citeproctext]{ref-bart21ic3} -Bartz-Beielstein, Thomas, and Martin Zaefferer. 2022. {``Hyperparameter -Tuning Approaches.''} Chap. 4 in \emph{{Hyperparameter Tuning for -Machine and Deep Learning with R - A Practical Guide}}, edited by Eva -Bartz, Thomas Bartz-Beielstein, Martin Zaefferer, and Olaf Mersmann. -Springer. - -\bibitem[\citeproctext]{ref-bart21b} -Bartz-Beielstein, Thomas, Martin Zaefferer, and Frederik Rehbach. 2021. -{``{In a Nutshell -- The Sequential Parameter Optimization Toolbox}.''} -\emph{arXiv e-Prints}, December, arXiv:1712.04076. - -\bibitem[\citeproctext]{ref-berg11a} -Bergstra, James, Rémi Bardenet, Yoshua Bengio, and Balázs Kégl. 2011. -{``{Algorithms for Hyper-Parameter Optimization}.''} \emph{Advances in -Neural Information Processing Systems} 24. - -\bibitem[\citeproctext]{ref-Chen10a} -Chen, Chun Hung. 2010. \emph{{Stochastic simulation optimization: an -optimal computing budget allocation}}. World Scientific. - -\bibitem[\citeproctext]{ref-falk18a} -Falkner, Stefan, Aaron Klein, and Frank Hutter. 2018. {``{BOHB: Robust -and Efficient Hyperparameter Optimization at Scale}.''} -\emph{Proceedings of the 35th International Conference on Machine -Learning}, 1437--46. - -\bibitem[\citeproctext]{ref-Forr08a} -Forrester, Alexander, András Sóbester, and Andy Keane. 2008. -\emph{{Engineering Design via Surrogate Modelling}}. Wiley. - -\bibitem[\citeproctext]{ref-Gent18a} -Gentile, Lorenzo, Thomas Bartz-Beielstein, and Martin Zaefferer. 2021. -{``Sequential Parameter Optimization for Mixed-Discrete Problems.''} In -\emph{Optimization Under Uncertainty with Applications to Aerospace -Engineering}, edited by Massimiliano Vasile. Springer International -Publishing. \url{https://doi.org/10.1007/978-3-030-60166-9_10}. - -\bibitem[\citeproctext]{ref-Gent18b} -Gentile, Lorenzo, Martin Zaefferer, Dario Giugliano, Haofeng Chen, and -Thomas Bartz-Beielstein. 2018. {``Surrogate Assisted Optimization of -Particle Reinforced Metal Matrix Composites.''} \emph{Proceedings of the -Genetic and Evolutionary Computation Conference} (New York, NY, USA), -GECCO '18, 1238--45. \url{https://doi.org/10.1145/3205455.3205574}. - -\bibitem[\citeproctext]{ref-Gram20a} -Gramacy, Robert B. 2020. \emph{Surrogates}. {CRC} press. - -\bibitem[\citeproctext]{ref-gram22a} -Gramacy, Robert B., Annie Sauer, and Nathan Wycoff. 2022. -\emph{Triangulation Candidates for Bayesian Optimization}. -\url{https://arxiv.org/abs/2112.07457}. - -\bibitem[\citeproctext]{ref-Hutt09a} -Hutter, Frank, Thomas Bartz-Beielstein, Holger Hoos, Kevin Leyton-Brown, -and Kevin P Murphy. 2010. {``{Sequential Model-Based Parameter -Optimisation: an Experimental Investigation of Automated and Interactive -Approaches}.''} In \emph{Experimental Methods for the Analysis of -Optimization Algorithms}, edited by Thomas Bartz-Beielstein, Marco -Chiarandini, Luis Paquete, and Mike Preuss. Springer. - -\bibitem[\citeproctext]{ref-hutt11a} -Hutter, Frank, Holger H. Hoos, and Kevin Leyton-Brown. 2011. -{``{Sequential Model-based Algorithm Configuration}.''} \emph{Learning -and Intelligent Optimization (LION 5)}, 507--23. -\url{https://doi.org/10.1007/978-3-642-25566-3_40}. - -\bibitem[\citeproctext]{ref-Jone98a} -Jones, D R, M Schonlau, and W J Welch. 1998. {``{Efficient Global -Optimization of Expensive Black-Box Functions}.''} \emph{Journal of -Global Optimization} 13: 455--92. - -\bibitem[\citeproctext]{ref-jones98a} -Jones, Donald R., Matthias Schonlau, and William J. Welch. 1998. -{``{Efficient Global Optimization of Expensive Black-Box Functions}.''} -\emph{Journal of Global Optimization} 13 (4): 455--92. -\url{https://doi.org/10.1023/A:1008306431147}. - -\bibitem[\citeproctext]{ref-liaw18a} -Liaw, Richard, Eric Liang, Robert Nishihara, Philipp Moritz, Roy Fox, -and Ken Goldberg. 2018. {``{Tune: A Research Platform for Distributed -Model Selection and Training}.''} \emph{ICML AutoML Workshop}. -\url{https://arxiv.org/abs/1807.05118}. - -\bibitem[\citeproctext]{ref-Stor96a} -Storn, R. 1996. {``{On the usage of differential evolution for function -optimization}.''} \emph{Fuzzy Information Processing Society, 1996. -NAFIPS., 1996 Biennial Conference of the North American}, 519--23. -\url{https://doi.org/10.1109/NAFIPS.1996.534789}. - -\bibitem[\citeproctext]{ref-Zaef16b} -Zaefferer, Martin, and Thomas Bartz-Beielstein. 2016. {``Efficient -Global Optimization with Indefinite Kernels.''} In \emph{Parallel -Problem Solving from Nature -- PPSN XIV: 14th International Conference, -Edinburgh, UK, September 17-21, 2016, Proceedings}, edited by Julia -Handl, Emma Hart, Peter R. Lewis, Manuel López-Ibáñez, Gabriela Ochoa, -and Ben Paechter. Springer International Publishing. -\url{https://doi.org/10.1007/978-3-319-45823-6_7}. - -\bibitem[\citeproctext]{ref-Zaef14c} -Zaefferer, Martin, Jörg Stork, and Thomas Bartz-Beielstein. 2014. -{``{Distance Measures for Permutations in Combinatorial Efficient Global -Optimization}.''} In \emph{Parallel Problem Solving from Nature--PPSN -XIII}, edited by Thomas Bartz-Beielstein, Jürgen Branke, Bogdan Filipic, -and Jim Smith. Springer. - -\bibitem[\citeproctext]{ref-Zaef14b} -Zaefferer, Martin, Jörg Stork, Martina Friese, Andreas Fischbach, Boris -Naujoks, and Thomas Bartz-Beielstein. 2014. {``{Efficient Global -Optimization for Combinatorial Problems}.''} In \emph{Genetic and -Evolutionary Computation Conference (GECCO'14), Proceedings}, edited by -Dirk V Arnold. ACM. -https://doi.org/\url{http://doi.acm.org/10.1145/2576768.2598282}. - -\end{CSLReferences} - - - - -\end{document} diff --git a/bart26g/arxiv_submission/orcidlink.sty b/bart26g/arxiv_submission/orcidlink.sty deleted file mode 100644 index cfa2f7fa..00000000 --- a/bart26g/arxiv_submission/orcidlink.sty +++ /dev/null @@ -1,63 +0,0 @@ -%% -%% This is file `orcidlink.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% orcidlink.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% Copyright (C) 2020 by Leo C. Stein -%% -------------------------------------------------------------------------- -%% This work may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either version 1.3 -%% of this license or (at your option) any later version. -%% The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% and version 1.3 or later is part of all distributions of LaTeX -%% version 2005/12/01 or later. -%% -\NeedsTeXFormat{LaTeX2e}[1994/06/01] -\ProvidesPackage{orcidlink} - [2021/06/11 v1.0.4 Linked ORCiD logo macro package] - -%% All I did was package up Milo's code on TeX.SE, -%% see https://tex.stackexchange.com/a/445583/34063 -\RequirePackage{hyperref} -\RequirePackage{tikz} - -\ProcessOptions\relax - -\usetikzlibrary{svg.path} - -\definecolor{orcidlogocol}{HTML}{A6CE39} -\tikzset{ - orcidlogo/.pic={ - \fill[orcidlogocol] svg{M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z}; - \fill[white] svg{M86.3,186.2H70.9V79.1h15.4v48.4V186.2z} - svg{M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z} - svg{M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1C84.2,46.7,88.7,51.3,88.7,56.8z}; - } -} - -%% Reciprocal of the height of the svg whose source is above. The -%% original generates a 256pt high graphic; this macro holds 1/256. -\newcommand{\@OrigHeightRecip}{0.00390625} - -%% We will compute the current X height to make the logo the right height -\newlength{\@curXheight} - -\DeclareRobustCommand\orcidlink[1]{% -\texorpdfstring{% -\setlength{\@curXheight}{\fontcharht\font`X}% -\href{https://orcid.org/#1}{\XeTeXLinkBox{\mbox{% -\begin{tikzpicture}[yscale=-\@OrigHeightRecip*\@curXheight, -xscale=\@OrigHeightRecip*\@curXheight,transform shape] -\pic{orcidlogo}; -\end{tikzpicture}% -}}}}{}} - -\endinput -%% -%% End of file `orcidlink.sty'. diff --git a/bart26g/arxiv_submission/steady-state.pdf b/bart26g/arxiv_submission/steady-state.pdf deleted file mode 100644 index 5ca28c6d..00000000 Binary files a/bart26g/arxiv_submission/steady-state.pdf and /dev/null differ diff --git a/bart26g/bart26g.bib b/bart26g/bart26g.bib deleted file mode 100644 index eb7b5064..00000000 --- a/bart26g/bart26g.bib +++ /dev/null @@ -1,3073 +0,0 @@ -@misc{bart20gArxiv, - archiveprefix = {arXiv}, - author = {Thomas Bartz-Beielstein and Carola Doerr and Jakob Bossek and Sowmya Chandrasekaran and Tome Eftimov and Andreas Fischbach and Pascal Kerschke and Manuel Lopez-Ibanez and Katherine M. Malan and Jason H. Moore and Boris Naujoks and Patryk Orzechowski and Vanessa Volz and Markus Wagner and Thomas Weise}, - date-added = {2021-07-22 18:10:03 +0200}, - date-modified = {2021-07-22 18:10:03 +0200}, - eprint = {2007.03488}, - howpublished = {arXiv}, - keywords = {bartzPublic}, - month = {07}, - note = {https://arxiv.org/abs/2007.03488}, - primaryclass = {cs.NE}, - title = {Benchmarking in Optimization: Best Practice and Open Issues}, - url = {https://arxiv.org/abs/2007.03488}, - year = {2020} -} - - - -@article{hard19a, - author = {Hardin, D. P. and Michaels, T. J. and Saff, E. B.}, - date = {2019/01/01}, - date-added = {2026-03-13 21:41:09 +0100}, - date-modified = {2026-03-13 21:41:38 +0100}, - doi = {https://doi.org/10.1112/S0025579318000360}, - isbn = {0025-5793}, - journal = {Mathematika}, - journal1 = {Mathematika}, - journal2 = {Mathematika}, - journal3 = {Mathematika}, - month = {2026/03/13}, - n2 = {Utilizing frameworks developed by Delsarte, Yudin and Levenshtein, we deduce linear programming lower bounds (as ) for the Riesz energy of -point configurations on the -dimensional unit sphere in the so-called hypersingular case; i.e., for non-integrable Riesz kernels of the form with . As a consequence, we immediately get (thanks to the poppy-seed bagel theorem) lower estimates for the large limits of minimal hypersingular Riesz energy on compact -rectifiable sets. Furthermore, for the Gaussian potential on , we obtain lower bounds for the energy of infinite configurations having a prescribed density.}, - number = {1}, - pages = {157--180}, - publisher = {John Wiley \& Sons, Ltd}, - title = {ASYMPTOTIC LINEAR PROGRAMMING LOWER BOUNDS FOR THE ENERGY OF MINIMIZING RIESZ AND GAUSS CONFIGURATIONS}, - url = {https://doi.org/10.1112/S0025579318000360}, - volume = {65}, - year = {2019}, - year1 = {2019}, - bdsk-url-1 = {https://doi.org/10.1112/S0025579318000360}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9oYXJkMTlhLnBkZk8RBBBib29rEAQAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAABoYXJkMTlhLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAALaKHwAAAAAACAAAAAQDAAAt6zIAAAAAAAgAAAAEAwAAP/g6EQAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBx7JW/CagjBgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHp1N2AAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAABiYjQyMWUwYTYwYWI1MTJiZWQzOTk3ZTQwYjY4MDM0MDIzMzBhOGY4OWRmZTNjMzFlMWQ3ZWIzNjU5MTIzYTI0OzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGQ7MDAwMDAwMDAxMTNhZjgzZjswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvaGFyZDE5YS5wZGYALwAAAAEBAABOU1VSTEJvb2ttYXJrUXVhcmFudGluZU1vdW50ZWROZXR3b3JrVm9sdW1lc0tleQDYAAAA/v///wEAAAAAAAAAEQAAAAQQAABcAAAAAAAAAAUQAADIAAAAAAAAABAQAAD0AAAAAAAAAEAQAADkAAAAAAAAAAIgAADAAQAAAAAAAAUgAAAwAQAAAAAAABAgAABAAQAAAAAAABEgAAB0AQAAAAAAABIgAABUAQAAAAAAABMgAABkAQAAAAAAACAgAACgAQAAAAAAADAgAADMAQAAAAAAAAHAAAAUAQAAAAAAABHAAAAUAAAAAAAAABLAAAAkAQAAAAAAAIDwAADUAQAAAAAAALgCAIDMAQAAAAAAAAAIAA0AGgAjAEkAAAAAAAACAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAEXQ==}} - - -@misc{pyto23a, - author = {PyTorch}, - month = {05}, - title = {Hyperparameter Tuning With Ray Tune}, - url = {https://pytorch.org/tutorials/beginner/hyperparameter_tuning_tutorial.html}, - year = {2023}, - note = {Accessed: 2023-05-15} -} - - -@misc{pyto23b, - author = {PyTorch}, - date-added = {2023-05-15 10:45:09 +0200}, - date-modified = {2023-05-15 10:46:00 +0200}, - month = {05}, - title = {Training a Classifier}, - url = {https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html}, - year = {2023}, - note = {Accessed: 2023-05-15} -} - - -@misc{bart23e, - author = {Bartz-Beielstein, Thomas}, - month = {04}, - note = {Last accessed 15-05-2023}, - title = {{PyTorch} Hyperparameter Tuning with {SPOT}: Comparison with {Ray Tuner} and Default Hyperparameters on {CIFAR10}}, - url = {https://github.com/sequential-parameter-optimization/spotpython/blob/main/notebooks/14_spot_ray_hpt_torch_cifar10.ipynb}, - year = {2023} -} - - -@article{beck, - title = {Machine Learning in Official Statistics}, - author = {Beck, Martin and Dumpert, Florian and Feuerhake, Joerg}, - doi = {10.48550/arXiv.1812.10422}, - year = {2018} -} - - -@book{qualitaetshandbuch, - title = {Qualitätshandbuch der Statistischen Ämter des Bundes und der Länder}, - url = {https://www.destatis.de/DE/Methoden/Qualitaet/qualitaetshandbuch.pdf}, - edition = {1.21}, - langid = {de}, - year = {2021}, - month = {03} -} - -@book{qualitaetshandbuch_eu, - title = {Quality Assurance Framework of the European Statistical System}, - url = {https://ec.europa.eu/eurostat/documents/64157/4392716/ESS-QAF-V2.0-final.pdf}, - edition = {2.0}, - langid = {en}, - year = {2019} -} - -@article{gmas, - title = {Standardisierung der Prozesse: 14 Jahre AG SteP}, - author = {Blumöhr, T. and Teichmann, C. and Noack, A. }, - journal = {WISTA - Wirtschaft und Statistik}, - volume = {5}, - pages = {58--75}, - year = {2017}, - url = {https://www.destatis.de/DE/Methoden/ - WISTA-Wirtschaft-und-Statistik/2017/05/standardisierung-prozesse-052017.html}, - publisher = {Wiesbaden: Statistisches Bundesamt (Destatis)} -} - -@article{gsbpm, - title = {Generic Statistical Business Process Model - GSBPM}, - year = {2019}, - url = {https://statswiki.unece.org/display/ - GSBPM/GSBPM+v5.1}, - publisher = {United Nations Economic Commission for Europe (UNECE)} -} - - -@book{bart21i, - editor = {Bartz,Eva and Bartz-Beielstein, Thomas and Zaefferer, Martin and Mersmann, Olaf}, - publisher = {Springer}, - title = {{Hyperparameter Tuning for Machine and Deep Learning with R - A Practical Guide}}, - year = {2022}, - doi = {10.1007/978-981-19-5170-1}, -} - -@book{Forr08a, - author = {Forrester, Alexander and S{\'o}bester, Andr{\'a}s and Keane, Andy}, - publisher = {Wiley}, - title = {{Engineering Design via Surrogate Modelling}}, - year = {2008} -} - - -@article{bjor56a, - author = {Bj{\"o}rck, G{\"o}ran}, - date-added = {2026-03-13 17:15:49 +0100}, - date-modified = {2026-03-13 17:15:49 +0100}, - doi = {10.1007/BF02589404}, - journal = {Arkiv f{\"o}r Matematik}, - number = {18}, - pages = {255--269}, - title = {Distributions of Positive Mass, Which Maximize a Certain Generalized Energy Integral}, - volume = {3}, - year = {1956}, - bdsk-url-1 = {https://doi.org/10.1007/BF02589404} -} - - -@article{hard05a, - author = {Hardin, Douglas P. and Saff, Edward B.}, - date-added = {2026-03-13 17:16:03 +0100}, - date-modified = {2026-03-13 17:16:03 +0100}, - doi = {10.1016/j.aim.2004.07.013}, - journal = {Advances in Mathematics}, - number = {1}, - pages = {174--204}, - title = {Minimal Riesz Energy Point Configurations for Rectifiable d-Dimensional Manifolds}, - volume = {193}, - year = {2005}, - bdsk-url-1 = {https://doi.org/10.1016/j.aim.2004.07.013} -} - - - -@article{Wolp97a, - author = {Wol\-pert, David H and Macready, William G}, - journal = {IEEE Transactions on Evolutionary Computation}, - month = apr, - number = {1}, - pages = {67--82}, - title = {{No Free Lunch Theorems for Optimization}}, - volume = {1}, - year = {1997} -} - -@book{jame21a, - author = {James, Gareth and Witten, Daniela and Hastie, Trevor and Tibshirani, Robert}, - edition = {2nd}, - publisher = {Springer}, - title = {{An Introduction to Statistical Learning with Applications in R}}, - year = {2021} -} - -@article{Haft16b, - author = {Haftka, Raphael T.}, - journal = {Structural and Multidisciplinary Optimization}, - number = {1}, - pages = {1--1}, - title = {Requirements for papers focusing on new or improved global optimization algorithms}, - volume = {54}, - year = {2016} -} - - -@inproceedings{ke17a, - author = {Ke, Guolin and Meng, Qi and Finley, Thomas and Wang, Taifeng and Chen, Wei and Ma, Weidong and Ye, Qiwei and Liu, Tie-Yan}, - booktitle = {Advances in Neural Information Processing Systems}, - editor = {I. Guyon and U. Von Luxburg and S. Bengio and H. Wallach and R. Fergus and S. Vishwanathan and R. Garnett}, - publisher = {Curran Associates, Inc.}, - title = {LightGBM: A Highly Efficient Gradient Boosting Decision Tree}, - volume = {30}, - year = {2017} -} - -@article{Frie01a, - author = {Jerome H. Friedman}, - journal = {The Annals of Statistics}, - number = {5}, - pages = {1189--1232}, - title = {Greedy Function Approximation: A Gradient Boosting Machine}, - volume = {29}, - year = {2001} -} - -@article{beck, - title = {Machine Learning in Official Statistics}, - author = {Beck, Martin and Dumpert, Florian and Feuerhake, Joerg}, - doi = {10.48550/arXiv.1812.10422}, - year = {2018} -} - -@article{radermacher2018, - title = {Official statistics in the era of big data opportunities and threats}, - author = {Radermacher, Walter J.}, - year = {2018}, - month = {11}, - date = {2018-11-01}, - journal = {International Journal of Data Science and Analytics}, - pages = {225--231}, - volume = {6}, - number = {3}, - doi = {10.1007/s41060-018-0124-z}, - url = {https://doi.org/10.1007/s41060-018-0124-z}, - langid = {en} -} - -@article{becka, - author = {Beck, Martin and Dumpert, Florian and Feuerhake, Joerg}, - title = {Machine Learning in Official Statistics} -} - -@article{yung2022, - title = {A quality framework for statistical algorithms}, - author = {Yung, Wesley and Tam, Siu-Ming and Buelens, Bart and Chipman, Hugh and Dumpert, Florian and Ascari, Gabriele and Rocci, Fabiana and Burger, Joep and Choi, InKyung}, - year = {2022}, - month = {01}, - date = {2022-01-01}, - journal = {Statistical Journal of the IAOS}, - pages = {291--308}, - volume = {38}, - number = {1}, - doi = {10.3233/SJI-210875}, - url = {https://content.iospress.com/articles/statistical-journal-of-the-iaos/sji210875}, - note = {Publisher: IOS Press}, - langid = {en} -} - -@article{yung2022a, - author = {Yung, Wesley and Tam, Siu-Ming and Buelens, Bart and Chipman, Hugh and Dumpert, Florian and Ascari, Gabriele and Rocci, Fabiana and Burger, Joep and Choi, InKyung}, - journal = {Statistical Journal of the IAOS}, - month = {01}, - number = {1}, - pages = {291--308}, - title = {A quality framework for statistical algorithms}, - volume = {38}, - year = {2022} -} - -@article{reichelt, - author = {Reichelt, Michael}, - title = {Qualit{\"a}tshandbuch der Statistischen {\"A}mter des Bundes und der L{\"a}nder} -} - -@article{schweinfest2021, - title = {Data Science and Official Statistics: Toward a New Data Culture}, - author = {Schweinfest, Stefan and Jansen, Ronald}, - year = {2021}, - month = {10}, - date = {2021-10-28}, - journal = {Harvard Data Science Review}, - volume = {3}, - number = {4}, - doi = {10.1162/99608f92.c1237762}, - url = {https://hdsr.mitpress.mit.edu/pub/1g514ljw/release/4}, - langid = {en} -} - -@book{radermacher2020, - address = {Cham}, - author = {Radermacher, Walter J.}, - publisher = {Springer International Publishing}, - title = {Official Statistics 4.0: Verified Facts for People in the 21st Century}, - year = {2020} -} - -@inproceedings{cast21a, - address = {Berlin, Heidelberg}, - author = {Castle, Steffen and Schwarzenberg, Robert and Pourvali, Mohsen}, - booktitle = {Natural Language Processing and Chinese Computing: 10th CCF International Conference, NLPCC 2021, Qingdao, China, October 13--17, 2021, Proceedings, Part II}, - pages = {317--322}, - publisher = {Springer-Verlag}, - title = {Detecting Covariate Drift with Explanations}, - year = {2021} -} - - -@misc{chol15a, - author = {Chollet, Francois and others}, - howpublished = {https:://keras.io}, - title = {Keras}, - year = {2015} -} - - -@article{abad16a, - author = {{Abadi}, Martin and {Agarwal}, Ashish and {Barham}, Paul and {Brevdo}, Eugene and {Chen}, Zhifeng and {Citro}, Craig and {Corrado}, Greg S. and {Davis}, Andy and {Dean}, Jeffrey and {Devin}, Matthieu and {Ghemawat}, Sanjay and {Goodfellow}, Ian and {Harp}, Andrew and {Irving}, Geoffrey and {Isard}, Michael and {Jia}, Yangqing and {Jozefowicz}, Rafal and {Kaiser}, Lukasz and {Kudlur}, Manjunath and {Levenberg}, Josh and {Mane}, Dan and {Monga}, Rajat and {Moore}, Sherry and {Murray}, Derek and {Olah}, Chris and {Schuster}, Mike and {Shlens}, Jonathon and {Steiner}, Benoit and {Sutskever}, Ilya and {Talwar}, Kunal and {Tucker}, Paul and {Vanhoucke}, Vincent and {Vasudevan}, Vijay and {Viegas}, Fernanda and {Vinyals}, Oriol and {Warden}, Pete and {Wattenberg}, Martin and {Wicke}, Martin and {Yu}, Yuan and {Zheng}, Xiaoqiang}, - journal = {arXiv e-prints}, - month = mar, - pages = {arXiv:1603.04467}, - title = {{TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems}}, - year = 2016 -} - -@inproceedings{seab10a, - author = {Seabold, Skipper and Perktold, Josef}, - booktitle = {9th Python in Science Conference}, - title = {statsmodels: Econometric and statistical modeling with python}, - year = {2010} -} - -@article{pedr11a, - author = {Pedregosa, F. and Varoquaux, G. and Gramfort, A. and Michel, V. and Thirion, B. and Grisel, O. and Blondel, M. and Prettenhofer, P. and Weiss, R. and Dubourg, V. and Vanderplas, J. and Passos, A. and Cournapeau, D. and Brucher, M. and Perrot, M. and Duchesnay, E.}, - journal = {Journal of Machine Learning Research}, - pages = {2825--2830}, - title = {Scikit-learn: Machine Learning in {P}ython}, - volume = {12}, - year = {2011} -} - - -@article{harr20a, - author = {Charles R. Harris and K. Jarrod Millman and St{\'{e}}fan J. van der Walt and Ralf Gommers and Pauli Virtanen and David Cournapeau and Eric Wieser and Julian Taylor and Sebastian Berg and Nathaniel J. Smith and Robert Kern and Matti Picus and Stephan Hoyer and Marten H. van Kerkwijk and Matthew Brett and Allan Haldane and Jaime Fern{\'{a}}ndez del R{\'{i}}o and Mark Wiebe and Pearu Peterson and Pierre G{\'{e}}rard-Marchant and Kevin Sheppard and Tyler Reddy and Warren Weckesser and Hameer Abbasi and Christoph Gohlke and Travis E. Oliphant}, - journal = {Nature}, - month = sep, - number = {7825}, - pages = {357--362}, - title = {Array programming with {NumPy}}, - volume = {585}, - year = {2020} -} - - -@phdthesis{ikon12a, - author = {Elena Ikonomovska}, - date-added = {2017-05-30 19:16:15 +0000}, - date-modified = {2023-04-09 01:09:38 +0200}, - school = {Jozef Stefan International Postgraduate School}, - title = {Algorithms for Learning Regression Trees and Ensembles on Evolving Data Streams}, - year = {2012} -} - - -@inproceedings{oza05a, - author = {Oza, N C}, - booktitle = {2005 IEEE International Conference on Systems, Man and Cybernetics}, - pages = {2340--2345}, - publisher = {IEEE}, - title = {{Online Bagging and Boosting}} -} - - -@inproceedings{oza01a, - author = {Oza, Nikunj C and Russell, Stuart}, - booktitle = {8th Insternational Workshop on Artificial Intelligence and Statistics}, - editor = {Jaakola, T and Richardson, T}, - pages = {105--112}, - title = {{Online bagging and boosting}}, - year = {2001} -} - -@article{fana14a, - author = {Fanaee-T, Hadi and Gama, Joao}, - journal = {Progress in Artificial Intelligence}, - number = {2}, - pages = {113--127}, - title = {Event labeling combining ensemble detectors and background knowledge}, - volume = {2}, - year = {2014} -} - -@article{gome17a, - author = {Gomes, Heitor M. and Bifet, Albert and Read, Jesse and Barddal, Jean Paul and Enembreck, Fabricio and Pfharinger, Bernhard and Holmes, Geoff and Abdessalem, Talel}, - journal = {Machine Learning}, - number = {9}, - pages = {1469--1495}, - title = {Adaptive random forests for evolving data stream classification}, - volume = {106}, - year = {2017} -} - -@article{knuth84, - author = {Knuth, Donald E.}, - title = {Literate Programming}, - year = {1984}, - issue_date = {May 1984}, - publisher = {Oxford University Press, Inc.}, - address = {USA}, - volume = {27}, - number = {2}, - issn = {0010-4620}, - url = {https://doi.org/10.1093/comjnl/27.2.97}, - doi = {10.1093/comjnl/27.2.97}, - journal = {Comput. J.}, - month = may, - pages = {97–111}, - numpages = {15} -} - -@article{Meignan:2015vp, - author = {Meignan, David and Knust, Sigrid and Frayet, Jean-Marc and Pesant, Gilles and Gaud, Nicolas}, - journal = {ACM Transactions on Interactive Intelligent Systems}, - month = sep, - title = {{A Review and Taxonomy of Interactive Optimization Methods in Operations Research}}, - year = {2015} -} - -@book{bart21i, - editor = {Bartz,Eva and Bartz-Beielstein, Thomas and Zaefferer, Martin and Mersmann, Olaf}, - publisher = {Springer}, - title = {{Hyperparameter Tuning for Machine and Deep Learning with R - A Practical Guide}}, - year = {2022} -} - -@article{bart21b, - author = {{Bartz-Beielstein}, Thomas and {Zaefferer}, Martin and {Rehbach}, Frederik}, - journal = {arXiv e-prints}, - month = dec, - pages = {arXiv:1712.04076}, - title = {{In a Nutshell -- The Sequential Parameter Optimization Toolbox}}, - year = 2021 -} - -@article{Torczon00, - author = {Lewis, R M and Torczon, V and Trosset, M W}, - journal = {Journal of Computational and Applied Mathematics}, - number = {1--2}, - pages = {191--207}, - title = {{Direct search methods: Then and now}}, - volume = {124}, - year = {2000} -} - -@article{Li16a, - author = {{Li}, Lisha and {Jamieson}, Kevin and {DeSalvo}, Giulia and {Rostamizadeh}, Afshin and {Talwalkar}, Ameet}, - journal = {arXiv e-prints}, - month = mar, - pages = {arXiv:1603.06560}, - title = {{Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization}}, - year = 2016 -} - -@inproceedings{BLP05, - address = {Piscataway NJ}, - author = {Bartz-Beielstein, Thomas and Lasarczyk, Christian and Preuss, Mike}, - booktitle = {{Proceedings 2005 Congress on Evolutionary Computation (CEC'05), Edinburgh, Scotland}}, - editor = {McKay, B and others}, - pages = {773--780}, - publisher = {{IEEE Press}}, - title = {{Sequential Parameter Optimization}}, - year = {2005}, - doi = {10.1109/CEC.2005.1554761}} -} - - -@article{Bart13j, - author = {Bartz-Beielstein, Thomas and Branke, J{\"u}rgen and Mehnen, J{\"o}rn and Mersmann, Olaf}, - journal = {Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery}, - number = {3}, - pages = {178--195}, - title = {Evolutionary Algorithms}, - volume = {4}, - year = {2014} -} - - -@book{Brei84a, - address = {Monterey CA}, - author = {Breiman, L and Friedman, J H and Olshen, R A and Stone, C J}, - publisher = {Wadsworth}, - title = {{Classification and Regression Trees}}, - year = {1984} -} - -@article{page54a, - author = {Page, E. S.}, - journal = {Biometrika}, - month = {06}, - number = {1-2}, - pages = {100-115}, - title = {Continuous inspection schemes}, - volume = {41}, - year = {1954} -} - -@article{mori78a, - author = {Morris, Robert}, - journal = {Commun. ACM}, - month = {oct}, - number = {10}, - pages = {840--842}, - title = {Counting Large Numbers of Events in Small Registers}, - volume = {21}, - year = {1978} -} - -@article{flaj85a, - author = {Flajolet, Philippe}, - journal = {BIT}, - month = {mar}, - number = {1}, - pages = {113--134}, - title = {Approximate Counting: A Detailed Analysis}, - volume = {25}, - year = {1985} -} - -@article{vite85a, - author = {Vitter, Jeffrey S.}, - journal = {ACM Trans. Math. Softw.}, - month = {mar}, - number = {1}, - pages = {37--57}, - title = {Random Sampling with a Reservoir}, - volume = {11}, - year = {1985} -} - -@article{mccl89a, - author = {Michael McCloskey and Cohen, {Neal J.}}, - journal = {Psychology of Learning and Motivation - Advances in Research and Theory}, - month = jan, - number = {C}, - pages = {109--165}, - title = {Catastrophic Interference in Connectionist Networks: The Sequential Learning Problem}, - volume = {24}, - year = {1989} -} - -@book{bass93a, - author = {Basseville, Mich{\`e}le and Nikiforov, Igor V.}, - publisher = {{Prentice Hall, Inc. - http://people.irisa.fr/Michele.Basseville/kniga/}}, - title = {{Detection of Abrupt Changes - Theory and Application}}, - year = {1993} -} - -@book{kear94a, - author = {Michael J. Kearns and Umesh V. Vazirani}, - publisher = {{MIT} Press}, - title = {An Introduction to Computational Learning Theory}, - year = {1994} -} - - -@article{Welc92a, - author = {Welch, W J and Buck, R J and Sacks, J and Wynn, H P and Mitchell, T J and Morris, M D}, - date-added = {2015-11-29T01:43:23GMT}, - date-modified = {2015-11-29T01:43:40GMT}, - journal = {Technometrics}, - pages = {15--25}, - rating = {0}, - title = {{Screening, predicting, and computer experiments}}, - uri = {\url{papers3://publication/uuid/969ADCD9-5494-4B7A-AADF-D8DFBE6AABB0}}, - volume = {34}, - year = {1992}} - - -@inproceedings{alon96a, - address = {New York, NY, USA}, - author = {Alon, Noga and Matias, Yossi and Szegedy, Mario}, - booktitle = {Proceedings of the Twenty-Eighth Annual ACM Symposium on Theory of Computing}, - pages = {20--29}, - publisher = {Association for Computing Machinery}, - series = {STOC '96}, - title = {The Space Complexity of Approximating the Frequency Moments}, - year = {1996} -} - -@techreport{harr99a, - author = {Michael Harries and U Nsw-cse-tr and New South Wales}, - title = {SPLICE-2 Comparative Evaluation: Electricity Pricing}, - year = {1999} -} - -@inproceedings{domi20a, - author = {Pedro M. Domingos and Geoff Hulten}, - booktitle = {Proceedings of the sixth {ACM} {SIGKDD} international conference on Knowledge discovery and data mining, Boston, MA, USA, August 20-23, 2000}, - editor = {Raghu Ramakrishnan and Salvatore J. Stolfo and Roberto J. Bayardo and Ismail Parsa}, - pages = {71--80}, - publisher = {{ACM}}, - title = {Mining high-speed data streams}, - year = {2000} -} - -@inproceedings{hult01a, - address = {New York, NY, USA}, - author = {Hulten, Geoff and Spencer, Laurie and Domingos, Pedro}, - booktitle = {Proceedings of the Seventh ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {97--106}, - publisher = {Association for Computing Machinery}, - series = {KDD '01}, - title = {Mining Time-Changing Data Streams}, - year = {2001} -} - -@inproceedings{stre01a, - address = {New York, NY, USA}, - author = {Street, W. Nick and Kim, YongSeog}, - booktitle = {Proceedings of the Seventh ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {377--382}, - publisher = {Association for Computing Machinery}, - series = {KDD '01}, - title = {A Streaming Ensemble Algorithm (SEA) for Large-Scale Classification}, - year = {2001} -} - -@techreport{lane01a, - author = {Laney, Douglas}, - institution = {META Group}, - month = {February}, - title = {{3D} Data Management: Controlling Data Volume, Velocity, and Variety}, - year = 2001 -} - -@inproceedings{babc02a, - address = {New York, NY, USA}, - author = {Babcock, Brian and Babu, Shivnath and Datar, Mayur and Motwani, Rajeev and Widom, Jennifer}, - booktitle = {Proceedings of the 21st ACM SIGMOD-SIGACT-SIGART Symposium on Principles of Database Systems}, - pages = {1--16}, - publisher = {ACM}, - series = {PODS '02}, - title = {Models and Issues in Data Stream Systems}, - year = {2002} -} - -@article{gent02a, - author = {Gentile, Claudio}, - journal = {J. Mach. Learn. Res.}, - month = {mar}, - pages = {213--242}, - title = {A New Approximate Maximal Margin Classification Algorithm}, - volume = {2}, - year = {2002} -} - -@book{Sant03a, - address = {Berlin, Heidelberg, New York}, - author = {Santner, T J and Williams, B J and Notz, W I}, - publisher = {Springer}, - title = {{The Design and Analysis of Computer Experiments}}, - year = {2003} -} - -@inproceedings{gama04a, - author = {Jo{\~a}o Gama and Pedro Medas and Gladys Castillo and Pedro Rodrigues}, - booktitle = {In SBIA Brazilian Symposium on Artificial Intelligence}, - pages = {286--295}, - publisher = {Springer Verlag}, - title = {Learning with drift detection}, - year = {2004} -} - -@incollection{gama04b, - address = {Berlin, Heidelberg}, - author = {Gama, Jo{\~a}o and Medas, Pedro and Castillo, Gladys and Rodrigues, Pedro}, - booktitle = {Parallel Problem Solving from Nature - PPSN XIII - 13th International Conference, Ljubljana, Slovenia, September 13-17, 2014. Proceedings}, - pages = {286--295}, - publisher = {Springer Berlin Heidelberg}, - title = {{Learning with Drift Detection}}, - year = {2004} -} - -@inproceedings{gama14b, - address = {Berlin, Heidelberg}, - author = {Gama, Jo{\~a}o and Medas, Pedro and Castillo, Gladys and Rodrigues, Pedro}, - booktitle = {Advances in Artificial Intelligence -- SBIA 2004}, - editor = {Bazzan, Ana L. C. and Labidi, Sofiane}, - pages = {286--295}, - publisher = {Springer Berlin Heidelberg}, - title = {Learning with Drift Detection}, - year = {2004} -} - -@proceedings{kell04a, - address = {Washington, DC}, - editor = {Sallie Keller-McNulty}, - organization = {Committee on Applied and Theoretical Statistics, National Research Council}, - publisher = {National Academies Press}, - title = {Statistical Analysis of Massive Data Streams: {P}roceedings of a Workshop}, - year = {2004} -} - -@book{witt05a, - author = {Ian H. Witten and Eibe Frank}, - edition = {2nd}, - publisher = {Morgan Kaufmann Publishers}, - series = {The Morgan Kaufmann Series in Data Management Systems}, - title = {Data Mining: {P}ractical Machine Learning Tools and Techniques}, - year = 2005 -} - -@inproceedings{zaki05a, - author = {Mohammed Javeed Zaki and Nagender Parimi and Nilanjana De and Feng Gao and Benjarath Phoophakdee and Joe Urban and Vineet Chaoji and Mohammad Al Hasan and Saeed Salem}, - booktitle = {Formal Concept Analysis, Third International Conference, {ICFCA} 2005, Lens, France, February 14-18, 2005, Proceedings}, - editor = {Bernhard Ganter and Robert Godin}, - pages = {1--20}, - publisher = {Springer}, - series = {Lecture Notes in Computer Science}, - title = {Towards Generic Pattern Mining}, - volume = {3403}, - year = {2005} -} - -@article{gabe05a, - author = {Gaber, Mohamed Medhat and Zaslavsky, Arkady and Krishnaswamy, Shonali}, - journal = {SIGMOD Rec.}, - month = {June}, - pages = {18--26}, - title = {Mining Data Streams: {A} Review}, - volume = {34}, - year = {2005} -} - -@inproceedings{baena2006early, - author = {Baena-Garc{\i}a, Manuel and del Campo-{\'A}vila, Jos{\'e} and Fidalgo, Ra{\'u}l and Bifet, Albert and Gavalda, R and Morales-Bueno, Rafael}, - booktitle = {Fourth international workshop on knowledge discovery from data streams}, - pages = {77--86}, - title = {Early drift detection method}, - volume = {6}, - year = {2006} -} - -@article{cram06a, - author = {Koby Crammer and Ofer Dekel and Joseph Keshet and Shai Shalev-Shwartz and Yoram Singer}, - journal = {Journal of Machine Learning Research}, - number = {19}, - pages = {551-585}, - title = {Online Passive-Aggressive Algorithms}, - volume = {7}, - year = {2006} -} - -@book{agga07a, - editor = {Charu Aggarwal}, - publisher = {Springer-Verlag}, - title = {Data Streams -- Models and Algorithms}, - year = 2007 -} - -@inproceedings{bife07a, - author = {Albert Bifet and Ricard Gavald{\`a}}, - booktitle = {Proceedings of the 2007 SIAM International Conference on Data Mining (SDM)}, - pages = {443-448}, - title = {Learning from Time-Changing Data with Adaptive Windowing}, - year = {2007} -} - -@inproceedings{bifet2007learning, - author = {Bifet, Albert and Gavalda, Ricard}, - booktitle = {Proceedings of the 2007 SIAM international conference on data mining}, - organization = {SIAM}, - title = {Learning from time-changing data with adaptive windowing}, - volume = {7}, - year = {2007} -} - -@incollection{gabe07a, - author = {Mohamed Gaber and Arkady Zaslavsky and Shonali Krishnaswamy}, - booktitle = {Data Streams -- Models and Algorithms}, - editor = {Charu Aggarwal}, - publisher = {Springer-Verlag}, - title = {A Survey of Classification Methods in Data Streams}, - year = 2007 -} - -@article{hoeg07a, - author = {Stefan Hoeglinger and Russel Pears}, - journal = {2007 Third International Conference on Information and Automation for Sustainability}, - pages = {57-62}, - title = {Use of Hoeffding trees in concept based data stream mining}, - year = {2007} -} - -@inproceedings{nishida2007detecting, - author = {Nishida, Kyosuke and Yamauchi, Koichiro}, - booktitle = {International conference on discovery science}, - organization = {Springer}, - pages = {264--269}, - title = {Detecting concept drift using statistical testing}, - year = {2007} -} - -@inproceedings{spinosa2007olindda, - author = {Spinosa, Eduardo J and de Leon F. de Carvalho, Andr{\'e} Ponce and Gama, Joao}, - booktitle = {Proceedings of the 2007 ACM symposium on Applied computing}, - pages = {448--452}, - title = {Olindda: A cluster-based approach for detecting novelty and concept drift in data streams}, - year = {2007} -} - -@book{Mont08a, - author = {Montgomery, Douglas C}, - publisher = {Wiley}, - title = {{Statistical Quality Control}}, - year = {2008} -} - -@inproceedings{bife09a, - address = {Berlin, Heidelberg}, - author = {Bifet, Albert and Gavald\`{a}, Ricard}, - booktitle = {Proceedings of the 8th International Symposium on Intelligent Data Analysis: Advances in Intelligent Data Analysis VIII}, - pages = {249--260}, - publisher = {Springer-Verlag}, - series = {IDA '09}, - title = {Adaptive Learning from Evolving Data Streams}, - year = {2009} -} - -@inproceedings{bife09b, - address = {New York, NY, USA}, - author = {Bifet, Albert and Holmes, Geoff and Pfahringer, Bernhard and Kirkby, Richard and Gavald\`{a}, Ricard}, - booktitle = {Proceedings of the 15th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {139--148}, - publisher = {Association for Computing Machinery}, - series = {KDD '09}, - title = {New Ensemble Methods for Evolving Data Streams}, - year = {2009} -} - -@article{drie09a, - author = {Dries, Anton and R\"{u}ckert, Ulrich}, - journal = {Stat. Anal. Data Min.}, - number = {5-6}, - pages = {311--327}, - title = {Adaptive concept drift detection}, - volume = {2}, - year = {2009} -} - -@inproceedings{gama09a, - address = {New York, NY, USA}, - author = {Gama, Jo\~{a}o and Sebasti\~{a}o, Raquel and Rodrigues, Pedro Pereira}, - booktitle = {Proceedings of the 15th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {329--338}, - publisher = {Association for Computing Machinery}, - series = {KDD '09}, - title = {Issues in Evaluation of Stream Learning Algorithms}, - year = {2009} -} - -@book{jian09a, - author = {Qingchun Jiang and Sharma Chakravarthy}, - publisher = {Springer}, - title = {Stream Data Processing: A Quality of Service Perspective}, - year = {2009} -} - -@inproceedings{vand09a, - address = {San Francisco, CA, USA}, - author = {Van Durme, Benjamin and Lall, Ashwin}, - booktitle = {Proceedings of the 21st International Joint Conference on Artificial Intelligence}, - pages = {1574--1579}, - publisher = {Morgan Kaufmann Publishers Inc.}, - series = {IJCAI'09}, - title = {Probabilistic Counting with Randomized Storage}, - year = {2009} -} - -@book{bife10a, - author = {Albert Bifet}, - publisher = {{IOS} Press}, - series = {Frontiers in Artificial Intelligence and Applications}, - title = {Adaptive Stream Mining: Pattern Learning and Mining from Evolving Data Streams}, - volume = {207}, - year = {2010} -} - -@inproceedings{dredze2010we, - author = {Dredze, Mark and Oates, Tim and Piatko, Christine}, - booktitle = {Proceedings of the 2010 Conference on Empirical Methods in Natural Language Processing}, - pages = {585--595}, - title = {We're not in kansas anymore: detecting domain changes in streams}, - year = {2010} -} - -@book{efro10a, - author = {Efron, Bradley}, - publisher = {Cambridge University Press}, - title = {{Large-Scale Inference: Empirical Bayes Methods for Estimation, Testing, and Prediction (Institute of Mathematical Statistics Monographs)}}, - year = {2010} -} - -@book{gama10a, - author = {Jo{\~{a}}o Gama}, - publisher = {{CRC} Press}, - series = {Chapman and Hall / {CRC} Data Mining and Knowledge Discovery Series}, - title = {Knowledge Discovery from Data Streams}, - year = {2010} -} - -@inproceedings{hayat2010dct, - author = {Hayat, Morteza Zi and Hashemi, Mahmoud Reza}, - booktitle = {2010 International Conference of Soft Computing and Pattern Recognition}, - organization = {IEEE}, - pages = {373--378}, - title = {A DCT based approach for detecting novelty and concept drift in data streams}, - year = {2010} -} - -@inproceedings{kran10a, - author = {Philipp Kranen and Hardy Kremer and Timm Jansen and Thomas Seidl and Albert Bifet and Geoff Holmes and Bernhard Pfahringer}, - booktitle = {16th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD 2010), Washington, DC, USA}, - title = {Benchmarking Stream Clustering Algorithms within the MOA Framework}, - year = {2010} -} - -@article{bife10c, - author = {Bifet, Albert and Holmes, Geoff and Kirkby, Richard and Pfahringer, Bernhard}, - journal = {Journal of Machine Learning Research}, - month = {August}, - pages = {1601--1604}, - title = {{MOA}: {M}assive Online Analysis}, - volume = {99}, - year = {2010} -} - -@inproceedings{ditzler2011hellinger, - author = {Ditzler, Gregory and Polikar, Robi}, - booktitle = {2011 IEEE symposium on computational intelligence in dynamic and uncertain environments (CIDUE)}, - organization = {IEEE}, - pages = {41--48}, - title = {Hellinger distance based drift detection for nonstationary environments}, - year = {2011} -} - -@article{masud2011classification, - author = {Masud, Mohammad and Gao, Jing and Khan, Latifur and Han, Jiawei and Thuraisingham, Bhavani M}, - journal = {IEEE Transactions on Knowledge and Data Engineering}, - number = {6}, - pages = {859--874}, - title = {Classification and novel class detection in concept-drifting data streams under time constraints}, - volume = {23}, - year = {2011} -} - -@inproceedings{sobhani2011new, - author = {Sobhani, Parinaz and Beigy, Hamid}, - booktitle = {International conference on adaptive and intelligent systems}, - organization = {Springer}, - title = {New drift detection method for data streams}, - year = {2011} -} - -@manual{char12b, - author = {Lysiane Charest and Justin Harrington and Matias Salibian-Barrera}, - title = {birch: Dealing With Very Large Datasets Using {BIRCH}}, - year = {2012} -} - -@article{corm12a, - author = {Cormode, Graham and Garofalakis, Minos and Haas, Peter J. and Jermaine, Chris}, - journal = {Found. Trends Databases}, - month = {jan}, - number = {1--3}, - pages = {1--294}, - title = {Synopses for Massive Data: Samples, Histograms, Wavelets, Sketches}, - volume = {4}, - year = {2012} -} - -@inproceedings{lee2012detection, - author = {Lee, Jeonghoon and Magoules, Frederic}, - booktitle = {2012 IEEE 14th International Conference on High Performance Computing and Communication \& 2012 IEEE 9th International Conference on Embedded Software and Systems}, - organization = {IEEE}, - pages = {241--245}, - title = {Detection of concept drift for learning from stream data}, - year = {2012} -} - -@manual{leis12a, - author = {Friedrich Leisch and Evgenia Dimitriadou}, - title = {mlbench: {M}achine Learning Benchmark Problems}, - year = {2012} -} - -@article{more12a, - author = {Jose G. Moreno{-}Torres and Troy Raeder and Roc{\'{\i}}o Ala{\'{\i}}z{-}Rodr{\'{\i}}guez and Nitesh V. Chawla and Francisco Herrera}, - journal = {Pattern Recognit.}, - number = {1}, - pages = {521--530}, - title = {A unifying view on dataset shift in classification}, - volume = {45}, - year = {2012} -} - -@manual{rose12a, - author = {David S. Rosenberg}, - title = {{HadoopStreaming}: {U}tilities for Using {R} Scripts in {H}adoop Streaming}, - year = {2012} -} - -@article{ross2012exponentially, - author = {Ross, Gordon J and Adams, Niall M and Tasoulis, Dimitris K and Hand, David J}, - journal = {Pattern recognition letters}, - number = {2}, - pages = {191--198}, - title = {Exponentially weighted moving average charts for detecting concept drift}, - volume = {33}, - year = {2012} -} - -@inproceedings{ryu2012efficient, - author = {Ryu, Joung Woo and Kantardzic, Mehmed M and Kim, Myung-Won and Ra Khil, A}, - booktitle = {International Conference on Big Data Analytics}, - organization = {Springer}, - pages = {122--133}, - title = {An efficient method of building an ensemble of classifiers in streaming data}, - year = {2012} -} - -@manual{sevc12a, - author = {Hana Sevcikova and Tony Rossini}, - title = {rlecuyer: {R} Interface to {RNG} With Multiple Streams}, - year = {2012} -} - -@article{wags12a, - author = {Wagstaff, Kiri}, - title = {Machine Learning that Matters}, - year = {2012} -} - -@inproceedings{bife13a, - address = {Berlin, Heidelberg}, - author = {Bifet, Albert and Read, Jesse and Pfahringer, Bernhard and Holmes, Geoff and {\v{Z}}liobait{\.{e}}, Indr{\.{e}}}, - booktitle = {Advances in Intelligent Data Analysis XII}, - editor = {Tucker, Allan and H{\"o}ppner, Frank and Siebes, Arno and Swift, Stephen}, - pages = {92--103}, - publisher = {Springer Berlin Heidelberg}, - title = {CD-MOA: Change Detection Framework for Massive Online Analysis}, - year = {2013} -} - -@inproceedings{faria2013novelty, - author = {Faria, Elaine R and Gama, Jo{\~a}o and Carvalho, Andr{\'e} CPLF}, - booktitle = {Proceedings of the 28th annual ACM symposium on applied computing}, - pages = {795--800}, - title = {Novelty detection algorithm for data streams multi-class problems}, - year = {2013} -} - -@inproceedings{feld13a, - address = {USA}, - author = {Feldman, Dan and Schmidt, Melanie and Sohler, Christian}, - booktitle = {Proceedings of the Twenty-Fourth Annual ACM-SIAM Symposium on Discrete Algorithms}, - pages = {1434--1453}, - publisher = {Society for Industrial and Applied Mathematics}, - series = {SODA '13}, - title = {Turning Big Data into Tiny Data: Constant-Size Coresets for k-Means, PCA and Projective Clustering}, - year = {2013} -} - -@article{gama13a, - author = {Gama, Jo{\~a}o and Sebasti{\~a}o, Raquel and Rodrigues, Pedro Pereira}, - journal = {Machine Learning}, - number = {3}, - pages = {317--346}, - title = {On evaluating stream learning algorithms}, - volume = {90}, - year = {2013} -} - -@article{kane13a, - author = {Michael J. Kane and John Emerson and Stephen Weston}, - journal = {Journal of Statistical Software}, - number = {14}, - pages = {1--19}, - title = {Scalable Strategies for Computing with Massive Data}, - volume = {55}, - year = {2013} -} - -@manual{kapt13a, - author = {Maurits Kaptein}, - title = {{RStorm}: {S}imulate and Develop Streaming Processing in {R}}, - year = {2013} -} - -@article{lindstrom2013drift, - author = {Lindstrom, Patrick and Mac Namee, Brian and Delany, Sarah Jane}, - journal = {Evolving Systems}, - number = {1}, - pages = {13--25}, - title = {Drift detection using uncertainty distribution divergence}, - volume = {4}, - year = {2013} -} - -@inproceedings{mcma13a, - address = {New York, NY, USA}, - author = {McMahan, H. Brendan and Holt, Gary and Sculley, D. and Young, Michael and Ebner, Dietmar and Grady, Julian and Nie, Lan and Phillips, Todd and Davydov, Eugene and Golovin, Daniel and Chikkerur, Sharat and Liu, Dan and Wattenberg, Martin and Hrafnkelsson, Arnar Mar and Boulos, Tom and Kubica, Jeremy}, - booktitle = {Proceedings of the 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {1222--1230}, - publisher = {Association for Computing Machinery}, - series = {KDD '13}, - title = {Ad Click Prediction: A View from the Trenches}, - year = {2013} -} - -@article{Silv13a, - author = {Silva, Jonathan A. and Faria, Elaine R. and Barros, Rodrigo C. and Hruschka, Eduardo R. and Carvalho, Andre and Gama, Joao}, - journal = {ACM Computer Surveys}, - number = {1}, - pages = {1-31}, - title = {Data Stream Clustering: A Survey.}, - volume = {46}, - year = {2013} -} - -@manual{adle14a, - author = {Daniel Adler and Christian Gl{\"a}ser and Oleg Nenadic and Jens Oehlschl{\"a}gel and Walter Zucchini}, - title = {{ff}: {M}emory-efficient Storage of Large Data on Disk and Fast Access Functions}, - year = {2014} -} - -@manual{bar14a, - author = {Romain Bar}, - title = {factas: {D}ata Mining Methods for Data Streams}, - year = {2014} -} - -@manual{barb14a, - author = {Pablo Barbera}, - title = {streamR: Access to {T}witter Streaming {API} via {R}}, - year = {2014} -} - -@manual{dbi14a, - author = {{R Special Interest Group on Databases}}, - title = {DBI: R Database Interface}, - year = {2014} -} - -@inproceedings{harel2014concept, - author = {Harel, Maayan and Mannor, Shie and El-Yaniv, Ran and Crammer, Koby}, - booktitle = {International conference on machine learning}, - organization = {PMLR}, - pages = {1009--1017}, - title = {Concept drift detection through resampling}, - year = {2014} -} - -@article{kuncheva2014pca, - author = {Kuncheva, Ludmila I and Faithfull, William J}, - journal = {IEEE transactions on neural networks and learning systems}, - number = {1}, - pages = {69--80}, - title = {PCA feature extraction for change detection in multidimensional unlabeled data}, - volume = {25}, - year = {2014} -} - -@book{lesk14b, - author = {Jure Leskovec and Anand Rajaraman and Jeffery D. Ullman}, - edition = {2}, - title = {Mining of Massive Datasets}, - year = {2014} -} - -@manual{wijf14a, - author = {Jan Wijffels}, - title = {{RMOA}: Connect R with MOA to perform streaming classifications}, - year = {2014} -} - -@article{gama14a, - author = {Gama, Jo\~{a}o and \v{Z}liobaitundefined, Indrundefined and Bifet, Albert and Pechenizkiy, Mykola and Bouchachia, Abdelhamid}, - journal = {ACM Comput. Surv.}, - month = {mar}, - number = {4}, - title = {A Survey on Concept Drift Adaptation}, - volume = {46}, - year = {2014} -} - -@article{mcgr14a, - author = {McGregor, Andrew}, - journal = {SIGMOD Rec.}, - month = {may}, - number = {1}, - pages = {9--20}, - title = {Graph Stream Algorithms: A Survey}, - volume = {43}, - year = {2014} -} - -@article{kapt14a, - author = {Maurits Kaptein}, - journal = {The R Journal}, - month = Jun, - number = {1}, - pages = {123--132}, - title = {RStorm: Developing and Testing Streaming Algorithms in R}, - volume = {6}, - year = {2014} -} - -@misc{lesk14a, - author = {Jure Leskovec and Andrej Krevl}, - howpublished = {http://snap.stanford.edu/data}, - month = jun, - title = {{SNAP Datasets}: {Stanford} Large Network Dataset Collection}, - year = 2014 -} - -@misc{krep14a, - author = {Kreps, Jay}, - month = {July}, - title = {Questioning the Lambda Architecture}, - year = {2014} -} - -@article{wood14a, - author = {Woodruff, David P.}, - journal = {Found. Trends Theor. Comput. Sci.}, - month = {oct}, - number = {1--2}, - pages = {1--157}, - title = {Sketching as a Tool for Numerical Linear Algebra}, - volume = {10}, - year = {2014} -} - -@inproceedings{borc15a, - address = {Germany}, - author = {Hanen Borchani and Martinez, {Ana Maria} and Masegosa, {Andr{\'e}s R.} and Helge Langseth and Nielsen, {Thomas Dyhre} and Antonio Salmer{\'o}n and Antonio Fern{\'a}ndez and Madsen, {Anders L{\ae}s{\o}} and Ram{\'o}n S{\'a}ez}, - booktitle = {Advances in Intelligent Data Analysis XIV}, - editor = {Elisa Fromont and {De Bie}, Tijl and {van Leeuwen}, Matthijs}, - number = {9385}, - pages = {72--83}, - publisher = {Springer}, - series = {Lecture Notes in Computer Science}, - title = {Modeling concept drift: A probabilistic graphical model based approach}, - year = {2015} -} - -@manual{gent15a, - author = {Jeff Gentry}, - title = {twitteR: {R} Based {T}witter Client}, - year = {2015} -} - -@manual{hahs15a, - author = {Michael Hahsler and Margaret H. Dunham}, - title = {{rEMM}: Extensible Markov Model for Data Stream Clustering in {R}}, - year = {2015} -} - -@manual{hahs15b, - author = {Michael Hahsler and Matthew Bolanos}, - title = {streamMOA: Interface for MOA Stream Clustering Algorithms}, - year = {2015} -} - -@manual{leyd15a, - author = {Josef Leydold}, - title = {rstream: {S}treams of Random Numbers}, - year = {2015} -} - -@book{marz15a, - address = {USA}, - author = {Marz, Nathan and Warren, James}, - edition = {1st}, - publisher = {Manning Publications Co.}, - title = {Big Data: Principles and Best Practices of Scalable Realtime Data Systems}, - year = {2015} -} - -@inproceedings{qahtan2015pca, - author = {Qahtan, Abdulhakim A and Alharbi, Basma and Wang, Suojin and Zhang, Xiangliang}, - booktitle = {Proceedings of the 21th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {935--944}, - title = {A pca-based change detection framework for multidimensional data streams: Change detection in multidimensional data streams}, - year = {2015} -} - -@inproceedings{Wang15a, - author = {Wang, Heng and Abraham, Zubin}, - booktitle = {International Joint Conference on Neural Networks ({IJCNN})}, - pages = {1-9}, - title = {Concept Drift Detection for Streaming Data}, - year = {2015} -} - -@misc{warm15a, - author = {Warmerdam, Vincent}, - title = {koaning.io: Linear Models Solving Non-Linear Problems}, - year = {2015} -} - -@inproceedings{Bart16g, - author = {Bartz-Beielstein, Thomas}, - booktitle = {Bioinspired Optimization Methods and their Applications}, - editor = {Papa, Gregor and Mernik, Marjan}, - pages = {94--104}, - title = {{Experimental Algorithmics Applied to On-line Machine Learning}}, - year = {2016} -} - -@manual{ryan16a, - author = {Jeffrey A. Ryan}, - title = {quantmod: {Q}uantitative Financial Modelling Framework}, - year = {2016} -} - -@article{sethi2016grid, - author = {Sethi, Tegjyot Singh and Kantardzic, Mehmed and Hu, Hanquing}, - journal = {Journal of Intelligent Information Systems}, - number = {1}, - pages = {179--211}, - title = {A grid density based framework for classifying streaming data in the presence of concept drift}, - volume = {46}, - year = {2016} -} - -@manual{urba16a, - author = {Simon Urbanek}, - title = {{rJava}: {L}ow-level {R} to {J}ava interface}, - year = {2016} -} - -@inproceedings{venk16a, - address = {New York, NY, USA}, - author = {Venkataraman, Shivaram and Yang, Zongheng and Liu, Davies and Liang, Eric and Falaki, Hossein and Meng, Xiangrui and Xin, Reynold and Ghodsi, Ali and Franklin, Michael and Stoica, Ion and Zaharia, Matei}, - booktitle = {Proceedings of the 2016 International Conference on Management of Data}, - pages = {1099--1104}, - publisher = {Association for Computing Machinery}, - series = {SIGMOD '16}, - title = {SparkR: Scaling R Programs with Spark}, - year = {2016} -} - -@misc{warm16a, - author = {Warmerdam, Vincent}, - title = {koaning.io: Bayesian/Streaming Algorithms}, - year = {2016} -} - -@book{Agga17a, - author = {Aggarwal, Charu C}, - publisher = {Springer}, - title = {Outlier Analysis}, - year = {2017} -} - -@inproceedings{dasi17a, - address = {New York, NY, USA}, - author = {da Silva, Vitor and Winck, Ana Trindade}, - booktitle = {Proceedings of the Symposium on Applied Computing}, - pages = {95--100}, - publisher = {Association for Computing Machinery}, - series = {SAC '17}, - title = {Video Popularity Prediction in Data Streams Based on Context-Independent Features}, - year = {2017} -} - -@article{dump17a, - author = {Dumpert, Florian and Beck, Martin}, - journal = {AStA Wirtschafts- und Sozialstatistisches Archiv}, - number = {2}, - pages = {83--106}, - title = {Einsatz von Machine-Learning-Verfahren in amtlichen Unternehmensstatistiken}, - volume = {11}, - year = {2017} -} - -@article{hahs17a, - author = {Hahsler, Michael and Bola{\~n}os, Matthew and Forrest, John}, - journal = {Journal of Statistical Software}, - number = {14}, - pages = {1--50}, - title = {Introduction to stream: An Extensible Framework for Data Stream Clustering Research with R}, - volume = {76}, - year = {2017} -} - -@manual{hahs17b, - author = {Michael Hahsler and Matthew Bola{\~n}os and John Forrest}, - title = {stream: Infrastructure for Data Stream Mining}, - year = {2017} -} - -@book{Mont17a, - address = {New York NY}, - author = {Montgomery, D C}, - edition = {9th}, - publisher = {Wiley}, - title = {{Design and Analysis of Experiments}}, - year = {2017} -} - -@inproceedings{oliv17a, - author = {H. F. M. Oliveira, Gustavo and C. Cavalcante, Rodolfo and G. Cabral, George and L. Minku, Leandro and L. I. Oliveira, Adriano}, - booktitle = {2017 IEEE 29th International Conference on Tools with Artificial Intelligence (ICTAI)}, - pages = {239-246}, - title = {Time Series Forecasting in the Presence of Concept Drift: A PSO-based Approach}, - year = {2017} -} - -@misc{un17a, - author = {United Nations}, - title = {United Nations Global Pulse. Harnessing big data for development and humanitarian action.}, - year = {2017} -} - -@misc{warm17a, - author = {Warmerdam, Vincent}, - title = {koaning.io: Passive Agressive Algorithms}, - year = {2017} -} - -@article{seth17a, - author = {{Singh Sethi}, Tegjyot and {Kantardzic}, Mehmed}, - journal = {arXiv e-prints}, - month = mar, - pages = {arXiv:1704.00023}, - title = {{On the Reliable Detection of Concept Drift from Streaming Unlabeled Data}}, - year = 2017 -} - -@techreport{beck18b, - address = {Wiesbaden}, - author = {Beck, Martin and Dumpert, Florian and Feuerhake, J{\"o}rg}, - institution = {{Statistisches Bundesamt (Destatis)}}, - title = {Proof of Concept Machine Learning - {Abschlussbericht}}, - year = {2018} -} - -@book{bife18a, - author = {Bifet, Albert and Gavalda, Ricard and Holmes, Geoff and Pfahringer, Bernhard}, - publisher = {MIT Press}, - title = {Machine Learning for Data Streams with Practical Examples in MOA}, - year = {2018} -} - -@book{chen18a, - author = {Chen, Zhiyuan and Liu, Bing and Brachman, Ronald and Stone, Peter and Rossi, Francesca}, - edition = {2nd}, - publisher = {Morgan and Claypool Publishers}, - title = {Lifelong Machine Learning}, - year = {2018} -} - -@article{losi17a, - author = {Viktor Losing and Barbara Hammer and Heiko Wersing}, - journal = {Neurocomputing}, - pages = {1261-1274}, - title = {Incremental on-line learning: A review and comparison of state of the art algorithms}, - volume = {275}, - year = {2018} -} - -@inproceedings{mana18a, - address = {New York, NY, USA}, - author = {Manapragada, Chaitanya and Webb, Geoffrey I. and Salehi, Mahsa}, - booktitle = {Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - pages = {1953--1962}, - publisher = {Association for Computing Machinery}, - series = {KDD '18}, - title = {Extremely Fast Decision Tree}, - year = {2018} -} - -@article{mans18a, - author = {Mansalis, Stratos and Ntoutsi, Eirini and Pelekis, Nikos and Theodoridis, Yannis}, - journal = {Statistical Analysis and Data Mining: The ASA Data Science Journal}, - number = {4}, - pages = {167-187}, - title = {An evaluation of data stream clustering algorithms}, - volume = {11}, - year = {2018} -} - -@misc{warm18a, - author = {Warmerdam, Vincent}, - title = {koaning.io: How to win with simple, even linear, models}, - year = {2018} -} - -@techreport{liu18b, - author = {Liu, J. and Guo, J. and Orlik, P.V. and Shibata, M. and Nakahara, D. and Mii, S. and Takac, M.}, - institution = {MITSUBISHI ELECTRIC RESEARCH LABORATORIES}, - month = {7}, - title = {Anomaly Detection in Manufacturing Systems Using Structured Neural Networks}, - year = {2018} -} - -@inproceedings{alha19a, - address = {New York, NY, USA}, - author = {Al-Hawawreh, Muna and Sitnikova, Elena}, - booktitle = {Proceedings of the 3rd International Conference on Big Data and Internet of Things}, - pages = {126--130}, - publisher = {Association for Computing Machinery}, - series = {BDIOT 2019}, - title = {Industrial Internet of Things Based Ransomware Detection Using Stacked Variational Neural Network}, - year = {2019} -} - -@inproceedings{Bunt19a, - author = {Andreas Bunte and Andreas Fischbach and Jan Strohschein and Thomas Bartz-Beielstein and Heide Faeskorn-Woyke and Oliver Niggemann}, - booktitle = {24th {IEEE} International Conference on Emerging Technologies and Factory Automation, {ETFA} 2019, Zaragoza, Spain, September 10-13, 2019}, - pages = {729--736}, - title = {Evaluation of Cognitive Architectures for Cyber-Physical Production Systems}, - year = {2019} -} - -@misc{senf19a, - author = {Charlotte Senftleben and Till Strohsal}, - title = {Nowcasting: Ein Echtzeit-Indikator f{\"u}r die Konjunkturanalyse}, - year = {2019} -} - -@misc{warm19a, - author = {Warmerdam, Vincent}, - title = {koaning.io: The Future of Data Science is Past}, - year = {2019} -} - -@article{apar20a, - author = {Diego Aparicio and Manuel I. Bertolotto}, - journal = {International Journal of Forecasting}, - number = {2}, - pages = {232-247}, - title = {Forecasting inflation with online prices}, - volume = {36}, - year = {2020} -} - -@article{fisc20a, - author = {Fischbach, Andreas and Strohschein, Jan and Bunte, Andreas and Stork, J{\"o}rg and Faeskorn-Woyke, Heide and Moriz, Natalia and Bartz-Beielstein, Thomas}, - journal = {The International Journal of Advanced Manufacturing Technology}, - number = {1}, - pages = {609--626}, - title = {{CAAI---a cognitive architecture to introduce artificial intelligence in cyber-physical production systems}}, - volume = {111}, - year = {2020} -} - -@article{grze20a, - author = {Grzenda, Maciej and Gomes, Heitor Murilo and Bifet, Albert}, - journal = {Data Mining and Knowledge Discovery}, - number = {5}, - pages = {1237--1266}, - title = {Delayed labelling evaluation for data streams}, - volume = {34}, - year = {2020} -} - -@book{rutk20a, - editor = {Rutkowski, Leszek and Jaworski, Maciej and Duda, Piotr}, - number = {56}, - publisher = {Springer}, - series = {Studies in Big Data}, - title = {Stream Data Mining: Algorithms and Their Probabilistic Properties}, - year = {2020} -} - -@article{he20b, - author = {{He}, Shilin and {Zhu}, Jieming and {He}, Pinjia and {Lyu}, Michael R.}, - journal = {arXiv e-prints}, - month = aug, - pages = {arXiv:2008.06448}, - title = {{Loghub: A Large Collection of System Log Datasets towards Automated Log Analytics}}, - year = 2020 -} - -@article{andr21a, - author = {Paolo Andreini and Thomas Hasenzagl and Lucrezia Reichlin and Charlotte Senftleben-K{\"o}nig and Till Strohsal}, - journal = {International Journal of Forecasting}, - title = {Nowcasting German GDP: Foreign factors, financial markets, and model averaging}, - year = {2021} -} - -@misc{andr21b, - author = {{Su{\'a}rez-Cetrulo}, Andr{\'e}s L. and {Kumar}, Ankit}, - title = {Modelling the COVID-19 Virus Evolution With Incremental Machine Learning}, - year = 2021 -} - -@book{auff21a, - author = {Auffarth, Den}, - publisher = {Packt}, - title = {Machine Learning for Time-Series with Python: Forecast, predict, and detect}, - year = {2021} -} - -@techreport{dump21a, - author = {Dumpert, Florian}, - institution = {{Statistisches Bundesamt (Destatis)}}, - number = {4}, - title = {Machine Learning in der amtlichen Statistik - Ergebnisse und Bewertung eines internationalen Projekts}, - type = {{WISTA}}, - year = {2021} -} - -@article{hals21a, - author = {Halstead, Ben and Koh, Yun Sing and Riddle, Patricia and Pears, Russel and Pechenizkiy, Mykola and Bifet, Albert}, - journal = {Data Mining and Knowledge Discovery}, - number = {3}, - pages = {796--836}, - title = {Recurring concept memory management in data streams: exploiting data stream concept evolution to improve performance and transparency}, - volume = {35}, - year = {2021} -} - -@techreport{holt21a, - author = {Dirk Holtmannsp{\"o}tter and Ulrich Heimeshoff and Justus Haucap and Ina Loebert and Christoph Busch and Andreas Hoffknecht}, - institution = {VDI Technologiezentrum GmbH im Auftrag des Bundesministerium f{\"u}r Wirtschaft und Energie}, - title = {Soziale Marktwirtschaft in der digitalen Zukunft: Foresight-Bericht Strategischer Vorausschauprozess des BMWi}, - year = {2021} -} - -@article{mont20a, - author = {Montiel, Jacob and Halford, Max and Mastelini, Saulo Martiello and Bolmier, Geoffrey and Sourty, Raphael and Vaysse, Robin and Zouitine, Adil and Gomes, Heitor Murilo and Read, Jesse and Abdessalem, Talel and others}, - title = {River: machine learning for streaming data in Python}, - year = {2021} -} - -@book{puta21a, - author = {Putatunda, Sayan}, - publisher = {Springer}, - title = {Practical Machine Learning for Streaming Data with Python}, - year = {2021} -} - -@techreport{reed21a, - author = {Reed, Andrew}, - institution = {Cloudera Fast Forward Labs}, - number = {FF21}, - title = {Infrerring Concept Drift Without Labeled Data}, - year = {2021} -} - -@article{Stro20a, - author = {Strohschein, Jan and Fischbach, Andreas and Bunte, Andreas and Faeskorn-Woyke, Heide and Moriz, Natalia and Bartz-Beielstein, Thomas}, - journal = {The International Journal of Advanced Manufacturing Technology}, - title = {Cognitive capabilities for the CAAI in cyber-physical production systems}, - year = {2021} -} - -@inproceedings{zhan21a, - address = {Berlin, Heidelberg}, - author = {Zhang, Wenbin and Bifet, Albert and Zhang, Xiangliang and Weiss, Jeremy C. and Nejdl, Wolfgang}, - booktitle = {Advances in Knowledge Discovery and Data Mining: 25th Pacific-Asia Conference, PAKDD 2021, Virtual Event, May 11--14, 2021, Proceedings, Part II}, - pages = {245--256}, - publisher = {Springer-Verlag}, - title = {FARF: A Fair and Adaptive Random Forests Classifier}, - year = {2021} -} - -@article{suar21a, - author = {{Su{\'a}rez-Cetrulo}, Andr{\'e}s L. and {Kumar}, Ankit and {Miralles-Pechu{\'a}n}, Luis}, - journal = {arXiv e-prints}, - month = apr, - pages = {arXiv:2104.09325}, - title = {{Modelling the COVID-19 virus evolution with Incremental Machine Learning}}, - year = 2021 -} - -@article{ezuk21a, - author = {Ezukwoke, K.I and Zareian, S.J}, - journal = {Journal of Higher Education Theory and Practice}, - month = {Jun.}, - number = {3}, - title = {Online Learning and Active Learning: A Comparative Study of Passive-Aggressive Algorithm With Support Vector Machine (SVM)}, - volume = {21}, - year = {2021} -} - -@misc{stei21a, - author = {Philipp Steinberg and Nils B{\"o}rnsen and Dirk Neumann}, - howpublished = {Wirtschaftsdienst}, - month = {9}, - title = {Digitale Ordnungspolitik -- Wirtschaftspolitik daten- und evidenzbasiert weiterentwickeln}, - year = {2021} -} - -@article{gall21a, - author = {Antonio-Javier Gallego and Jorge Calvo-Zaragoza and Robert B. Fisher}, - journal = {{IEEE} Transactions on Neural Networks and Learning Systems}, - month = {nov}, - number = {11}, - pages = {4864--4878}, - title = {Incremental Unsupervised Domain-Adversarial Training of Neural Networks}, - volume = {32}, - year = 2021 -} - -@article{alva22a, - author = {Francisco Alvarez and Edgar Roman-Rangel and Luis V. Montiel}, - journal = {Engineering Applications of Artificial Intelligence}, - pages = {104513}, - title = {Incremental learning for property price estimation using location-based services and open data}, - volume = {107}, - year = {2022} -} - -@book{bart21i, - editor = {Bartz,Eva and Bartz-Beielstein, Thomas and Zaefferer, Martin and Mersmann, Olaf}, - publisher = {Springer}, - title = {{Hyperparameter Tuning for Machine and Deep Learning with R - A Practical Guide}}, - year = {2022} -} - -@article{chen22a, - author = {Chen, Valerie and Li, Jeffrey and Kim, Joon Sik and Plumb, Gregory and Talwalkar, Ameet}, - journal = {Queue}, - month = {jan}, - number = {6}, - pages = {28--56}, - title = {Interpretable Machine Learning: Moving from Mythos to Diagnostics}, - volume = {19}, - year = {2022} -} - -@techreport{corr2a, - author = {Correia, Lucas and Goos, Jan-Christoph and Kononova, Anna V. and B{\"a}ck, Thomas and Klein, Philipp}, - institution = {Mercedes-Benz, Germany}, - title = {Online Time-series Anomaly Detection: A Survey of Modern Model-based Approaches}, - year = {2022} -} - -@misc{garc22a, - author = {Garcia-Martin, Eva and Bifet, Albert and Lavesson, Niklas and K{\"o}nig, Rikard and Linusson, Henrik}, - title = {Green Accelerated Hoeffding Tree}, - year = {2022} -} - -@article{hase22b, - author = {Thomas Hasenzagl and Filippo Pellegrino and Lucrezia Reichlin and Giovanni Ricco}, - title = {Monitoring the Economy in Real Time: Trends and Gaps in Real Activity and Prices}, - year = {2022} -} - -@inproceedings{holm22a, - address = {New York, NY, USA}, - author = {Holmes, Geoff and Frank, Eibe and Fletcher, Dale and Sterling, Corey}, - booktitle = {27th International Conference on Intelligent User Interfaces}, - pages = {584--593}, - publisher = {Association for Computing Machinery}, - series = {IUI '22}, - title = {Efficiently Correcting Machine Learning: Considering the Role of Example Ordering in Human-in-the-Loop Training of Image Classification Models}, - year = {2022} -} - -@misc{jang22a, - author = {Jang, Joel and Ye, Seonghyeon and Lee, Changho and Yang, Sohee and Shin, Joongbo and Han, Janghoon and Kim, Gyeonghun and Seo, Minjoon}, - title = {TemporalWiki: A Lifelong Benchmark for Training and Evaluating Ever-Evolving Language Models}, - year = {2022} -} - -@inproceedings{kimu22a, - address = {New York, NY, USA}, - author = {Kimura, Tasuku and Matsubara, Yasuko and Kawabata, Koki and Sakurai, Yasushi}, - booktitle = {Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining}, - pages = {3157--3167}, - publisher = {Association for Computing Machinery}, - series = {KDD '22}, - title = {Fast Mining and Forecasting of Co-Evolving Epidemiological Data Streams}, - year = {2022} -} - -@book{kors22a, - author = {Korstanje, Jan}, - publisher = {Packt}, - title = {Maschine Learning for Streaming Data with Python}, - year = {2022} -} - -@misc{kris22a, - author = {Krishna, Satyapriya and Han, Tessa and Gu, Alex and Pombra, Javin and Jabbari, Shahin and Wu, Steven and Lakkaraju, Himabindu}, - title = {The Disagreement Problem in Explainable Machine Learning: A Practitioner's Perspective}, - year = {2022} -} - -@manual{thea22a, - author = {{The Apache Software Foundation}}, - title = {SparkR: R Front End for 'Apache Spark'}, - year = {2022} -} - -@article{wang22b, - author = {Wang, Xin and Dong, Yijia and Thompson, William David and Nair, Harish and Li, You}, - journal = {Communications Medicine}, - number = {1}, - pages = {119}, - title = {Short-term local predictions of COVID-19 in the United Kingdom using dynamic supervised machine learning algorithms}, - volume = {2}, - year = {2022} -} - -@article{le22a, - author = {{Le}, Van-Hoang and {Zhang}, Hongyu}, - journal = {arXiv e-prints}, - month = feb, - pages = {arXiv:2202.04301}, - title = {{Log-based Anomaly Detection with Deep Learning: How Far Are We?}}, - year = 2022 -} - -@article{thom22a, - author = {Thomas, Rachel L and Uminsky, David}, - journal = {Patterns (N Y)}, - month = {May}, - number = {5}, - pages = {100476}, - title = {Reliance on metrics is a fundamental challenge for AI.}, - volume = {3}, - year = {2022} -} - -@techreport{vali22a, - author = {Valitov, Niyaz}, - institution = {{Bundesnetzagentur f{\"u}r Elektrizit{\"a}t, Gas, Telekommunikation, Post und Eisenbahnen}}, - month = {Juli}, - title = {{SMRD.de} {B}enutzerhandbuch}, - year = {2022} -} - -@article{barc14a, - title = {Use of web scraping and text mining techniques in the Istat survey on “Information and Communication Technology in enterprises”}, - author = {G. Barcaroli and A. Nurra and M. Scarnò and D. Summa}, - year = 2014 -} -@article{mcCa09a, - title = {Who Makes Mistakes? Using Data Mining Techniques to Analyze Reporting Errors in Total Acres Operated}, - author = {Jaki S. McCarthy and Morgan S. Earp}, - year = 2009, - journal = {NASS Research Reports}, - publisher = {United States Department of Agriculture, National Agricultural Statistics Service}, - doi = {10.22004/AG.ECON.234367}, - url = {https://ideas.repec.org/p/ags/unasrr/234367.html}, - keywords = {Research Methods/ Statistical Methods} -} -@article{mcCa10b, - title = {Modeling Non-response in National Agricultural Statistics Service (NASS) Surveys Using Classification Trees}, - author = {Jaki S Mccarthy and Thomas Jacob and Amanda Mccracken}, - year = 2010 -} -@article{cece09a, - title = {2007 Census of Agriculture Non-Response Methodology}, - author = {Will Cecere}, - year = 2009, - keywords = {census of agriculture,classification trees,non-response adjustment} -} -@article{earp09a, - title = {Exploring Quarterly Agricultural Survey Questionnaire Version Reduction Scenarios}, - author = {Morgan Earp and Scott Cox and Jody Mcdaniel and Chadd Crouse}, - year = 2009 -} -@article{pRey12a, - title = {USE OF MACHINE LEARNING METHODS TO IMPUTE CATEGORICAL DATA}, - author = {P. Rey}, - year = 2012 -} -@article{mcCa10a, - title = {Innovative Uses of Data Mining Techniques in the Production of Official Statistics}, - author = {Jaki Mccarthy and Thomas Jacob and Dale Atkinson} -} -@online{beth14a, - title = {Automatic Coding of Occupations. Using Machine Learning Algorithms for Occupation Coding in Several German Panel Surveys}, - url = {https://www.researchgate.net/publication/266259591_Automatic_Coding_of_Occupations_Using_Machine_Learning_Algorithms_for_Occupation_Coding_in_Several_German_Panel_Surveys} -} -@article{peng17a, - title = {Evaluating hourly air quality forecasting in Canada with nonlinear updatable machine learning methods}, - author = {Peng, Huiping and Lima, Aranildo R. and Teakles, Andrew and Jin, Jian and Cannon, Alex J. and Hsieh, William W.}, - year = 2017, - month = {Mar}, - day = {01}, - journal = {Air Quality, Atmosphere {\&} Health}, - volume = 10, - number = 2, - pages = {195--211}, - doi = {10.1007/s11869-016-0414-3}, - issn = {1873-9326}, - url = {https://doi.org/10.1007/s11869-016-0414-3} -} -@article{benc18a, - title = {Online Machine Learning in Big Data Streams}, - author = {Andr{\'{a}}s A. Bencz{\'{u}}r and Levente Kocsis and R{\'{o}}bert P{\'{a}}lovics}, - year = 2018, - journal = {CoRR}, - volume = {abs/1802.05872}, - url = {http://arxiv.org/abs/1802.05872}, - eprinttype = {arXiv}, - eprint = {1802.05872}, - timestamp = {Mon, 13 Aug 2018 16:46:39 +0200}, - biburl = {https://dblp.org/rec/journals/corr/abs-1802-05872.bib}, - bibsource = {dblp computer science bibliography, https://dblp.org} -} -@article{shan20a, - title = {Learn: A Novel incremental learning method for text classification}, - author = {Guangxu Shan and Shiyao Xu and Li Yang and Shengbin Jia and Yang Xiang}, - year = 2020, - month = 6, - journal = {Expert Systems with Applications}, - publisher = {Pergamon}, - volume = 147, - pages = 113198, - doi = {10.1016/J.ESWA.2020.113198}, - issn = {0957-4174}, - keywords = {Incremental learning,Learn,Reinforcement learning} -} -@article{chat21a, - title = {Incremental Real-Time Learning Framework for Sentiment Classification: Indian General Election 2019, A Case Study}, - author = {Sharmistha Chatterjee and Sushmita Gupta}, - year = 2021, - month = 3, - journal = {2021 IEEE 6th International Conference on Big Data Analytics, ICBDA 2021}, - publisher = {Institute of Electrical and Electronics Engineers Inc.}, - pages = {198--203}, - doi = {10.1109/ICBDA51983.2021.9402992}, - isbn = 9780738131672, - keywords = {architecture,component,deep learning,indian election,ml,nip} -} -@article{bifet10a, - title = {MOA: Massive Online Analysis}, - author = {Albert Bifet and Geoff Holmes and Richard Kirkby and Bernhard Pfahringer}, - year = 2010, - journal = {Journal of Machine Learning Research}, - volume = 11, - pages = {1601--1604}, - abstract = {Massive Online Analysis (MOA) is a software environment for implementing algorithms and running experiments for online learning from evolving data streams. MOA includes a collection of offline and online methods as well as tools for evaluation. In particular, it implements boosting, bagging, and Hoeffding Trees, all with and without Na¨ıveNa¨ıve Bayes classifiers at the leaves. MOA supports bi-directional interaction with WEKA, the Waikato Environment for Knowledge Analysis , and is released under the GNU GPL license.}, - keywords = {classification,data streams,ensemble methods,java,machine learning software} -} - - -@inbook{bart23c5, - address = {Singapore}, - author = {Bartz-Beielstein, Thomas}, - editor = {Bartz, Eva and Bartz-Beielstein, Thomas}, - pages = {47--62}, - publisher = {Springer Nature Singapore}, - title = {Evaluation and Performance Measurement}, - year = {2024} -} - - -@inbook{bart23c10, - address = {Singapore}, - author = {Bartz-Beielstein, Thomas}, - editor = {Bartz, Eva and Bartz-Beielstein, Thomas}, - pages = {125--140}, - publisher = {Springer Nature Singapore}, - title = {Hyperparameter Tuning}, - year = {2024} -} - - -@incollection{bart21ic3, - author = {Bartz-Beielstein, Thomas and Zaefferer, Martin}, - booktitle = {{Hyperparameter Tuning for Machine and Deep Learning with R - A Practical Guide}}, - chapter = {4}, - editor = {Bartz,Eva and Bartz-Beielstein, Thomas and Zaefferer, Martin and Mersmann, Olaf}, - pages = {67-114}, - publisher = {Springer}, - title = {Hyperparameter Tuning Approaches}, - year = {2022} -} - -@inbook{bart23c3, - author = {Bartz-Beielstein, Thomas - and Hans, Lukas}, - editor = {Bartz, Eva - and Bartz-Beielstein, Thomas}, - title = {Drift Detection and Handling}, - booktitle = {Online Machine Learning: A Practical Guide with Examples in Python}, - year = {2024}, - publisher = {Springer Nature Singapore}, - address = {Singapore}, - pages = {23--39}, - abstract = {Structural changes (``drift'') in the data cause problems for many algorithms. Based on the drift definitions given in Chap. 1, methods for drift detection and handling are discussed. For the algorithms presented in Chap. 2, it is clarified to what extent concept drift is reacted to. In turn, the extent to which catastrophic forgetting is an issue is described in Sect. 4.3. Section 3.1 describes three architectures for implementing drift detection algorithms. Basic properties of window-based approaches are presented in Sect. 3.2. Section 3.4 presents commonly used drift detection techniques. Section 3.4 describes how the drift detection techniques introduced in Sect. 3.3 are used in Online Machine Learning (OML) algorithms and summarizes the tree-based OML techniques implemented in the River package. Section 3.5 introduces scaling methods for handling drift.}, - isbn = {978-981-99-7007-0}, - doi = {10.1007/978-981-99-7007-0_3}, - url = {https://doi.org/10.1007/978-981-99-7007-0_3} -} - -@inbook{bart23c1, - author = {Bartz-Beielstein, Thomas}, - editor = {Bartz, Eva - and Bartz-Beielstein, Thomas}, - title = {Introduction: From Batch to Online Machine Learning}, - booktitle = {Online Machine Learning: A Practical Guide with Examples in Python}, - year = {2024}, - publisher = {Springer Nature Singapore}, - address = {Singapore}, - pages = {1--11}, - abstract = {Batch Machine Learning (BML), which is also referred to as ``offline machine learning'', reaches its limits when dealing with very large amounts of data. This is especially true for available memory, handling drift in data streams, and processing new, unknown data. Online Machine Learning (OML) is an alternative to BML that overcomes the limitations of BML. In this chapter, the basic terms and concepts of OML are introduced and the differences to BML are shown.}, - isbn = {978-981-99-7007-0}, - doi = {10.1007/978-981-99-7007-0_1}, - url = {https://doi.org/10.1007/978-981-99-7007-0_1} -} - -@article{mour19a, - author = {{Mourtada}, Jaouad and {Gaiffas}, Stephane and {Scornet}, Erwan}, - title = {{AMF: Aggregated Mondrian Forests for Online Learning}}, - journal = {arXiv e-prints}, - keywords = {Statistics - Machine Learning, Computer Science - Machine Learning, Mathematics - Statistics Theory}, - year = 2019, - month = jun, - eid = {arXiv:1906.10529}, - pages = {arXiv:1906.10529}, - doi = {10.48550/arXiv.1906.10529}, - archiveprefix = {arXiv}, - eprint = {1906.10529}, - primaryclass = {stat.ML}, - adsurl = {https://ui.adsabs.harvard.edu/abs/2019arXiv190610529M}, - adsnote = {Provided by the SAO/NASA Astrophysics Data System} -} - -@inproceedings{mana18a, - title = {Extremely fast decision tree}, - abstract = {We introduce a novel incremental decision tree learning algorithm, Hoeffding Anytime Tree, that is statistically more efficient than the current state-of-the-art, Hoeffding Tree. We demonstrate that an implementation of Hoeffding Anytime Tree'“Extremely Fast Decision Tree”, a minor modification to the MOA implementation of Hoeffding Tree'obtains significantly superior prequential accuracy on most of the largest classification datasets from the UCI repository. Hoeffding Anytime Tree produces the asymptotic batch tree in the limit, is naturally resilient to concept drift, and can be used as a higher accuracy replacement for Hoeffding Tree in most scenarios, at a small additional computational cost.}, - keywords = {Classification, Decision Trees, Incremental Learning}, - author = {Chaitanya Manapragada and Webb, {Geoffrey I.} and Mahsa Salehi}, - year = {2018}, - doi = {10.1145/3219819.3220005}, - language = {English}, - pages = {1953--1962}, - editor = {Lin, {Chih-Jen } and Xiong, {Hui }}, - booktitle = {KDD' 2018 - Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining}, - publisher = {Association for Computing Machinery (ACM)}, - address = {United States of America}, - note = {ACM International Conference on Knowledge Discovery and Data Mining 2018, KDD 2018 ; Conference date: 19-08-2018 Through 23-08-2018}, - url = {http://www.kdd.org/kdd2018/, https://dl.acm.org/doi/proceedings/10.1145/3219819} -} - - -@book{Gram20a, - author = {Gramacy, Robert B}, - publisher = {{CRC} press}, - title = {Surrogates}, - year = {2020} -} - - -@misc{lipp22a, - author = {Phillip Lippe}, - title = {{UvA} Deep Learning Tutorials}, - year = {2022}, - url = {https://github.com/phlippe/uvadlc_notebooks/tree/master} -} - - -@article{vasw17a, - author = {{Vaswani}, Ashish and {Shazeer}, Noam and {Parmar}, Niki and {Uszkoreit}, Jakob and {Jones}, Llion and {Gomez}, Aidan N. and {Kaiser}, Lukasz and {Polosukhin}, Illia}, - journal = {arXiv e-prints}, - month = jun, - pages = {1-15}, - title = {{Attention Is All You Need}}, - year = 2017 -} - - -@article{liu19a, - author = {{Liu}, Liyuan and {Jiang}, Haoming and {He}, Pengcheng and {Chen}, Weizhu and {Liu}, Xiaodong and {Gao}, Jianfeng and {Han}, Jiawei}, - journal = {arXiv e-prints}, - month = {Aug}, - pages = {arXiv:1908.03265}, - title = {{On the Variance of the Adaptive Learning Rate and Beyond}}, - year = {2019} -} - - -@article{tay20a, - author = {{Tay}, Yi and {Dehghani}, Mostafa and {Bahri}, Dara and {Metzler}, Donald}, - journal = {arXiv e-prints}, - month = sep, - pages = {arXiv:2009.06732}, - title = {{Efficient Transformers: A Survey}}, - year = 2020 -} - - -@article{devl18a, - author = {{Devlin}, Jacob and {Chang}, Ming-Wei and {Lee}, Kenton and {Toutanova}, Kristina}, - journal = {arXiv e-prints}, - month = oct, - pages = {arXiv:1810.04805}, - title = {{BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding}}, - year = 2018 -} - - -@article{deso20a, - author = {{Dosovitskiy}, Alexey and {Beyer}, Lucas and {Kolesnikov}, Alexander and {Weissenborn}, Dirk and {Zhai}, Xiaohua and {Unterthiner}, Thomas and {Dehghani}, Mostafa and {Minderer}, Matthias and {Heigold}, Georg and {Gelly}, Sylvain and {Uszkoreit}, Jakob and {Houlsby}, Neil}, - journal = {arXiv e-prints}, - month = oct, - pages = {arXiv:2010.11929}, - title = {{An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}}, - year = 2020 -} - - -@article{jain19a, - author = {{Jain}, Sarthak and {Wallace}, Byron C.}, - journal = {arXiv e-prints}, - month = feb, - pages = {arXiv:1902.10186}, - title = {{Attention is not Explanation}}, - year = 2019 -} - - -@article{wieg19a, - author = {{Wiegreffe}, Sarah and {Pinter}, Yuval}, - journal = {arXiv e-prints}, - month = aug, - pages = {arXiv:1908.04626}, - title = {{Attention is not not Explanation}}, - year = 2019 -} - - -@article{frie91a, - author = {Friedman, Jerome H.}, - journal = {The annals of statistics}, - number = {1}, - pages = {1--67}, - title = {Multivariate adaptive regression splines}, - volume = {19}, - year = {1991} -} - - -@article{ikon11a, - author = {Ikonomovska, Elena and Gama, Jo{\~a}o and D{\v z}eroski, Sa{\v s}o}, - journal = {Data Mining and Knowledge Discovery}, - number = {1}, - pages = {128--168}, - title = {Learning model trees from evolving data streams}, - volume = {23}, - year = {2011} -} - - -@book{Jame14a, - author = {James, Gareth and Witten, Daniela and Hastie, Trevor and Tibshirani, Robert}, - edition = {7th}, - publisher = {Springer}, - title = {{An Introduction to Statistical Learning with Applications in R}}, - year = {2014} -} - - -@book{chol18b, - author = {Chollet, Francoise and Allaire, J.J.}, - publisher = {Manning}, - title = {Deep Learning with Python}, - year = {2018} -} - - -@article{arlot2010, - author = {Arlot, Sylvain and Celisse, Alain and others}, - journal = {Statistics surveys}, - pages = {40--79}, - title = {A survey of cross-validation procedures for model selection}, - volume = {4}, - year = {2010}} - -@article{Burm94a, - author = {BURMAN, PRABIR and CHOW, EDMOND and NOLAN, DEBORAH}, - journal = {Biometrika}, - number = {2}, - pages = {351--358}, - title = {{A cross-validatory method for dependent data}}, - volume = {81}, - year = {1994}} - -@inproceedings{Koha95a, - address = {San Francisco, CA, USA}, - author = {Kohavi, Ron}, - booktitle = {Proceedings of the 14th International Joint Conference on Artificial Intelligence - Volume 2}, - pages = {1137--1143}, - publisher = {Morgan Kaufmann Publishers Inc.}, - series = {IJCAI'95}, - title = {A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection}, - year = {1995}} - -@techreport{Legr12a, - author = {Le Gratiet, Loic and Cannamela, Claire}, - month = oct, - title = {{Kriging-based sequential design strategies using fast cross-validation techniques with extensions to multi-fidelity computer codes }}, - year = {2012}} - -@article{Pica84a, - author = {Richard R. Picard and R. Dennis Cook}, - journal = {Journal of the American Statistical Association}, - number = {387}, - pages = {575-583}, - title = {Cross-Validation of Regression Models}, - volume = {79}, - year = {1984}} - - -@book{Hast17a, - author = {Trevor Hastie and Robert Tibshirani and Jerome Friedman}, - edition = {Second}, - publisher = {Springer}, - title = {The Elements of Statistical Learning}, - year = {2017}} - - -@misc{he15a, - author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun}, - title = {Deep Residual Learning for Image Recognition}, - year = {2015}} - - -@article{he16a, - author = {{He}, Kaiming and {Zhang}, Xiangyu and {Ren}, Shaoqing and {Sun}, Jian}, - journal = {arXiv e-prints}, - month = mar, - pages = {arXiv:1603.05027}, - title = {{Identity Mappings in Deep Residual Networks}}, - year = 2016} - - -@article{chen18b, - author = {{Chen}, Ricky T.~Q. and {Rubanova}, Yulia and {Bettencourt}, Jesse and {Duvenaud}, David}, - journal = {arXiv e-prints}, - month = jun, - pages = {arXiv:1806.07366}, - title = {{Neural Ordinary Differential Equations}}, - year = 2018} - - -@book{pont87a, - author = {Pontryagin}, - publisher = {Routledge}, - title = {Mathematical Theory of Optimal Processes}, - year = {1987}} - - -@article{kidg22a, - author = {{Kidger}, Patrick}, - journal = {arXiv e-prints}, - month = feb, - pages = {arXiv:2202.02435}, - title = {{On Neural Differential Equations}}, - year = 2022} - - -@book{Chen10a, - author = {Chen, Chun Hung}, - publisher = {World Scientific}, - title = {{Stochastic simulation optimization: an optimal computing budget allocation}}, - year = {2010}} - - -@techreport{Bart11a, - address = {Cologne University of Applied Science, Faculty of Computer Science and Engineering Science}, - author = {Bartz-Beielstein, Thomas and Friese, Martina}, - month = jan, - title = {{Sequential Parameter Optimization and Optimal Computational Budget Allocation for Noisy Optimization Problems}}, - year = {2011}} - - -@book{Hart95a, - author = {Hartung, Joachim and Elpert, B{\"a}rbel and Kl{\"o}sener, Karl-Heinz}, - publisher = {Oldenbourg}, - title = {{Statistik}}, - year = {1995}} - - - -@misc{wiki25a, - author = {{Wikipedia contributors}}, - date-added = {2025-02-15 21:02:30 +0100}, - date-modified = {2025-02-15 21:03:00 +0100}, - note = {[Online; accessed 15-February-2025]}, - title = {Partial correlation --- {Wikipedia}{,} The Free Encyclopedia}, - url = {https://en.wikipedia.org/w/index.php?title=Partial_correlation&oldid=1253637419}, - year = {2024}} - - -@misc{rumm76a, - author = {Rummel, R.J.}, - date-added = {2025-02-15 21:13:22 +0100}, - date-modified = {2025-02-15 21:14:21 +0100}, - title = {Understanding Correlation}, - url = {https://www.hawaii.edu/powerkills/UC.HTM}, - year = {1976}} - - -@article{wang07a, - author = {Zhiqiang Wang}, - journal = {The Stata Journal}, - number = {2}, - pages = {183-196}, - title = {Two Postestimation Commands for Assessing Confounding Effects in Epidemiological Studies}, - volume = {7}, - year = {2007}} - - -@book{Myers2016, - author = {Myers, Raymond H and Montgomery, Douglas C and Anderson-Cook, Christine M}, - publisher = {John Wiley \& Sons}, - title = {Response surface methodology: process and product optimization using designed experiments}, - year = {2016}} - - -@techreport{kuhn16a, - author = {Kuhn, Max}, - month = {9}, - title = {desirability: Function Optimization and Ranking via Desirability Functions}, - doi = {10.32614/CRAN.package.desirability}, - year = {2016}, - note = {https://cran.r-project.org/package=desirability}} - - -@inproceedings{Bart11b, - address = {New York, NY, USA}, - author = {Bartz-Beielstein, Thomas and Friese, Martina and Zaefferer, Martin and Naujoks, Boris and Flasch, Oliver and Konen, Wolfgang and Koch, Patrick}, - booktitle = {Proceedings of the 13th annual conference companion on Genetic and evolutionary computation}, - pages = {119--120}, - publisher = {ACM}, - title = {{Noisy optimization with sequential parameter optimization and optimal computational budget allocation}}, - year = {2011}} - - -@book{Chen10a, - author = {Chen, Chun Hung}, - publisher = {World Scientific}, - title = {{Stochastic simulation optimization: an optimal computing budget allocation}}, - year = {2010}} - - -@article{Boha86a, - author = {Bohachevsky, I O}, - journal = {Technometrics}, - number = {3}, - pages = {209--217}, - title = {{Generalized Simulated Annealing for Function Optimization}}, - volume = {28}, - year = {1986}} - - -@article{Box51a, - author = {G. E. P. Box and K. B. Wilson}, - journal = {Journal of the Royal Statistical Society. Series B (Methodological)}, - number = {1}, - pages = {1--45}, - title = {{On the Experimental Attainment of Optimum Conditions}}, - volume = {13}, - year = {1951}} - - -@book{Mont01a, - address = {New York NY}, - author = {Montgomery, D C}, - edition = {5th}, - publisher = {Wiley}, - title = {{Design and Analysis of Experiments}}, - year = {2001}} - - -@inproceedings{weih99a, - address = {New York NY}, - author = {Weihe, Karsten and Brandes, Ulrik and Liebers, Annegret and ller-Hannemann, Matthias M{\"\i} and Wagner, Dorothea and Willhalm, Thomas}, - booktitle = {SCG '99: Proceedings of the Fifteenth Annual Symposium on Computational Geometry}, - pages = {86--94}, - publisher = {Association for Computing Machinery}, - title = {{Empirical Design of Geometric Algorithms}}, - year = {1999}} - - -@article{bisc23a, - author = {Bischl, Bernd and Binder, Martin and Lang, Michel and Pielok, Tobias and Richter, Jakob and Coors, Stefan and Thomas, Janek and Ullmann, Theresa and Becker, Marc and Boulesteix, Anne-Laure and Deng, Difan and Lindauer, Marius}, - journal = {WIREs Data Mining and Knowledge Discovery}, - number = {2}, - pages = {e1484}, - title = {Hyperparameter optimization: Foundations, algorithms, best practices, and open challenges}, - volume = {13}, - year = {2023}} - -@article{box57b, - author = {G. E. P. Box and J. S. Hunter}, - journal = {The Annals of Mathematical Statistics}, - number = {1}, - pages = {195--241}, - title = {Multi-Factor Experimental Designs for Exploring Response Surfaces}, - volume = {28}, - year = {1957}} - - -@inbook{coel21a, - address = {Cham}, - author = {Coello, Carlos A. Coello and Brambila, Silvia Gonz{\'a}lez and Gamboa, Josu{\'e} Figueroa and Tapia, Ma. Guadalupe Castillo}, - editor = {Pardalos, Panos M. and Rasskazova, Varvara and Vrahatis, Michael N.}, - pages = {137--162}, - publisher = {Springer International Publishing}, - title = {Multi-Objective Evolutionary Algorithms: Past, Present, and Future}, - year = {2021}} - - -@article{delc96a, - author = {Del Castillo, E. and Montgomery, D. C. and McCarville, D. R.}, - journal = {Journal of Quality Technology}, - pages = {337--345}, - title = {Modified Desirability Functions for Multiple Response Optimization}, - volume = {28}, - year = {1996}} - - -@article{derr80a, - author = {Derringer, G. and Suich, R.}, - journal = {Journal of Quality Technology}, - pages = {214--219}, - title = {Simultaneous Optimization of Several Response Variables}, - volume = {12}, - year = {1980}} - - -@article{emme18a, - author = {Emmerich, Michael T. M. and Deutz, Andr{\'e}H.}, - journal = {Natural Computing}, - number = {3}, - pages = {585--609}, - title = {A tutorial on multiobjective optimization: fundamentals and evolutionary methods}, - volume = {17}, - year = {2018}} - - -@article{hari65a, - author = {Harington, J}, - journal = {Industrial Quality Control}, - pages = {494--498}, - title = {The Desirability Function}, - volume = {21}, - year = {1965}} - -@article{karl22c, - author = {Karl, Florian and Pielok, Tobias and Moosbauer, Julia and Pfisterer, Florian and Coors, Stefan and Binder, Martin and Schneider, Lennart and Thomas, Janek and Richter, Jakob and Lang, Michel and Garrido-Merch\'{a}n, Eduardo C. and Branke, Juergen and Bischl, Bernd}, - journal = {ACM Trans. Evol. Learn. Optim.}, - month = dec, - number = {4}, - title = {Multi-Objective Hyperparameter Optimization in Machine Learning---An Overview}, - volume = {3}, - year = {2023}} - - -@article{neld65a, - author = {Nelder, J. A. and Mead, R.}, - journal = {The Computer Journal}, - month = {01}, - number = {4}, - pages = {308-313}, - title = {{A Simplex Method for Function Minimization}}, - volume = {7}, - year = {1965}} - - -@inproceedings{nino15a, - author = {Nino, Esmeralda and Rosas Rubio, Juan and Bonet, Samuel and Ramirez-Beltran, Nazario and Cabrera-Rios, Mauricio}, - month = {06}, - title = {Multiple Objective Optimization Using Desirability Functions for the Design of a 3D Printer Prototype}, - year = {2015}} - - - -@misc{nist25a, - doi = {10.18434/M32189}, - editor = {{National Institute of Standards and Technology}}, - title = {{NIST/SEMATECH e-Handbook of Statistical Methods}}, - url = {www.itl.nist.gov/div898/handbook/pri/section5/pri5322.htm}, - year = {2021}, -} - - -@article{olss75a, - author = {Olsson, Donald M and Nelson, Lloyd S}, - journal = {Technometrics}, - number = {1}, - pages = {45--51}, - title = {The Nelder-Mead simplex procedure for function minimization}, - volume = {17}, - year = {1975}} - - -@article{bart23iArXiv, - author = {{Bartz-Beielstein}, Thomas}, - title = "{Hyperparameter Tuning Cookbook: - A guide for scikit-learn, PyTorch, river, and spotpython}", - journal = {arXiv e-prints}, - keywords = {Computer Science - Machine Learning, - Computer Science - Artificial Intelligence, 90C26, I.2.6, G.1.6}, - year = 2023, - month = jul, - eid = {arXiv:2307.10262}, - doi = {10.48550/arXiv.2307.10262}, -archivePrefix = {arXiv}, - eprint = {2307.10262}, - primaryClass = {cs.LG} -} - - -@article{micc86a, - abstract = {Among other things, we prove that multiquadric surface interpolation is always solvable, thereby settling a conjecture of R. Franke.}, - author = {Micchelli, Charles A. }, - date = {1986/12/01}, - date-added = {2025-05-16 17:37:12 +0200}, - date-modified = {2025-05-16 17:37:34 +0200}, - doi = {10.1007/BF01893414}, - id = {Micchelli1986}, - isbn = {1432-0940}, - journal = {Constructive Approximation}, - number = {1}, - pages = {11--22}, - title = {Interpolation of scattered data: Distance matrices and conditionally positive definite functions}, - url = {https://doi.org/10.1007/BF01893414}, - volume = {2}, - year = {1986}, - bdsk-url-1 = {https://doi.org/10.1007/BF01893414}, -} - - -@book{kean05a, - author = {Keane, Andrew J and Nair, Prasanth B}, - publisher = {Wiley}, - title = {Computational Approaches for Aerospace Design: The Pursuit of Excellence}, - year = {2005}} - -@book{vapn98a, - author = {Vapnik, V N}, - howpublished = {Wiley}, - publisher = {Wiley}, - title = {{Statistical learning theory}}, - year = {1998}} - - -@article{pogg90a, - abstract = {Learning an input-output mapping from a set of examples, of the type that many neural networks have been constructed to perform, can be regarded as synthesizing an approximation of a multidimensional function (that is, solving the problem of hypersurface reconstruction). From this point of view, this form of learning is closely related to classical approximation techniques, such as generalized splines and regularization theory. A theory is reported that shows the equivalence between regularization and a class of three-layer networks called regularization networks or hyper basis functions. These networks are not only equivalent to generalized splines but are also closely related to the classical radial basis functions used for interpolation tasks and to several pattern recognition and neural network algorithms. They also have an interesting interpretation in terms of prototypes that are synthesized and optimally combined during the learning stage.}, - author = {Poggio, T and Girosi, F}, - crdt = {1990/02/23 00:00}, - date = {1990 Feb 23}, - dcom = {20100702}, - doi = {10.1126/science.247.4945.978}, - edat = {1990/02/23 00:00}, - issn = {0036-8075 (Print); 0036-8075 (Linking)}, - jid = {0404511}, - journal = {Science}, - jt = {Science (New York, N.Y.)}, - language = {eng}, - lr = {20100608}, - mhda = {1990/02/23 00:01}, - month = {Feb}, - number = {4945}, - own = {NLM}, - pages = {978--982}, - phst = {1990/02/23 00:00 {$[$}pubmed{$]$}; 1990/02/23 00:01 {$[$}medline{$]$}; 1990/02/23 00:00 {$[$}entrez{$]$}}, - pii = {247/4945/978}, - pl = {United States}, - pmid = {17776454}, - pst = {ppublish}, - pt = {Journal Article}, - status = {PubMed-not-MEDLINE}, - title = {Regularization algorithms for learning that are equivalent to multilayer networks.}, - volume = {247}, - year = {1990}, -} - - -@article{morr95a, - abstract = {Recent work by Johnson et al. (J. Statist. Plann. Inference 26 (1990) 131--148) establishes equivalence of the maximin distance design criterion and an entropy criterion motivated by function prediction in a Bayesian setting. The latter criterion has been used by Currin et al. (J. Amer. Statist. Assoc. 86 (1991) 953--963) to design experiments for which the motivating application is approximation of a complex deterministic computer model. Because computer experiments often have a large number of controlled variables (inputs), maximin designs of moderate size are often concentrated in the corners of the cuboidal design region, i.e. each input is represented at only two levels. Here we will examine some maximin distance designs constructed within the class of Latin hypercube arrangements. The goal of this is to find designs which offer a compromise between the entropy/maximin criterion, and good projective properties in each dimension (as guaranteed by Latin hypercubes). A simulated annealing search algorithm is presented for constructing these designs, and patterns apparent in the optimal designs are discussed.}, - author = {Max D. Morris and Toby J. Mitchell}, - date-added = {2025-04-12 17:42:08 +0200}, - date-modified = {2025-04-12 17:42:17 +0200}, - doi = {https://doi.org/10.1016/0378-3758(94)00035-T}, - issn = {0378-3758}, - journal = {Journal of Statistical Planning and Inference}, - keywords = {Bayesian prediction, Computer experiment, Computer model, Interpolation, Latin hypercube design, Random functions}, - number = {3}, - pages = {381-402}, - title = {Exploratory designs for computational experiments}, - url = {https://www.sciencedirect.com/science/article/pii/037837589400035T}, - volume = {43}, - year = {1995}, -} - -@article{Box57a, - author = {Box, G E P}, - date-added = {2015-11-29T01:39:41GMT}, - date-modified = {2015-11-29T01:40:08GMT}, - journal = {Applied Statistics}, - pages = {81--101}, - rating = {0}, - title = {{Evolutionary operation: A method for increasing industrial productivity.}}, - uri = {\url{papers3://publication/uuid/9D3779C0-07D3-4CC4-9ABF-FD1FCF0BBA53}}, - volume = {6}, - year = {1957}} - - - -@article{john90a, - author = {M.E. Johnson and L.M. Moore and D. Ylvisaker}, - journal = {Journal of Statistical Planning and Inference}, - number = {2}, - pages = {131-148}, - title = {Minimax and maximin distance designs}, - volume = {26}, - year = {1990}} - - -@book{raym06a, - author = {Raymer, Daniel P.}, - date-added = {2025-05-18 22:34:21 +0200}, - date-modified = {2025-05-18 22:35:39 +0200}, - publisher = {{AIAA}}, - title = {Aircraft Design: A Conceptual Approach}, - year = {2006}} - -@article{pron17a, - TITLE = {{Minimax and maximin space-filling designs: some properties and methods for construction}}, - AUTHOR = {Pronzato, Luc}, - URL = {https://hal.science/hal-01496712}, - JOURNAL = {{Journal de la Societe Fran{\c c}aise de Statistique}}, - PUBLISHER = {{Societe Fran{\c c}aise de Statistique et Societe Mathematique de France}}, - VOLUME = {158}, - NUMBER = {1}, - PAGES = {7-36}, - YEAR = {2017}, - MONTH = Mar, - KEYWORDS = { sphere packing ; sphere covering ; maximin-optimal design ; minimax-optimal design ; space-filling design ; computer experiments ; plans maximin optimaux ; sph{\`e}res de recouvrement ; empilement de sph{\`e}res ; plans minimax optimaux ; plans d'exp{\'e}riences {\`a} remplissage d'espace ; exp{\'e}riences num{\'e}riques}, - PDF = {https://hal.science/hal-01496712v1/file/LP_jsfds-2016-REV1.pdf}, - HAL_ID = {hal-01496712}, - HAL_VERSION = {v1}, -} - - -@article{Sack89a, - author = {Sacks, J and Welch, W J and Mitchell, T J and Wynn, H P}, - date-added = {2015-11-29T01:43:02GMT}, - date-modified = {2016-10-30 19:03:11 +0000}, - journal = {Statistical Science}, - keywords = {Bart16n; Surrogate}, - number = {4}, - pages = {409--435}, - rating = {0}, - title = {{Design and analysis of computer experiments}}, - volume = {4}, - year = {1989}, -} - - -@webpage{bart23icode, - author = {Bartz-Beielstein, Thomas}, - date-added = {2025-06-14 16:31:37 +0200}, - date-modified = {2025-06-14 16:33:43 +0200}, - lastchecked = {14.6.2025}, - month = {6}, - title = {Kriging (Gaussian Process Regression): The Complete Python Code for the Example}, - url = {https://sequential-parameter-optimization.github.io/Hyperparameter-Tuning-Cookbook/006_num_gp.html}, - year = {2025}} - - -@article{bart25a, - adsnote = {Provided by the SAO/NASA Astrophysics Data System}, - adsurl = {https://ui.adsabs.harvard.edu/abs/2025arXiv250323595B}, - archiveprefix = {arXiv}, - author = {{Bartz-Beielstein}, Thomas}, - date-added = {2025-04-27 09:20:54 +0200}, - date-modified = {2025-04-27 09:21:19 +0200}, - doi = {10.48550/arXiv.2503.23595}, - eid = {arXiv:2503.23595}, - eprint = {2503.23595}, - journal = {arXiv e-prints}, - keywords = {Optimization and Control, Machine Learning, Applications, 90C26, I.2.6; G.1.6}, - month = mar, - pages = {arXiv:2503.23595}, - primaryclass = {math.OC}, - title = {{Multi-Objective Optimization and Hyperparameter Tuning With Desirability Functions}}, - year = 2025, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECguLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9iYXJ0MjVhYXJ4aXYucGRmTxEEHGJvb2scBAAAAAAFEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AgAABQAAAAEBAABVc2VycwAAAAUAAAABAQAAYmFydHoAAAAGAAAAAQEAAHNjaWVibwAACgAAAAEBAABXZWJzdG9yZS5kAAAQAAAAAQEAAGJhcnQyNWFhcnhpdi5wZGYUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAALaKHwAAAAAACAAAAAQDAAAt6zIAAAAAAAgAAAAEAwAAQ9lQBwAAAAAUAAAAAQYAAHwAAACMAAAAnAAAAKwAAAC8AAAACAAAAAAEAABBxyZXjH/hvxgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHWNHAAAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA4QAAAAECAAAzZmMzOTlkNTYxOGJjM2YwMjgyNDI0ZWFmNzFmYWYyMDk3OTQxODczYjRlMjUwNjFlYTVmZjM2NjdkMjc1NzZhOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMTI7MDAwMDAwMDAwNzUwZDk0MzswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvYmFydDI1YWFyeGl2LnBkZgAAAAAvAAAAAQEAAE5TVVJMQm9va21hcmtRdWFyYW50aW5lTW91bnRlZE5ldHdvcmtWb2x1bWVzS2V5ANgAAAD+////AQAAAAAAAAARAAAABBAAAGAAAAAAAAAABRAAAMwAAAAAAAAAEBAAAPgAAAAAAAAAQBAAAOgAAAAAAAAAAiAAAMQBAAAAAAAABSAAADQBAAAAAAAAECAAAEQBAAAAAAAAESAAAHgBAAAAAAAAEiAAAFgBAAAAAAAAEyAAAGgBAAAAAAAAICAAAKQBAAAAAAAAMCAAANABAAAAAAAAAcAAABgBAAAAAAAAEcAAABQAAAAAAAAAEsAAACgBAAAAAAAAgPAAANgBAAAAAAAAxAIAgNABAAAAAAAAAAgADQAaACMATgAAAAAAAAIBAAAAAAAAAAUAAAAAAAAAAAAAAAAAAARu}, - bdsk-url-1 = {https://doi.org/10.48550/arXiv.2503.23595}} - - -@inproceedings{bart25b, - abstract = {The desirability function approach is an established and widely adopted method in industry for optimizing multiple response processes. It is seldomly used in multi-criteria hyperparameter tuning. This article fills this gap. It provides an introduction to the desirability function approach to multi-objective optimization (direct and surrogate model-based), and multi-objective hyperparameter tuning. This work is based on the paper by Kuhn. It presents a Python implementation of Kuhn's R package desirability. After the desirability-function approach is introduced, two examples are given that demonstrate how to use desirability functions for classical optimization via response surface modeling and hyperparameter tuning of a neural network, which is implemented in PyTorch. The article discusses the following research questions: (a) How can the desirability function approach be used for multiobjective optimization and hyperparameter tuning? (b) What are advantages and disadvantages of the desirability function approach compared to other multi-objective optimization methods? (c) How can the desirability function approach be improved?}, - address = {New York, NY, USA}, - author = {Bartz-Beielstein, Thomas}, - booktitle = {Proceedings of the Genetic and Evolutionary Computation Conference Companion}, - date-added = {2025-08-13 13:07:16 +0200}, - date-modified = {2025-08-13 13:07:34 +0200}, - doi = {10.1145/3712255.3734331}, - isbn = {9798400714641}, - keywords = {desirability functions, multi-objective optimization, surrogate model optimization, hyperparameter tuning, sequential parameter optimization, Bayesian optimization, design space exploration, neural network optimization}, - location = {NH Malaga Hotel, Malaga, Spain}, - numpages = {8}, - pages = {2458--2465}, - publisher = {Association for Computing Machinery}, - series = {GECCO '25 Companion}, - title = {Surrogate Model-Based Multi-Objective Optimization Using Desirability Functions}, - url = {https://doi.org/10.1145/3712255.3734331}, - year = {2025}, -} - - -@article{bart25a, - adsnote = {Provided by the SAO/NASA Astrophysics Data System}, - adsurl = {https://ui.adsabs.harvard.edu/abs/2025arXiv250323595B}, - archiveprefix = {arXiv}, - author = {{Bartz-Beielstein}, Thomas}, - date-added = {2025-04-27 09:20:54 +0200}, - date-modified = {2025-04-27 09:21:19 +0200}, - doi = {10.48550/arXiv.2503.23595}, - eid = {arXiv:2503.23595}, - eprint = {2503.23595}, - journal = {arXiv e-prints}, - keywords = {Optimization and Control, Machine Learning, Applications, 90C26, I.2.6; G.1.6}, - month = mar, - pages = {arXiv:2503.23595}, - primaryclass = {math.OC}, - title = {{Multi-Objective Optimization and Hyperparameter Tuning With Desirability Functions}}, - year = 2025, - note = {v2 submitted 25 December, 2025} -} -@techreport{kuhn25a, - author = {Kuhn, Max}, - doi = {10.32614/CRAN.package.desirability2}, - title = {desirability2: Desirability Functions for Multiparameter Optimization}, - year = {2025}, - note = {https://cran.r-project.org/package=desirability2} -} - -@article{john90a, - abstract = {Beginning with an arbitrary set and a distance defined on it, we develop the notions of minimax and maximin distance sets (designs). These are intended for use in the selection-of-sites problem when the underlying surface is modeled by a prior distribution and observations are made without error. It is shown that such designs have quite general asymptotically optimum (and dual) characteristics under what are termed the G- and D-criteria. There are many examples given, dealing espeacially with the unit square and with k factors at two levels.}, - author = {M.E. Johnson and L.M. Moore and D. Ylvisaker}, - date-added = {2025-05-18 13:30:25 +0200}, - date-modified = {2025-05-18 13:30:34 +0200}, - doi = {https://doi.org/10.1016/0378-3758(90)90122-B}, - issn = {0378-3758}, - journal = {Journal of Statistical Planning and Inference}, - keywords = {Bayesian design, asymptotic optimality, computer experiments}, - number = {2}, - pages = {131-148}, - title = {Minimax and maximin distance designs}, - url = {https://www.sciencedirect.com/science/article/pii/037837589090122B}, - volume = {26}, - year = {1990}, - bdsk-url-1 = {https://www.sciencedirect.com/science/article/pii/037837589090122B}, - bdsk-url-2 = {https://doi.org/10.1016/0378-3758(90)90122-B}} - - -@article{anto10b, - abstract = {Journal of Statistical Planning and Inference, 140 + (2013) 2607-2617. doi:10.1016/j.jspi.2010.03.027}, - author = {Antognini, Alessandro Baldi and Zagoraiou, Maroussa}, - date-added = {2016-10-30 11:44:52 +0000}, - date-modified = {2026-03-27 09:41:17 +0100}, - doi = {10.1016/j.jspi.2010.03.027}, - groups = {bart16n}, - journal = {Journal of Statistical Planning and Inference}, - keywords = {Bart16n}, - language = {English}, - local-url = {file://localhost/Users/bartz/Library/Mobile%20Documents/com~apple~CloudDocs/Papers3.d/Papers%20Library/Files/83/83BDBDD6-67FB-4F85-85B2-52190EF36411.pdf}, - month = sep, - number = {9}, - pages = {2607--2617}, - publisher = {Elsevier}, - rating = {0}, - title = {{Exact optimal designs for computer experiments via Kriging metamodelling}}, - url = {http://dx.doi.org/10.1016/j.jspi.2010.03.027}, - volume = {140}, - year = {2010}, - } - - @misc{wiki25a, - author = "{Wikipedia contributors}", - title = "Poppy-seed bagel theorem --- {Wikipedia}{,} The Free Encyclopedia", - year = "2025", - howpublished = "\url{https://en.wikipedia.org/w/index.php?title=Poppy-seed_bagel_theorem&oldid=1317368789}", - note = "[Online; accessed 28-March-2026]" - } - - -@article{jones98a, - author = {Jones, Donald R. and Schonlau, Matthias and Welch, William J.}, - journal = {Journal of Global Optimization}, - number = {4}, - pages = {455--492}, - title = {{Efficient Global Optimization of Expensive Black-Box Functions}}, - volume = {13}, - year = {1998}, - doi = {10.1023/A:1008306431147} -} - - -@inproceedings{akib19a, - author = {Akiba, Takuya and Sano, Shotaro and Yanase, Toshihiko and Ohta, Takeru and Koyama, Masanori}, - booktitle = {Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery \& Data Mining}, - pages = {2623--2631}, - title = {{Optuna: A Next-generation Hyperparameter Optimization Framework}}, - year = {2019}, - doi = {10.1145/3292500.3330701} -} - - -@inproceedings{liaw18a, - author = {Liaw, Richard and Liang, Eric and Nishihara, Robert and Moritz, Philipp and Fox, Roy and Goldberg, Ken}, - booktitle = {ICML AutoML Workshop}, - title = {{Tune: A Research Platform for Distributed Model Selection and Training}}, - year = {2018}, - url = {https://arxiv.org/abs/1807.05118} -} - - -@inproceedings{falk18a, - author = {Falkner, Stefan and Klein, Aaron and Hutter, Frank}, - booktitle = {Proceedings of the 35th International Conference on Machine Learning}, - pages = {1437--1446}, - title = {{BOHB: Robust and Efficient Hyperparameter Optimization at Scale}}, - year = {2018} -} - - -@inproceedings{hutt11a, - author = {Hutter, Frank and Hoos, Holger H. and Leyton-Brown, Kevin}, - booktitle = {Learning and Intelligent Optimization (LION 5)}, - pages = {507--523}, - publisher = {Springer}, - title = {{Sequential Model-based Algorithm Configuration}}, - year = {2011}, - doi = {10.1007/978-3-642-25566-3_40} -} - - -@inproceedings{berg11a, - author = {Bergstra, James and Bardenet, R{\'e}mi and Bengio, Yoshua and K{\'e}gl, Bal{\'a}zs}, - booktitle = {Advances in Neural Information Processing Systems}, - title = {{Algorithms for Hyper-Parameter Optimization}}, - volume = {24}, - year = {2011} -} - - -@incollection{Hutt09a, - abstract = {This work experimentally investigates model-based approaches for opti- mizing the performance of parameterized randomized algorithms. Such approaches build a response surface model and use this model for finding good parameter set- tings of the given algorithm. We evaluated two methods from the literature that are based on Gaussian process models: sequential parameter optimization (SPO) (Bartz-Beielstein et al. 2005) and sequential Kriging optimization (SKO) (Huang et al. 2006). SPO performed better ``out-of-the-box,'' whereas SKO was competitive when response values were log transformed. We then investigated key design de- cisions within the SPO paradigm, characterizing the performance consequences of each. Based on these findings, we propose a new version of SPO, dubbed SPO+, which extends SPO with a novel intensification procedure and a log-transformed objective function. In a domain for which performance results for other (model- free) parameter optimization approaches are available, we demonstrate that SPO+ achieves state-of-the-art performance. Finally, we compare this automated param- eter tuning approach to an interactive, manual process that makes use of classical regression techniques. This interactive approach is particularly useful when only a relatively small number of parameter configurations can be evaluated. Because it can relatively quickly draw attention to important parameters and parameter interactions, it can help experts gain insights into the parameter response of a given algorithm and identify reasonable parameter settings. }, - address = {Berlin, Heidelberg, New York}, - author = {Hutter, Frank and Bartz-Beielstein, Thomas and Hoos, Holger and Leyton-Brown, Kevin and Murphy, Kevin P}, - booktitle = {Experimental Methods for the Analysis of Optimization Algorithms}, - date-added = {2015-11-29T01:40:47GMT}, - date-modified = {2019-08-06 21:58:24 +0200}, - editor = {Bartz-Beielstein, Thomas and Chiarandini, Marco and Paquete, Luis and Preuss, Mike}, - keywords = {bartzPublic, nonfree, Bart19g}, - pages = {361--414}, - publisher = {Springer}, - rating = {0}, - title = {{Sequential Model-Based Parameter Optimisation: an Experimental Investigation of Automated and Interactive Approaches}}, - year = {2010}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9odXR0MDlhLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAABodXR0MDlhLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAA10ksEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBto+roAAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAABjNGI5ZmU3NWExNDQ3OWQ5MzY4NjA3MjMzYzNhMDU4NTZjY2M1ZGFlYzEzNjEyNjJhZDdjZDJjOGRiYjViZDBlOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNDlkNzswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvaHV0dDA5YS5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}} - - -@inbook{Gent18a, - abstract = {Mixed-discrete optimization deals with mathematical optimization problems with multiple types of variables: discrete (nominal) taking values from a not-sortable set of possible elements, integer variables and variables taking values in a continuous domain. Mixed-discrete problems appear naturally in many contexts such as in the real world in the engineering domain, bioinformatics and data sciences, and this has led to an increased interest in the design of strong algorithms for different variants of the problem. Much effort has been spent over the last decades in studying and developing new methodologies, but unfortunately mixed-discrete optimization problems are much less understood then their ``non-mixed'' counterparts. In this chapter we will focus on the rather new approaches to handle mixed-discrete problems by means of surrogate methods.}, - address = {Cham}, - author = {Gentile, Lorenzo and Bartz-Beielstein, Thomas and Zaefferer, Martin}, - booktitle = {Optimization Under Uncertainty with Applications to Aerospace Engineering}, - date-added = {2021-07-20 13:43:14 +0200}, - date-modified = {2021-07-20 13:43:36 +0200}, - doi = {10.1007/978-3-030-60166-9_10}, - editor = {Vasile, Massimiliano}, - isbn = {978-3-030-60166-9}, - keywords = {bartzPublic}, - pages = {333--355}, - publisher = {Springer International Publishing}, - title = {Sequential Parameter Optimization for Mixed-Discrete Problems}, - url = {https://doi.org/10.1007/978-3-030-60166-9_10}, - year = {2021}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfEC4uLi8uLi9zY2llYm8vV2Vic3RvcmUuZC80NTg1OThfMV9Fbl9PbmxpbmUucGRmTxED5GJvb2vkAwAAAAAFEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAgAABQAAAAEBAABVc2VycwAAAAUAAAABAQAAYmFydHoAAAAGAAAAAQEAAHNjaWVibwAACgAAAAEBAABXZWJzdG9yZS5kAAAWAAAAAQEAADQ1ODU5OF8xX0VuX09ubGluZS5wZGYAABQAAAABBgAABAAAABQAAAAkAAAANAAAAEgAAAAIAAAABAMAAGpCAAAAAAAACAAAAAQDAAD+cgAAAAAAAAgAAAAEAwAARn4UEgAAAAAIAAAABAMAAHQvGBIAAAAACAAAAAQDAAD8PiwSAAAAABQAAAABBgAAhAAAAJQAAACkAAAAtAAAAMQAAAAIAAAAAAQAAEHC088XAAAAGAAAAAECAAABAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAIAAAABAMAAAMAAAAAAAAABAAAAAMDAAD1AQAACAAAAAEJAABmaWxlOi8vLwwAAAABAQAATWFjaW50b3NoIEhECAAAAAQDAAAAgNRORgcAAAgAAAAABAAAQcfB0QiAAAAkAAAAAQEAADE1OUZEODg5LTk4OEItNDY0NC05QjI2LURCMzBFN0JDNjEwQhgAAAABAgAAgQAAAAEAAADvEwAAAQAAAAAAAAAAAAAAAQAAAAEBAAAvAAAAAAAAAAEFAADnAAAAAQIAAGI5YmRlNWM3OWQ0NzNiMmJhYWM0ZDNlOGRlMTJlNjJjYjE4ZDAzOWM0NTkxMzBjZjkxOWJlZjA0YzM2NWNkNjY7MDA7MDAwMDAwMDA7MDAwMDAwMDA7MDAwMDAwMDA7MDAwMDAwMDAwMDAwMDAyMDtjb20uYXBwbGUuYXBwLXNhbmRib3gucmVhZC13cml0ZTswMTswMTAwMDAwZTswMDAwMDAwMDEyMmMzZWZjOzAxOy91c2Vycy9iYXJ0ei9zY2llYm8vd2Vic3RvcmUuZC80NTg1OThfMV9lbl9vbmxpbmUucGRmAADMAAAA/v///wEAAAAAAAAAEAAAAAQQAABoAAAAAAAAAAUQAADUAAAAAAAAABAQAAAAAQAAAAAAAEAQAADwAAAAAAAAAAIgAADMAQAAAAAAAAUgAAA8AQAAAAAAABAgAABMAQAAAAAAABEgAACAAQAAAAAAABIgAABgAQAAAAAAABMgAABwAQAAAAAAACAgAACsAQAAAAAAADAgAADYAQAAAAAAAAHAAAAgAQAAAAAAABHAAAAUAAAAAAAAABLAAAAwAQAAAAAAAIDwAADgAQAAAAAAAAAIAA0AGgAjAFQAAAAAAAACAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAEPA==}, - bdsk-file-2 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9nZW50MThhLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAABnZW50MThhLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAACEksEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBwcuC+YAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAAA4MTI3M2NlZDhjNWZlY2ZmM2YwOWJhOWUwZmQ3NDg2YmY5ZDQ2OTQ3YTBjMWU3OTU0NDlmOGY2NmE1ODI1NzViOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNDkwODswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvZ2VudDE4YS5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}, - bdsk-url-1 = {https://doi.org/10.1007/978-3-030-60166-9_10}} - - -@inproceedings{Gent18b, - acmid = {3205574}, - address = {New York, NY, USA}, - author = {Gentile, Lorenzo and Zaefferer, Martin and Giugliano, Dario and Chen, Haofeng and Bartz-Beielstein, Thomas}, - booktitle = {Proceedings of the Genetic and Evolutionary Computation Conference}, - date-added = {2018-11-16 21:49:09 +0100}, - date-modified = {2018-11-16 21:51:27 +0100}, - doi = {10.1145/3205455.3205574}, - isbn = {978-1-4503-5618-3}, - keywords = {finite element methods, multilevel optimization, optimization under uncertainty, parameter optimization, surrogate model based optimization, bartzPublic, nonfree}, - location = {Kyoto, Japan}, - numpages = {8}, - pages = {1238--1245}, - publisher = {ACM}, - series = {GECCO '18}, - title = {Surrogate Assisted Optimization of Particle Reinforced Metal Matrix Composites}, - url = {http://doi.acm.org/10.1145/3205455.3205574}, - year = {2018}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9HZW50MThiLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAABHZW50MThiLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAAKEEsEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBwEMKIoAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAAAwMjE3Y2MyNWQwZTQ5MjI2ZDU4OWI3YmFhZmQ4ZTJlZjliMzFhZGUyZjNlNDUxZDcwNWY0YjJmY2M0MjllMGUyOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNDEyODswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvZ2VudDE4Yi5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}, - bdsk-url-1 = {http://doi.acm.org/10.1145/3205455.3205574}, - bdsk-url-2 = {https://doi.org/10.1145/3205455.3205574}} - - -@inproceedings{Zaef14b, - abstract = {Real-world optimization problems may require time consum- ing and expensive measurements or simulations. Recently, the application of surrogate model-based approaches was extended from continuous to combinatorial spaces. This ex- tension is based on the utilization of suitable distance mea- sures like Hamming or Swap Distance. In this work, such an extension is implemented for Kriging (Gaussian Process) models. Kriging provides a measure of uncertainty when determining predictions. This can be harnessed to calculate the Expected Improvement (EI) of a candidate solution. In continuous optimization, EI is used in the Efficient Global Optimization (EGO) approach to balance exploitation and exploration for expensive optimization problems. Employ- ing the extended Kriging model, we show for the first time that EGO can successfully be applied to combinatorial optimization problems. We describe necessary adaptations and arising issues as well as experimental results on several test problems. All surrogate models are optimized with a Ge- netic Algorithm (GA). To yield a comprehensive compar- ison, EGO and Kriging based approaches are compared to an earlier suggested Radial Basis Function Network, a linear modeling approach, as well as model-free optimization with random search and GA. EGO clearly outperforms the com- peting approaches on most of the tested problem instances.}, - author = {Zaefferer, Martin and Stork, J{\"o}rg and Friese, Martina and Fischbach, Andreas and Naujoks, Boris and Bartz-Beielstein, Thomas}, - booktitle = {Genetic and Evolutionary Computation Conference (GECCO'14), Proceedings}, - date-added = {2016-08-19T14:05:36GMT}, - date-modified = {2017-03-07 09:26:05 +0000}, - doi = {http://doi.acm.org/10.1145/2576768.2598282}, - editor = {Arnold, Dirk V}, - keywords = {bartzPublic, nonfree}, - pages = {871--878}, - publisher = {ACM}, - rating = {0}, - title = {{Efficient Global Optimization for Combinatorial Problems}}, - year = {2014}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC96YWVmMTRiLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAAB6YWVmMTRiLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAAjFEsEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBuOCSIAAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAAA1NDI1MDNlNDlmYzM0ZmRkOWUxZmViMDI4NTM1NTM0YThkNTE5OTVkMjk5MGM0ZmY0ZmE4NGRiYjM5NzczNTBmOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNTE4YzswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvemFlZjE0Yi5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}, - bdsk-url-1 = {http://doi.acm.org/10.1145/2576768.2598282}} - - - -@inproceedings{Zaef14c, - abstract = {For expensive black-box optimization problems, surrogate- model based approaches like Efficient Global Optimization are frequently used in continuous optimization. Their main advantage is the reduction of function evaluations by exploiting cheaper, data-driven models of the actual target function. The utilization of such methods in combinatorial or mixed spaces is less common. Efficient Global Optimization and re- lated methods were extended recently to such spaces, by replacing con- tinuous distance (or similarity) measures with measures suited for the respective problem representations. -This article investigates a larg set of distance measures for their applica- bility to various permutation problems. The main purpose is to identify, how a distance measure can be chosen, either a-priori or online. In de- tail, we show that the choice of distance measure can be integrated into the Maximum Likelihood Estimation process of the underlying Kriging model. This approach has robust, good performance, thus providing a very nice tool towards selection of a distance measure.}, - author = {Zaefferer, Martin and Stork, J{\"o}rg and Bartz-Beielstein, Thomas}, - booktitle = {Parallel Problem Solving from Nature--PPSN XIII}, - date-added = {2016-08-19T14:05:26GMT}, - date-modified = {2017-03-07 09:21:41 +0000}, - editor = {Bartz-Beielstein, Thomas and Branke, J{\"u}rgen and Filipic, Bogdan and Smith, Jim}, - keywords = {bartzPublic, nonfree}, - pages = {373--383}, - publisher = {Springer}, - rating = {0}, - title = {{Distance Measures for Permutations in Combinatorial Efficient Global Optimization}}, - year = {2014}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC96YWVmMTRjLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAAB6YWVmMTRjLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAAjVEsEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBuOi0swAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAABmYmFkOGM2ZmIzYWU2M2M2Nzc1OWM5ZDA3MTUwZmIxM2Q4MzQ2YTBhYWE1YTE3NDE0YmMwYjgxOTExOGExNTQxOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNTE4ZDswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvemFlZjE0Yy5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}} - - - -@incollection{Zaef16b, - abstract = {Kernel based surrogate models like Kriging are a popular remedy for costly objective function evaluations in optimization. Often, kernels are required to be definite. Highly customized kernels, or kernels for combinatorial representations, may be indefinite. This study investi- gates this issue in the context of Kriging. It is shown that approaches from the field of Support Vector Machines are useful starting points, but require further modifications to work with Kriging. This study compares a broad selection of methods for dealing with indefinite kernels in Krig- ing and Kriging-based E cient Global Optimization, including spectrum transformation, feature embedding and computation of the nearest defi- nite matrix. Model quality and optimization performance are tested. The standard, without explicitly correcting indefinite matrices, yields func- tional results, which are further improved by spectrum transformations.}, - address = {Cham}, - author = {Zaefferer, Martin and Bartz-Beielstein, Thomas}, - booktitle = {Parallel Problem Solving from Nature -- PPSN XIV: 14th International Conference, Edinburgh, UK, September 17-21, 2016, Proceedings}, - date-added = {2017-02-14 11:35:11 +0000}, - date-modified = {2019-05-12 12:12:26 +0200}, - doi = {10.1007/978-3-319-45823-6_7}, - editor = {Handl, Julia and Hart, Emma and Lewis, Peter R. and L{\'o}pez-Ib{\'a}{\~{n}}ez, Manuel and Ochoa, Gabriela and Paechter, Ben}, - isbn = {978-3-319-45823-6}, - keywords = {bartzPublic, nonfree, bart16n}, - pages = {69-79}, - publisher = {Springer International Publishing}, - title = {Efficient Global Optimization with Indefinite Kernels}, - url = {http://dx.doi.org/10.1007/978-3-319-45823-6_7}, - year = {2016}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC96YWVmMTZiLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAAB6YWVmMTZiLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAAkVEsEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBvY7WtgAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAAAwYThjOTE0YWRmNzhlZGM4MzAyMDg2YjBiOTU4Yzg3OTM1ZjhlZTNhMDZkMzg0Yjg3OWM2MDE0MDU2NDEwNTIyOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNTE5MTswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvemFlZjE2Yi5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}, - bdsk-url-1 = {http://dx.doi.org/10.1007/978-3-319-45823-6_7}} - - -@article{Bart16n, - abstract = {Abstract The use of surrogate models is a standard method for dealing with complex real-world optimization problems. The first surrogate models were applied to continuous optimization problems. In recent years, surrogate models gained importance for discrete optimization problems. This article takes this development into consideration. The first part presents a survey of model-based methods, focusing on continuous optimization. It introduces a taxonomy, which is useful as a guideline for selecting adequate model-based optimization tools. The second part examines discrete optimization problems. Here, six strategies for dealing with discrete data structures are introduced. A new approach for combining surrogate information via stacking is proposed in the third part. The implementation of this approach will be available in the open source R package SPOT2. The article concludes with a discussion of recent developments and challenges in continuous and discrete application domains. }, - author = {Thomas Bartz-Beielstein and Martin Zaefferer}, - date-added = {2017-02-22 10:05:10 +0000}, - date-modified = {2017-11-22 09:19:31 +0000}, - doi = {10.1016/j.asoc.2017.01.039}, - issn = {1568-4946}, - journal = {Applied Soft Computing}, - keywords = {Evolutionary computation, owos, frie17a, bartzPublic, nonfree}, - pages = {154 - 167}, - title = {Model-based methods for continuous and discrete global optimization}, - url = {http://www.sciencedirect.com/science/article/pii/S1568494617300546}, - volume = {55}, - year = {2017}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECsuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9iYXJ0MTZuRWxzZXZpZXIucGRmTxED3GJvb2vcAwAAAAAFEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAgAABQAAAAEBAABVc2VycwAAAAUAAAABAQAAYmFydHoAAAAGAAAAAQEAAHNjaWVibwAACgAAAAEBAABXZWJzdG9yZS5kAAATAAAAAQEAAGJhcnQxNm5FbHNldmllci5wZGYAFAAAAAEGAAAEAAAAFAAAACQAAAA0AAAASAAAAAgAAAAEAwAAakIAAAAAAAAIAAAABAMAAP5yAAAAAAAACAAAAAQDAABGfhQSAAAAAAgAAAAEAwAAdC8YEgAAAAAIAAAABAMAAGxGLBIAAAAAFAAAAAEGAACAAAAAkAAAAKAAAACwAAAAwAAAAAgAAAAABAAAQb7cbM4AAAAYAAAAAQIAAAEAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAgAAAAEAwAAAwAAAAAAAAAEAAAAAwMAAPUBAAAIAAAAAQkAAGZpbGU6Ly8vDAAAAAEBAABNYWNpbnRvc2ggSEQIAAAABAMAAACA1E5GBwAACAAAAAAEAABBx8HRCIAAACQAAAABAQAAMTU5RkQ4ODktOTg4Qi00NjQ0LTlCMjYtREIzMEU3QkM2MTBCGAAAAAECAACBAAAAAQAAAO8TAAABAAAAAAAAAAAAAAABAAAAAQEAAC8AAAAAAAAAAQUAAOQAAAABAgAAMmI3ZmE1ZTRlMWYzMTc4YTA4MDhhYjZhMTJjZjk3OWJkMjY3ZTI1NDdjZDM0NTczYjg1YTdlYjliM2MxYWJlNDswMDswMDAwMDAwMDswMDAwMDAwMDswMDAwMDAwMDswMDAwMDAwMDAwMDAwMDIwO2NvbS5hcHBsZS5hcHAtc2FuZGJveC5yZWFkLXdyaXRlOzAxOzAxMDAwMDBlOzAwMDAwMDAwMTIyYzQ2NmM7MDE7L3VzZXJzL2JhcnR6L3NjaWViby93ZWJzdG9yZS5kL2JhcnQxNm5lbHNldmllci5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAZAAAAAAAAAAFEAAA0AAAAAAAAAAQEAAA/AAAAAAAAABAEAAA7AAAAAAAAAACIAAAyAEAAAAAAAAFIAAAOAEAAAAAAAAQIAAASAEAAAAAAAARIAAAfAEAAAAAAAASIAAAXAEAAAAAAAATIAAAbAEAAAAAAAAgIAAAqAEAAAAAAAAwIAAA1AEAAAAAAAABwAAAHAEAAAAAAAARwAAAFAAAAAAAAAASwAAALAEAAAAAAACA8AAA3AEAAAAAAAAACAANABoAIwBRAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABDE=}, - bdsk-url-1 = {http://www.sciencedirect.com/science/article/pii/S1568494617300546}, - bdsk-url-2 = {http://dx.doi.org/10.1016/j.asoc.2017.01.039}} - - -@misc{gram22a, - archiveprefix = {arXiv}, - author = {Robert B. Gramacy and Annie Sauer and Nathan Wycoff}, - date-added = {2025-11-06 14:09:53 +0100}, - date-modified = {2025-11-06 14:10:02 +0100}, - eprint = {2112.07457}, - primaryclass = {stat.CO}, - title = {Triangulation candidates for Bayesian optimization}, - url = {https://arxiv.org/abs/2112.07457}, - year = {2022}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9ncmFtMjJhLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAABncmFtMjJhLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAAQ0ksEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBx15q4YAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAAA3ZWM3ZThlY2U2NmYyMTJmYjVmMDU5OTJhOWFiMjBhNDEwZjM5NGQ3NTMyNmQ4OGU4ZjcxNWRmMTFkMjBkMGE5OzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNDk0MzswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvZ3JhbTIyYS5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}, - bdsk-url-1 = {https://arxiv.org/abs/2112.07457}} - - -@inproceedings{Stor96a, - abstract = {Differential evolution (DE) has recently proven to be an efficient method for optimizing real-valued multi-modal objective functions. Besides its good convergence properties and suitability for parallelization, DE's main assets are its conceptual simplicity and ease of use. This paper describes several variants of DE and elaborates on the choice of DE's control parameters, which corresponds to the application of fuzzy rules. Finally, the design of a howling removal unit with DE is described to provide a real-world example for DE's applicability}, - author = {Storn, R}, - booktitle = {Fuzzy Information Processing Society, 1996. NAFIPS., 1996 Biennial Conference of the North American}, - date-added = {2015-11-29T01:35:00GMT}, - date-modified = {2015-11-29T01:36:22GMT}, - doi = {10.1109/NAFIPS.1996.534789}, - isbn = {0-7803-3225-3}, - pages = {519--523}, - publisher = {IEEE}, - rating = {0}, - title = {{On the usage of differential evolution for function optimization}}, - uri = {\url{papers3://publication/doi/10.1109/NAFIPS.1996.534789}}, - url = {http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=534789}, - year = {1996}, - bdsk-url-1 = {http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=534789}, - bdsk-url-2 = {http://dx.doi.org/10.1109/NAFIPS.1996.534789}} - - -@book{Chen10a, - author = {Chen, Chun Hung}, - date-added = {2015-11-29T01:35:45GMT}, - date-modified = {2015-11-29T01:37:01GMT}, - publisher = {World Scientific}, - rating = {0}, - title = {{Stochastic simulation optimization: an optimal computing budget allocation}}, - uri = {\url{papers3://publication/uuid/B91C0D48-83FB-4575-8494-4698115D93A1}}, - year = {2010}} - - -@article{Jone98a, - author = {Jones, D R and Schonlau, M and Welch, W J}, - date-added = {2016-10-30 11:44:52 +0000}, - date-modified = {2016-10-30 11:47:52 +0000}, - groups = {bart16n}, - journal = {Journal of Global Optimization}, - keywords = {Bart16n}, - pages = {455--492}, - rating = {0}, - title = {{Efficient Global Optimization of Expensive Black-Box Functions}}, - uri = {\url{papers3://publication/uuid/B2B0A4D9-9A56-49F0-9629-0FCEF001239B}}, - volume = {13}, - year = {1998}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhYYm9va21hcmtfECMuLi8uLi9zY2llYm8vV2Vic3RvcmUuZC9qb25lOThhLnBkZk8RA8xib29rzAMAAAAABRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAIAAAUAAAABAQAAVXNlcnMAAAAFAAAAAQEAAGJhcnR6AAAABgAAAAEBAABzY2llYm8AAAoAAAABAQAAV2Vic3RvcmUuZAAACwAAAAEBAABqb25lOThhLnBkZgAUAAAAAQYAAAQAAAAUAAAAJAAAADQAAABIAAAACAAAAAQDAABqQgAAAAAAAAgAAAAEAwAA/nIAAAAAAAAIAAAABAMAAEZ+FBIAAAAACAAAAAQDAAB0LxgSAAAAAAgAAAAEAwAAMUosEgAAAAAUAAAAAQYAAHgAAACIAAAAmAAAAKgAAAC4AAAACAAAAAAEAABBwN46noAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAIDUTkYHAAAIAAAAAAQAAEHHwdEIgAAAJAAAAAEBAAAxNTlGRDg4OS05ODhCLTQ2NDQtOUIyNi1EQjMwRTdCQzYxMEIYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAA3AAAAAECAAAzYjlhMGQyZjY0MTViMjhkMjA2MmMxZTc1NTIxYzNlZTNiM2NlMGY4MGU2MjEyMzUxZDY5MGI0ZDNjOTA1NjkyOzAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwOzAwMDAwMDAwMDAwMDAwMjA7Y29tLmFwcGxlLmFwcC1zYW5kYm94LnJlYWQtd3JpdGU7MDE7MDEwMDAwMGU7MDAwMDAwMDAxMjJjNGEzMTswMTsvdXNlcnMvYmFydHovc2NpZWJvL3dlYnN0b3JlLmQvam9uZTk4YS5wZGYAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAXAAAAAAAAAAFEAAAyAAAAAAAAAAQEAAA9AAAAAAAAABAEAAA5AAAAAAAAAACIAAAwAEAAAAAAAAFIAAAMAEAAAAAAAAQIAAAQAEAAAAAAAARIAAAdAEAAAAAAAASIAAAVAEAAAAAAAATIAAAZAEAAAAAAAAgIAAAoAEAAAAAAAAwIAAAzAEAAAAAAAABwAAAFAEAAAAAAAARwAAAFAAAAAAAAAASwAAAJAEAAAAAAACA8AAA1AEAAAAAAAAACAANABoAIwBJAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAABBk=}} - -@inproceedings{bala20a, - author = {Balandat, Maximilian and Karrer, Brian and Jiang, Daniel R. and Daulton, Samuel and Letham, Benjamin and Wilson, Andrew Gordon and Bakshy, Eytan}, - booktitle = {Advances in Neural Information Processing Systems 33}, - title = {{BoTorch: A Framework for Efficient Monte-Carlo Bayesian Optimization}}, - year = {2020}, - url = {https://arxiv.org/abs/1910.06403} -} - - -@book{Gram20a, - author = {Gramacy, Robert B}, - date-added = {2021-01-04 19:34:25 +0100}, - date-modified = {2021-01-04 19:35:01 +0100}, - publisher = {{CRC} press}, - title = {Surrogates}, - year = {2020}, - bdsk-file-1 = {YnBsaXN0MDDSAQIDBFxyZWxhdGl2ZVBhdGhZYWxpYXNEYXRhXxAjLi4vLi4vc2NpZWJvL1dlYnN0b3JlLmQvZ3JhbTIwYS5wZGZPEQFMAAAAAAFMAAIAAAxNYWNpbnRvc2ggSEQAAAAAAAAAAAAAAAAAAAAAAAAAQkQAAf////8LZ3JhbTIwYS5wZGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAACAAMAAAogY3UAAAAAAAAAAAAAAAAACldlYnN0b3JlLmQAAgArLzpVc2VyczpiYXJ0ejpzY2llYm86V2Vic3RvcmUuZDpncmFtMjBhLnBkZgAADgAYAAsAZwByAGEAbQAyADAAYQAuAHAAZABmAA8AGgAMAE0AYQBjAGkAbgB0AG8AcwBoACAASABEABIAKVVzZXJzL2JhcnR6L3NjaWViby9XZWJzdG9yZS5kL2dyYW0yMGEucGRmAAATAAEvAAAVAAIADP//AAAACAANABoAJABKAAAAAAAAAgEAAAAAAAAABQAAAAAAAAAAAAAAAAAAAZo=}} diff --git a/bart26g/index.qmd b/bart26g/index.qmd deleted file mode 100644 index 79122080..00000000 --- a/bart26g/index.qmd +++ /dev/null @@ -1,899 +0,0 @@ ---- -title: Optimization with SpotOptim -authors: - - name: Thomas Bartz-Beielstein - affiliations: - - name: Bartz & Bartz GmbH, 51643 Gummersbach, Germany - orcid: 0000-0002-5938-5158 - email: bartzbeielstein@gmail.com - url: https://www.spotseven.de - corresponding: true - roles: writing, conceptualization, supervision -runninghead: "SpotOptim" -abstract: | - The `spotoptim` package implements surrogate-model-based optimization of expensive black-box functions in Python. Building on two decades of Sequential Parameter Optimization (SPO) methodology, it provides a Kriging-based optimization loop with Expected Improvement, support for continuous, integer, and categorical variables, noise-aware evaluation via Optimal Computing Budget Allocation (OCBA), and multi-objective extensions. A steady-state parallelization strategy overlaps surrogate search with objective evaluation on multi-core hardware, and a success-rate-based restart mechanism detects stagnation while preserving the best solution found. The package returns scipy-compatible `OptimizeResult` objects and accepts any scikit-learn-compatible surrogate model. Built-in TensorBoard logging provides real-time monitoring of convergence and surrogate quality. This report describes the architecture and module structure of spotoptim, provides worked examples including neural network hyperparameter tuning, and compares the framework with BoTorch, Optuna, Ray Tune, BOHB, SMAC, and Hyperopt. The package is open-source (AGPL-3.0). - - \textbf{Keywords:} Surrogate modeling, Sequential parameter optimization, Bayesian optimization, Hyperparameter tuning, Kriging -jupyter: spotoptim -echo: true -header-includes: | - \usepackage{dirtree} - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},fontsize=\small} -format: - arxiv-pdf: - keep-tex: true - mainfont: "TeX Gyre Termes" - mathfont: "TeX Gyre Termes Math" - number-sections: true - toc: false - classoption: - - twocolumn ---- - -# Introduction {#sec-introduction} - -Problems in engineering, simulation, and machine and deep learning (or generally in artificial intelligence) require the optimization of functions that are expensive to evaluate. Training a deep neural network to convergence, running a computational fluid dynamics simulation, or evaluating a reinforcement learning policy may take minutes to hours per function call, making exhaustive search impractical. Surrogate-model-based optimization addresses this challenge by constructing a cheap statistical approximation of the objective function and using it to guide the search toward promising regions of the parameter space [@Forr08a; @Gram20a]. -Sequential Parameter Optimization (SPO) was introduced by @BLP05 as a principled framework for tuning the parameters of metaheuristic algorithms. Rather than relying on default settings or ad-hoc parameter sweeps, SPO fits a Kriging (Gaussian process) model to the observed function evaluations, selects the next evaluation point by optimizing an acquisition function such as Expected Improvement (EI) [@jones98a], and iterates until the evaluation budget is exhausted. This approach generalizes the Efficient Global Optimization algorithm [@Jone98a] to a broader class of tuning and optimization problems, including noisy objectives and mixed variable types. - -The SPO methodology has been implemented in several software packages over the past two decades. The original R package SPOT, which was available on the Comprehensive R Archive Network (CRAN)^[\url{https://cran.r-project.org/web/packages/SPOT/index.html}], provided the first publicly available implementation and was used extensively in the companion volume "Hyperparameter Tuning for Machine and Deep Learning with R" [@bart21i]^[With more than 150k accesses, it is one of the most popular publications in the field. See \url{https://link.springer.com/book/10.1007/978-981-19-5170-1}.]. An overview of the SPOT methodology and its R implementation is given by @bart21b. The R package was subsequently ported to Python as SpotPython, which extended the framework with PyTorch integration and a hyperparameter tuning cookbook [@bart23iArXiv]. The `spotoptim` package^[\url{https://github.com/sequential-parameter-optimization/spotoptim}] is the current generation of this lineage. It is a complete rewrite that preserves the core SPO algorithm while modernizing the architecture, improving extensibility, and integrating with the Python scientific computing ecosystem. -The package is part of a family of related tools. Together, these packages form an ecosystem for optimization-driven scientific computing research and practice. - -The contributions of this report are threefold. -First, it positions spotoptim within the landscape of hyperparameter optimization frameworks by comparing it with BoTorch, Optuna, Ray Tune, BOHB, SMAC, and Hyperopt (@sec-related). -Second, it provides a comprehensive description of the `spotoptim` architecture, covering the optimization algorithm, surrogate models, acquisition functions, and supporting modules (@sec-algorithm through @sec-modules). Third, it presents worked examples that demonstrate the package API for tasks ranging from simple function optimization to end-to-end neural network hyperparameter tuning (@sec-examples and @sec-hpt). - -The remainder of this report is organized as follows. @sec-related reviews related work and competing frameworks. @sec-examples introduces the package through three progressively complex examples. @sec-algorithm describes the SPO algorithm as implemented in `spotoptim`. @sec-modules details each module of the package. @sec-hpt presents an end-to-end hyperparameter tuning workflow. @sec-outlook concludes with a summary. - - -# Related Work {#sec-related} - -Hyperparameter optimization has received sustained attention over the past decade, resulting in several mature software frameworks. These tools differ along multiple axes: the search strategy they employ (random, bandit-based, or model-based), the type of surrogate model they use (if any), their parallelism model (single-machine or distributed), and the interface they present to the user. This section reviews the most widely used frameworks and highlights how SPO, as implemented in `spotoptim`, relates to each of them. - -Hyperopt [@berg11a] introduced Tree-structured Parzen Estimators (TPE) as an alternative to Gaussian-process-based Bayesian optimization. TPE avoids the $\mathcal{O}(n^3)$ cost of fitting a Gaussian process, making it more scalable to large numbers of observations. However, it does not yield a global surrogate model and therefore cannot produce uncertainty estimates or support acquisition functions like Expected Improvement in their standard form. - -Optuna [@akib19a] is a popular hyperparameter optimization framework in the Python ecosystem. It employs a "define-by-run" API in which the search space is specified implicitly through trial suggestions, rather than declared upfront. The default search strategy uses TPE. Optuna also supports Covariance Matrix Adaptation Evolution Strategy (CMA-ES) and provides a pruning mechanism based on successive halving that allows unpromising trials to be terminated early. - -Bayesian Optimization and Hyperband (BOHB) [@falk18a] combines Bayesian optimization with Hyperband, a multi-fidelity method that allocates resources adaptively across trials. The Bayesian component uses TPE as its surrogate, similar to Optuna. BOHB's key contribution is the integration of early stopping into the surrogate-based search, allowing it to discard poorly performing configurations after partial training. This multi-fidelity approach is effective when intermediate performance measures (such as validation loss after a few epochs) are available. In contrast, `spotoptim` treats the objective function as a black box that returns a single scalar per evaluation and does not currently incorporate multi-fidelity scheduling. - -SMAC [@hutt11a] (Sequential Model-based Algorithm Configuration) is the framework most closely related to SPO in its algorithmic philosophy. Like SPO, SMAC iteratively fits a surrogate model and selects new configurations by optimizing an acquisition function. The key difference lies in the choice of surrogate: SMAC uses random forests which handle high-dimensional and categorical parameter spaces well but do not provide the smooth, differentiable uncertainty estimates that Gaussian processes offer. SMAC has its roots in SPO [@Hutt09a]: similar to SPO, it was originally designed for algorithm configuration, where the goal is to find parameter settings that minimize the runtime or solution quality of a target algorithm across a distribution of problem instances. `spotoptim` targets a broader class of optimization problems, including engineering design and simulation-based optimization, and returns scipy-compatible results that integrate directly with the scientific Python ecosystem. - - -Ray Tune [@liaw18a] is a distributed hyperparameter tuning platform built on top of the Ray framework. Rather than implementing a single search strategy, Ray Tune serves as an orchestrator that wraps external search algorithms including Optuna, Hyperopt, and Bayesian optimization libraries. Its primary strength lies in scalable trial scheduling across clusters, making it well-suited for large-scale distributed training. While Ray Tune excels at distributed scheduling, it is not itself a surrogate-based optimizer and delegates the actual search logic to external backends. - -BoTorch [@bala20a] is a PyTorch-based library for Bayesian optimization developed at Meta. -It provides Gaussian process surrogates and enables efficient handling of batch, multi-objective, and constrained settings. BoTorch is designed as a modular research toolkit and assumes familiarity with PyTorch idioms such as tensors, devices, and custom training loops. In contrast, `spotoptim` targets practitioners working within the scipy/scikit-learn ecosystem. - -Several features distinguish SPO and its implementation in `spotoptim` from the frameworks reviewed above. First, `spotoptim` uses Kriging as its default surrogate, providing principled uncertainty quantification through the predictive variance of the Gaussian process. This enables acquisition functions such as Expected Improvement [@jones98a] and Probability of Improvement with a sound statistical foundation. Second, the package returns scipy-compatible `OptimizeResult` objects, allowing results to be consumed by any tool in the scipy ecosystem without conversion. Third, `spotoptim` natively supports mixed variable types (continuous, integer, and categorical) with appropriate handling within the surrogate model. Fourth, noisy objectives are handled through built-in repeated evaluations combined with Optimal Computing Budget Allocation (OCBA) [@Bart11a; @Bart11b], a feature not available in any of the competing frameworks reviewed here. Fifth, multi-objective optimization is supported and scalarization via desirability functions is available [@bart25a; @bart25b]. Finally, the surrogate interface follows the scikit-learn estimator convention (`fit`/`predict`), making it straightforward to substitute Kriging with any compatible model, including scikit-learn's `GaussianProcessRegressor`, random forests, or the package's own neural-network-based `MLPSurrogate`. - - -# Simple Examples {#sec-examples} - -This section introduces the `spotoptim` API through three progressively complex examples. Each example is self-contained and demonstrates a different aspect of the optimization workflow. - -## Minimizing the Sphere Function - -The simplest use case is the optimization of a scalar-valued function over continuous variables. The following code minimizes the sphere function $f(\mathbf{x}) = \sum_{i=1}^d x_i^2$, where $d$ denotes the number of dimensions, in two dimensions: - -```{python} -from spotoptim import SpotOptim -from spotoptim.function import sphere - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=20, - n_initial=10, - seed=0, -) -result = opt.optimize() -print(f"Best value: {result.fun:.6f}") -print(f"Best point: {result.x}") -``` - -Three ingredients are required: a callable `fun` that accepts an $(n, d)$ array (where $n$ is the number of samples to evaluate) and returns an $(n,)$ array, a list of `bounds` as `(lower, upper)` tuples, and an evaluation budget via `max_iter`. The `n_initial` parameter controls how many points are evaluated in the initial Latin Hypercube design before the surrogate-based sequential phase begins. The `optimize()` method returns a `scipy.optimize.OptimizeResult`, which carries the best point (`result.x`), the corresponding objective value (`result.fun`), and the total number of function evaluations (`result.nfev`), among other fields. - -## Expected Improvement with Explicit Kriging - -The default acquisition function is `"y"` (predicted value), which performs pure exploitation by selecting the point where the surrogate predicts the lowest value. For problems with multiple local minima, Expected Improvement (EI) provides a better exploration-exploitation trade-off. EI accounts for both the predicted value and the surrogate's uncertainty: - -$$ -\begin{aligned} -\text{EI}(\mathbf{x}) &= (y_{\min} - \mu(\mathbf{x})) \, \Phi(Z) + \sigma(\mathbf{x}) \, \phi(Z), \\ -Z &= \frac{y_{\min} - \mu(\mathbf{x})}{\sigma(\mathbf{x})} -\end{aligned} -$$ {#eq-ei} - -where $\mu(\mathbf{x})$ and $\sigma(\mathbf{x})$ are the Kriging mean and standard deviation, $y_{\min}$ is the best observed value, and $\Phi$ and $\phi$ are the standard normal cumulative distribution function and probability density function, respectively [@Forr08a]. -```{python} -from spotoptim import SpotOptim -from spotoptim.surrogate import Kriging -from spotoptim.function import rosenbrock - -kriging = Kriging( - method="regression", - noise=1e-3, seed=0, -) - -opt = SpotOptim( - fun=rosenbrock, - bounds=[(-2, 2), (-2, 2)], - surrogate=kriging, - acquisition="ei", - max_iter=25, - n_initial=10, - seed=0, -) -result = opt.optimize() - -print(f"Best value: {result.fun:.6f}") -print(f"Best point: {result.x}") -``` - -Here the Kriging surrogate is constructed explicitly with a noise term for regularization. The `acquisition="ei"` argument switches the infill criterion from predicted value to Expected Improvement. Any surrogate model that supports `predict(X, return_std=True)` can be used with EI and Probability of Improvement, which is also available via the `acquisition="pi"` argument, see @sec-optimizer. - -## Mixed Variable Types - -Many practical optimization problems involve a mixture of continuous, integer, and categorical variables. `spotoptim` handles this natively through the `var_type` parameter: - -```{python} -import numpy as np -from spotoptim import SpotOptim - -def mixed_objective(X): - X = np.atleast_2d(X) - continuous = X[:, 0] - integer_val = X[:, 1] - factor_val = X[:, 2] - return (continuous**2 - + (integer_val - 3)**2 - + factor_val) - -opt = SpotOptim( - fun=mixed_objective, - bounds=[(-5.0, 5.0), (0, 10), (0, 4)], - var_type=["float", "int", "factor"], - var_name=["x_cont", "x_int", "x_cat"], - max_iter=25, - n_initial=10, - seed=0, -) -result = opt.optimize() - -print(f"Best value: {result.fun:.6f}") -print(f"Best point: {result.x}") -``` - -The three supported variable types are `"float"` (continuous), `"int"` (integer-constrained, rounded after surrogate prediction), and `"factor"` (categorical, encoded internally). When `var_type` is omitted, all variables default to `"float"`. - - -# The SPO Algorithm {#sec-algorithm} - -The default optimization loop implemented in `SpotOptim.optimize()` follows the general structure of surrogate-model-based optimization, also known as Bayesian optimization when the surrogate is a Gaussian process [@Gram20a]. The algorithm proceeds in two phases: an initial design phase that builds a preliminary picture of the response surface, and a sequential phase that iteratively refines the surrogate model and proposes new evaluation points. - -In the initial design phase, `n_initial` points are generated according to a space-filling design. The default is a quasi-Monte Carlo Latin Hypercube Sampling (LHS) design (QMC-LHS), which ensures that the marginal distribution of each variable is well-covered. Alternative designs include Sobol sequences, regular grids, uniform random sampling, and clustered designs. The user may also provide a custom initial design via the `X0` argument. All initial points are evaluated on the true objective function, and the results form the initial training set for the surrogate. -In the sequential phase, the algorithm repeats the following steps until the evaluation budget (`max_iter`) or the wall-clock time limit (`max_time`) is reached: - -1. Fit the surrogate model to all observed data $(X, \mathbf{y})$. -2. Optimize the acquisition function over the search space to identify the next candidate point $\mathbf{x}_{\text{new}}$. -3. Evaluate $f(\mathbf{x}_{\text{new}})$ on the true objective. -4. Append the new observation to the data set and update running statistics. - -Three acquisition functions are supported, which are optimized over the search space using one of several methods. When more than one worker is available (`n_jobs > 1`), `spotoptim` switches from the default sequential loop to a steady-state parallelization strategy. In the sequential mode, the surrogate is refitted after every single evaluation; in steady-state mode, surrogate search and objective evaluation overlap asynchronously. A thread pool generates candidate points by optimizing the acquisition function (under a lock that serializes surrogate reads), while a separate executor pool evaluates the objective function in parallel. Candidates are collected into batches of size `eval_batch_size` and dispatched together. As soon as a batch of evaluations returns, the results are incorporated into the data set, the surrogate is refitted, and new search tasks are launched to fill the freed worker slots. This design keeps all workers busy: while one batch is being evaluated, the next batch of candidates is already being generated. -Figure~\ref{fig-steady-state} illustrates this two-phase pipeline. In Phase 1, the initial design points are evaluated in parallel and the surrogate is fitted for the first time. In Phase 2, the steady-state loop checks the evaluation budget, dispatches search tasks to the thread pool, collects candidates into batches, and sends them to the evaluation pool. After each batch completes, the storage is updated, the surrogate is refitted under a lock, and new search tasks fill the freed worker slots. - -```{=latex} -\begin{figure*}[t] -\centering -\includegraphics[width=0.95\textwidth]{steady-state.pdf} -\caption{Steady-state parallelization in \texttt{spotoptim}. Phase~1 evaluates the initial design in parallel and fits the first surrogate. Phase~2 overlaps surrogate search (thread pool) with objective evaluation (process or thread pool) in a steady-state loop until the budget is exhausted. Note, \texttt{Optimize acquisition} is the cheap evaluation on the surrogate, the expensive one is performed in the \texttt{eval\_pool} step.}\label{fig-steady-state} -\end{figure*} -``` - -On standard CPython builds^[With the Global Interpreter Lock (GIL) enabled.], the evaluation pool uses processes (`ProcessPoolExecutor`) so that CPU-bound objective functions achieve true parallelism, while the search pool uses threads to avoid serialization overhead for surrogate access. On free-threaded Python builds^[Python Enhancement Proposal 703, `python3.13t`.], both pools use threads, eliminating `dill` serialization entirely and reducing dispatch latency. The runtime detects the GIL state automatically via `is_gil_disabled()` and selects the appropriate executor. The following example runs a parallel optimization with four workers: - -```{python} -from spotoptim import SpotOptim -from spotoptim.function import sphere - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=50, - n_initial=10, - seed=0, - n_jobs=4, # parallel workers - eval_batch_size=2, # batch size -) -result = opt.optimize() - -print(f"Best value: {result.fun:.6f}") -print(f"Total evaluations: {result.nfev}") -``` - -For noisy objective functions, `spotoptim` supports repeated evaluations at each design point. The surrogate is fitted on the mean values across repeats, reducing the influence of noise. When the noise level varies across the search space, OCBA can be enabled through the `ocba_delta` parameter [@Chen10a]. OCBA allocates additional evaluation budget to the most promising and most uncertain designs, following the theory developed by @Bart11a and @Bart11b. This combination of repeated evaluations and adaptive budget allocation provides a principled approach to noisy optimization that is unique among the frameworks discussed in @sec-related. - -When the optimizer stalls, automatic restarts can help escape local minima. `spotoptim` tracks a rolling success rate that measures the fraction of recent evaluations that improved upon the incumbent best value. A sliding window of size `window_size` records whether each sequential evaluation achieved a new best; the success rate is the number of successes divided by the window length. By default `window_size` is set to `restart_after_n` (or 100 if `restart_after_n` is also unset), so the success rate reflects performance over the full restart horizon. When no improvement has occurred for a full window, the success rate drops to zero, signalling stagnation. -The `restart_after_n` parameter (default 100) specifies how many consecutive iterations with a zero success rate must elapse before a restart is triggered. Upon restart, the optimizer generates a fresh initial design and re-initializes the surrogate. If `restart_inject_best` is `True` (the default), the best solution found so far is injected into the new initial design, preserving accumulated knowledge while allowing the surrogate to explore a different region of the search space. The following example shows how to configure the success-rate-based restart mechanism: - -```{python} -from spotoptim import SpotOptim -from spotoptim.function import sphere - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=20, - n_initial=10, - seed=42, - window_size=5, - restart_after_n=10, - restart_inject_best=True, - verbose=False, -) -result = opt.optimize() - -print(f"Success rate: {opt.success_rate:.2f}") -print(f"Best value: {result.fun:.6f}") -print(f"Evaluations: {result.nfev}") -``` - -A small `window_size` makes the success rate sensitive to short bursts of improvement, while a larger window smooths out isolated lucky evaluations. A low `restart_after_n` triggers frequent restarts, which favours exploration over exploitation; a high value allows the optimizer to persist longer in a region before restarting. The success rate is also available programmatically via the `success_rate` attribute, enabling custom termination logic or logging. - -Restarts alone cannot detect the situation in which the optimizer has exhausted the information content of the search space: repeated restarts may keep resampling similar regions without ever improving on the incumbent. To save evaluation budget in this situation, `spotoptim` implements a patience-based early-stopping rule through the `max_restarts` parameter. When set to a non-negative integer $N$, the outer loop terminates after $N$ consecutive restarts that fail to improve the best objective value. This rule is analogous to the `no_progress_loss` helper of Hyperopt [@berg11a], the `ExperimentPlateauStopper` of Ray Tune, and the `terminate_cost_threshold` scenario in SMAC [@hutt11a]. The resulting `OptimizeResult` has `success=True` and a message of the form "Optimization early stopped: no improvement for $N$ consecutive restarts", which lets downstream pipelines distinguish a graceful plateau termination from a budget exhaustion. - -```{python} -from spotoptim import SpotOptim -from spotoptim.function import sphere - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=200, - n_initial=5, - restart_after_n=3, - window_size=3, - max_restarts=2, - seed=0, - verbose=False, -) -result = opt.optimize() - -print(result.message.splitlines()[0]) -print(f"Evaluations used: {result.nfev}") -``` - -The role of each parameter in the example is summarised in @tbl-early-stopping-params. - -```{=latex} -\begin{table}[t] -\caption{Role of each parameter in the early-stopping example.} -\label{tbl-early-stopping-params} -\centering -\small -\begin{tabular}{@{}lp{0.55\linewidth}@{}} -\hline -Parameter & Role \\ -\hline -\texttt{max\_iter=200} & Hard evaluation budget. Stops the run if nothing else triggers first. \\ -\texttt{n\_initial=5} & Each LHS design (initial \emph{and} every restart) uses 5 points. \\ -\texttt{window\_size=3} & Success rate is averaged over the last 3 infill iterations. \\ -\texttt{restart\_after\_n=3} & 3 consecutive iterations with success-rate = 0 trigger a restart. \\ -\texttt{max\_restarts=2} & After 2 restarts in a row that fail to improve \texttt{best\_y\_}, stop early. \\ -\hline -\end{tabular} -\end{table} -``` - -The resulting execution trace on the `sphere` objective can be summarised as follows. The initial design (evaluations 1-5) draws an LHS sample in $[-5, 5]^2$. During the subsequent infill phase, the surrogate is refit on every iteration, and early infills typically improve the incumbent because `sphere` is smooth; the rate of improvement slows as the search approaches the minimum at $(0, 0)$. Once three infills in a row fail to improve the incumbent (the success-rate window is zero for three consecutive iterations), the first restart is triggered: the current best is injected, and a fresh five-point LHS design is drawn. Because the injected best is already near zero, neither the new LHS nor the next three infills can beat it, so `_restarts_without_improvement` is incremented to 1. Since $1 < 2$ the rule does not yet fire, and a second restart starts. Its outcome is the same, incrementing the counter to 2. The check $2 \geq 2$ now succeeds and the outer loop breaks before a third restart is executed. The typical evaluation count is therefore approximately $5 + 3 + 5 + 3 + 5 + 3 \approx 20\text{-}30$ evaluations, well below the `max_iter=200` budget. The returned `OptimizeResult` has `success = True` and a message starting with "Optimization early stopped: no improvement for 2 consecutive restarts"; `opt.restarts_results_` has length 3 (initial run plus two restarts) and `opt._early_stopped` is `True`. - -Several boundary cases follow directly from this logic. Setting `max_restarts=None` (the default) disables the rule and preserves the pre-existing behaviour in which the optimizer runs until `max_iter` or `max_time` is reached. Raising `restart_after_n` so that the first restart cannot be triggered within the evaluation budget has the same practical effect. If the objective is one on which restarts can genuinely improve the incumbent, the counter is reset on every productive restart and the rule may never fire. Conversely, `max_restarts=0` represents zero tolerance: the run stops after the very first non-improving restart — on `sphere`, this is usually immediately after the first restart cycle. A future release will generalise this single-purpose rule into a pluggable stopping-criterion framework that additionally supports absolute target values, expected-improvement thresholds, and user-supplied callbacks, covering the full spectrum of stopping patterns discussed in @sec-related. - - -# Modules {#sec-modules} - - -The `spotoptim` codebase is organized into focused modules (subpackages), -each responsible for a specific aspect of the optimization workflow. -Figure~\ref{fig-dirtree} shows the top-level directory structure. -This section describes each module, its purpose, and its key components. Key abbreviations used in the figure and throughout this section include multi-layer perceptron (MLP) and principal component analysis (PCA). All modules are imported from the top-level `spotoptim` namespace or from the corresponding subpackage. - -```{=latex} -\begin{figure*}[ht] -\dirtree{% -.1 src/spotoptim/. -.2 SpotOptim.py\DTcomment{Core optimizer}. -.2 core/\DTcomment{Protocol, storage, experiment control}. -.2 optimizer/\DTcomment{Acquisition, steady-state, scipy wrapper}. -.2 surrogate/\DTcomment{Kriging, MLP surrogate, Nystroem}. -.2 nn/\DTcomment{PyTorch MLP, LinearRegressor}. -.2 function/\DTcomment{Objective functions (single-/multi-objective, remote, torch)}. -.2 sampling/\DTcomment{LHS, Sobol, grid, clustered designs}. -.2 reporting/\DTcomment{Results extraction, analysis utilities}. -.2 plot/\DTcomment{Surrogate visualization, contour, multi-objective plots}. -.2 utils/\DTcomment{Boundaries, transforms, PCA, OCBA, TensorBoard, parallel}. -.2 mo/\DTcomment{Multi-objective: Morris--Mitchell, Pareto front}. -.2 hyperparameters/\DTcomment{Parameter set management for neural network tuning}. -.2 data/\DTcomment{Dataset loaders (e.g., DiabetesDataset)}. -.2 inspection/\DTcomment{Model/surrogate inspection}. -.2 factor\_analyzer/\DTcomment{Factor analysis}. -.2 eda/\DTcomment{Exploratory data analysis}. -.2 tricands/\DTcomment{Triangulation-based candidate generation}. -} -\caption{Top-level directory structure of the \texttt{spotoptim} package.}\label{fig-dirtree} -\end{figure*} -``` - - - -## The SpotOptim Class {#sec-spotoptim-class} - -The `SpotOptim` class in `spotoptim.SpotOptim` is the central orchestrator. Its constructor accepts the objective function, bounds, and a comprehensive set of configuration parameters that control every aspect of the optimization: the surrogate model, acquisition function and optimizer, variable types and transformations, evaluation budget, noise handling, restart policy, and parallelism. All parameters are stored in a `SpotOptimConfig` dataclass and can be accessed as attributes of the optimizer instance. -The most commonly used constructor parameters are `fun` (the objective function), `bounds` (a list of lower/upper tuples), `max_iter` (total evaluation budget including the initial design), `n_initial` (number of initial design points), `surrogate` (default: `Kriging(method="regression")`), `acquisition` (`"y"`, `"ei"`, or `"pi"`), `var_type` (list of `"float"`, `"int"`, `"factor"`), and `seed` (for reproducibility). -The `optimize()` method executes the algorithm described in @sec-algorithm and returns a `scipy.optimize.OptimizeResult` with fields `x` (best point), `fun` (best objective value), `nfev` (total evaluations), `nit` (sequential iterations), `success`, and `message`. The full evaluated data are available as `result.X` and `result.y`, allowing post-hoc analysis without re-running the optimization. - -Variable transformations can be applied through the `var_trans` parameter. For example, `var_trans=["log10", None]` optimizes the first variable in $\log_{10}$ space internally while specifying bounds in natural scale, which is useful for parameters that span several orders of magnitude such as learning rates. The `n_jobs` parameter enables parallel evaluation of multiple design points using joblib, and `eval_batch_size` controls how many points are evaluated in each parallel batch. - -## Core Infrastructure {#sec-core} - -The `core` subpackage provides foundational components. `SpotOptimProtocol` (defined in `core/protocol.py`) is a structural typing protocol (PEP 544) that declares the interface extracted modules expect from the optimizer. Modules such as `optimizer.steady_state` and `reporting.analysis` accept any object matching this protocol rather than importing the concrete `SpotOptim` class, avoiding circular imports and facilitating independent testing. -The `core.storage` module manages the optimizer's internal data arrays through functions like `init_storage()` and `update_storage()`, which handle appending new evaluation results, updating running statistics, and tracking the best solution found so far. `ExperimentControl` is a dataclass that bundles dataset, model class, hyperparameters, device settings, and training parameters into a single object for PyTorch-based experiment workflows. - -## Surrogate Models {#sec-surrogate} - -The `surrogate` subpackage contains three surrogate implementations. `Kriging` is the default and models the objective as a Gaussian process with a Gaussian (squared-exponential) kernel, yielding both a mean prediction $\mu(\mathbf{x})$ and a standard deviation $\sigma(\mathbf{x})$ that is essential for uncertainty-aware acquisition functions. Its key parameters include `method` (see below), `noise` (regularization term), `min_theta` and `max_theta` (bounds for log-scaled kernel hyperparameters), and `seed`; a call to `predict(X, return_std=True)` returns both outputs. - -The kernel hyperparameters $\boldsymbol{\theta}$ are estimated by maximizing the concentrated log-likelihood using differential evolution. Following @Forr08a,[^forr-ref] three fitting modes are available via the `method` argument: `"regression"` (default) fits a generalized least-squares model, `"interpolation"` passes exactly through the data points, and `"reinterpolation"` applies Forrester's correction for noisy data. The implementation is validated against the Matlab code of @Forr08a. - -The Kriging implementation in SPO uses flexible kernel functions that extend naturally to non-continuous parameter spaces. For categorical and combinatorial variables, appropriate distance or similarity measures replace the standard Euclidean distance in the correlation function, enabling the surrogate to model landscapes over discrete, permutation, or mixed search spaces [@Bart16n; @Zaef16b]. This line of research has produced kernels for permutation-based problems using tailored distance measures with automated selection via maximum likelihood estimation [@Zaef14c; @Zaef14b], as well as kernels for hierarchical and conditional parameter spaces arising in algorithm configuration [@Gent18a; @Gent18b]. - -[^forr-ref]: Specifically, Section 2.4 "Kriging" for the core predictor and likelihood, and Section 6 "Surrogate Modeling of Noisy Data" for the `"regression"` and `"reinterpolation"` methods. The Python code is based on `likelihood.m` (concentrated log-likelihood) and `pred.m` (prediction and error estimation) from the book's codebase. - - -```{python} -import numpy as np -from spotoptim.surrogate import Kriging - -X_train = np.array([[0.0], [1.0], [3.0], [4.0]]) -y_train = np.array([0.0, 1.0, 9.0, 16.0]) - -model = Kriging(method="regression", seed=0) -model.fit(X_train, y_train) - -X_test = np.array([[0.5], [2.0], [3.5]]) -y_pred, y_std = model.predict( - X_test, return_std=True -) -``` - -`SimpleKriging` is a lightweight alternative for simple continuous problems where computational speed takes priority over flexibility. `MLPSurrogate` uses a multi-layer perceptron (MLP), which is useful when the response surface is highly non-linear or when the number of data points exceeds the practical limits of Kriging's $\mathcal{O}(n^3)$ fitting cost. Alternatively, a Nystroem approximation module (`surrogate/nystroem.py`) provides further scalability for large datasets. Uncertainty estimates from `MLPSurrogate` are obtained by performing multiple forward passes with dropout enabled and computing the empirical variance across passes. - -The surrogate interface follows the scikit-learn estimator convention. Any model that implements `fit(X, y)` and `predict(X)` can be passed as the `surrogate` argument to `SpotOptim`. For acquisition functions that require uncertainty (`"ei"`, `"pi"`), the model should additionally support `predict(X, return_std=True)`. This makes it straightforward to use scikit-learn's `GaussianProcessRegressor` with custom kernels, or any other regression model, as a drop-in replacement for Kriging. - -Beyond single-surrogate optimization, `spotoptim` supports multi-surrogate scheduling. The `surrogate` parameter accepts a list of surrogate models together with a `prob_surrogate` vector that specifies the selection probability for each model. At every surrogate refit step, one model is drawn at random according to these weights and used for the next acquisition cycle. This introduces diversity into the search: different surrogate types may fit different regions of the landscape better, and alternating between them can reduce the risk of systematic model bias. Each surrogate can also have its own `max_surrogate_points` budget, passed as a list of the same length. If `prob_surrogate` is omitted, uniform weights are assigned automatically. The following example combines a Kriging model (selected with probability 0.7) and a random forest (selected with probability 0.3): - -```{python} -from spotoptim import SpotOptim -from spotoptim.surrogate import Kriging -from sklearn.ensemble import RandomForestRegressor -from spotoptim.function import sphere - -kriging = Kriging(method="regression", seed=0) -rf = RandomForestRegressor( - n_estimators=50, random_state=0 -) - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=30, - n_initial=10, - seed=0, - surrogate=[kriging, rf], - prob_surrogate=[0.7, 0.3], - max_surrogate_points=[None, 50], - # no cap for Kriging, 50 for RF -) -result = opt.optimize() - -print(f"Best value: {result.fun:.6f}") -``` - -## Acquisition and Infill {#sec-optimizer} - -The `optimizer` subpackage implements the acquisition functions, their optimizers as well as infill-point selection. - -**Acquisition functions.** The `acquisition_function` parameter selects which criterion is used to propose the next evaluation point. Three options are available. -*Predicted value* (`"y"`) selects the point where the surrogate predicts the lowest (or highest, for maximization) objective value. This is the simplest strategy and amounts to pure exploitation of the current model. It is computationally cheap but can become trapped in local minima because it does not account for surrogate uncertainty. -*Expected Improvement* (`"ei"`) balances exploitation and exploration by weighting the predicted improvement over the current best value $y_{\min}$ against the surrogate's predictive uncertainty $\sigma(\mathbf{x})$. The EI formula (@eq-ei) was introduced in @sec-examples; points with high predicted quality *or* high uncertainty receive large EI values, which encourages the optimizer to explore under-sampled regions. -*Probability of Improvement* (`"pi"`) selects the point with the highest probability of producing an objective value below the current best $y_{\min}$. Probability of Improvement tends to be more exploitative than EI, because it only measures the probability of any improvement, not its expected magnitude. - -**Acquisition optimizers.** The `acquisition_optimizer` parameter determines how the acquisition function is maximized over the search space. Differential evolution (the default) performs a global search and is robust across a wide range of problem structures [@Stor96a]. The triangulation candidates approach implements the approach developed by @gram22a, generating candidate points geometrically from the Delaunay triangulation of existing evaluations, producing both interior candidates at simplex centroids and fringe candidates that extend toward the search space boundary, see also @sec-tricands. The hybrid `de_tricands` mode, which is still experimental and has not been analyzed so far, alternates between the two methods with probability controlled by `prob_de_tricands`. Standard scipy minimizers are also supported for local refinement. - -**Infill points.** Multiple infill points can be proposed per iteration by setting `n_infill_points`, which is useful for batch-parallel evaluation. When the acquisition optimizer fails to find a valid new point (for example due to a flat surrogate surface), a random fallback point is generated within bounds. -For problems with many evaluation points, the `max_surrogate_points` parameter limits the number of data points used for surrogate fitting, keeping computational cost manageable as the number of evaluations grows. Points are selected using K-means clustering with either a space-filling criterion (`"distant"`) or a quality-based criterion (`"best"`). - -## Neural Network Models {#sec-nn} - -The `nn` subpackage provides two PyTorch modules designed for use as objective functions and surrogates in hyperparameter tuning workflows. The `MLP` class is a `torch.nn.Sequential` subclass with configurable width, depth, activation, and dropout. The architecture can be specified either explicitly through a `hidden_channels` list or compactly through `l1` (neurons per hidden layer) and `num_hidden_layers`, which is the representation used during hyperparameter tuning. - -```{python} -import torch -from spotoptim.nn import MLP - -model = MLP( - in_channels=10, - l1=64, - num_hidden_layers=2, - output_dim=1, - dropout=0.1, -) -``` - -`LinearRegressor` is a `torch.nn.Module` for regression tasks that ranges from pure linear regression (with `num_hidden_layers=0`) to a deep network with configurable activation functions. Both classes provide a `get_default_parameters()` class method that returns a `ParameterSet` with sensible bounds for hyperparameter tuning, and a `get_optimizer()` method that maps string names to `torch.optim` optimizer classes. Beyond standard PyTorch optimizers, `spotoptim` bundles `AdamWScheduleFree`, a schedule-free variant of AdamW that does not require a learning-rate scheduler. - -## Built-in Test Functions {#sec-functions} - -The `function` subpackage contains analytical test functions for benchmarking and testing. All functions accept a 2-D array of shape $(n, d)$ and return a 1-D array of shape $(n,)$ for single-objective functions, or $(n, m)$ for multi-objective functions, where $n$, $d$, and $m$ denote the number of samples, dimensions, and objectives, respectively. - -The single-objective functions include sphere, noisy sphere (sphere with additive Gaussian noise), Rosenbrock (narrow curved valley, minimum at $\mathbf{1}$), Ackley (multi-modal with many local minima), and Michalewicz (steep valleys with a tunable steepness parameter). Engineering benchmark functions include `wingwt` (wing weight estimation, 9--10 dimensions from @Forr08a), `robot_arm_hard` (10-link robot arm maze navigation), and `lennard_jones` (atomic cluster potential, 39 dimensions for 13 atoms). -Multi-objective functions include the ZDT family (`zdt1` through `zdt6`), DTLZ problems (`dtlz1`, `dtlz2`), Fonseca-Fleming, Schaffer N1, and Kursawe. Custom objective functions can be defined by the user following the same array convention. - -## Sampling and Experimental Designs {#sec-sampling} - -The `sampling.design` module provides space-filling designs for the initial evaluation phase. The default quasi-Monte Carlo Latin Hypercube design (`generate_qmc_lhs_design`) ensures that each variable's marginal distribution is uniformly covered. Sobol sequences (`generate_sobol_design`) provide quasi-random low-discrepancy coverage that is particularly effective in higher dimensions. Regular grids (`generate_grid_design`) place points at equal intervals; the actual number of grid points is $\lfloor n_\text{design}^{1/d} \rfloor^d$, where $n_\text{design}$ is the requested number of points. Uniform random sampling (`generate_uniform_design`) serves as a baseline, and clustered designs (`generate_clustered_design`) produce non-uniform distributions for testing optimizer robustness and generating so-called "ill-conditioned" designs. - -```{python} -from spotoptim.sampling.design import ( - generate_qmc_lhs_design, - generate_sobol_design, -) - -bounds = [(-5, 5), (-5, 5)] -X_lhs = generate_qmc_lhs_design( - bounds, n_design=20, seed=0 -) -X_sobol = generate_sobol_design( - bounds, n_design=32, seed=0 -) -``` - -A pre-computed initial design can be passed to `SpotOptim.optimize()` via the `X0` parameter, allowing the user to incorporate prior knowledge or to resume an optimization from a previous set of evaluations. - -## Reporting and Analysis {#sec-reporting} - -The `reporting` subpackage extracts and formats optimization results. `print_best` displays the best parameter vector and objective value in a human-readable format, with factor variables mapped back to their string labels. `get_results_table` produces a formatted table showing each variable's name, type, bounds, default value, and tuned (best) value, with an optional importance score column. `get_design_table` summarizes the search space before optimization, listing variable types, bounds, and transformations. -For post-hoc analysis, `get_importance` computes a correlation-based importance score for each variable on a 0--100 scale, and `sensitivity_spearman` reports Spearman rank correlations between each parameter and the objective value, together with p-values and significance stars. These tools help identify which hyperparameters have the strongest influence on performance, guiding subsequent refinements to the search space. - -## Visualization {#sec-plotting} - -The `plot` subpackage provides several visualization functions. `plot_progress` displays the full evaluation history as a scatter plot with a best-so-far curve overlaid, distinguishing initial design points from sequential evaluations. `plot_surrogate` renders a 2x2 panel showing the fitted surrogate model for a selected pair of dimensions: the top row contains 3-D surfaces of predictions and prediction uncertainty, while the bottom row shows the corresponding contour plots with evaluated points overlaid. `simple_contour` draws a quick 2-D filled contour of any callable over a rectangular region, and `plot_design_points` creates a scatter plot of evaluated points with hidden-dimension aggregation. Multi-objective visualization is provided through `mo_pareto_optx_plot`, which shows Pareto-optimal points in the input space, and `mo_xy_contour` and `mo_xy_surface` for surrogate-based objective-space visualization. -The following examples use the sphere function optimized over $[-5, 5]^2$ with 25 iterations. @fig-progress shows a typical progress plot. The initial design points appear as grey dots in a shaded background region; sequential evaluations are connected by a line, and the red curve traces the best objective value found so far. - -```{python} -#| label: fig-progress -#| fig-cap: "Optimization progress for the sphere function. Grey dots mark the initial Latin Hypercube design; subsequent evaluations are connected by a line. The red curve shows the best objective value found so far." -from spotoptim import SpotOptim -from spotoptim.function import sphere -from spotoptim.plot.visualization import ( - plot_progress -) - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=25, - n_initial=10, - seed=0, -) -result = opt.optimize() -plot_progress(opt, show=False, figsize=(6, 4), log_y=True) -``` - -@fig-surrogate shows the surrogate model fitted after optimization. The top row displays 3-D surfaces of the predicted objective value and the prediction uncertainty; the bottom row shows the corresponding contour maps with the evaluated points overlaid as red dots. - -```{python} -#| label: fig-surrogate -#| fig-cap: "Surrogate model for dimensions $x_0$ and $x_1$. Top row: 3-D surfaces of predictions (left) and prediction uncertainty (right). Bottom row: contour plots with evaluated points overlaid." -from spotoptim.plot.visualization import ( - plot_surrogate -) -plot_surrogate(opt, i=0, j=1, show=False) -``` - -@fig-contour illustrates `simple_contour` applied to the Rosenbrock function. The function accepts any callable that maps a $(1, 2)$ array to a scalar, making it convenient for quick inspection of objective landscapes independently of an optimization run. - -```{python} -#| label: fig-contour -#| fig-cap: "Filled contour plot of the Rosenbrock function over $[-2, 2] \\times [-1, 3]$." -from spotoptim.function import rosenbrock -from spotoptim.plot.contour import ( - simple_contour -) -simple_contour(rosenbrock, - min_x=-2, max_x=2, min_y=-1, max_y=3, - n_levels=30) -``` - -For multi-objective problems, `mo_pareto_optx_plot` visualizes Pareto-optimal points in the input space. -The surrogate-based visualization functions `mo_xy_contour` and `mo_xy_surface` generate contour and surface plots for each objective from fitted surrogate models. @fig-mo-contour shows the contour view for two Kriging surrogates fitted to the Fonseca--Fleming objectives. - -```{python} -#| label: fig-mo-contour -#| fig-cap: "Surrogate contour plots for both Fonseca--Fleming objectives, fitted from 50 random evaluations." -import numpy as np -from spotoptim.function import fonseca_fleming -from spotoptim.surrogate import Kriging -from spotoptim.mo.pareto import mo_xy_contour - -rng = np.random.default_rng(0) -X_mo = rng.uniform(-4, 4, size=(50, 2)) -Y_mo = fonseca_fleming(X_mo) - -m1 = Kriging() -m1.fit(X_mo, Y_mo[:, 0]) -m2 = Kriging() -m2.fit(X_mo, Y_mo[:, 1]) -mo_xy_contour( - [m1, m2], - bounds=[(-4, 4), (-4, 4)], - target_names=["f1", "f2"], - feature_names=["x0", "x1"], - resolution=50, -) -``` - -## Utilities {#sec-utils} - -The `utils` subpackage collects helper functions that support the optimization loop and post-hoc analysis. `get_boundaries` computes column-wise minima and maxima, and `map_to_original_scale` transforms points from the $[0, 1]$ unit hypercube back to the original variable ranges. PCA utilities (`get_pca`, `get_pca_topk`) perform PCA on evaluation data and identify the features with the strongest loadings on the first two components. - -OCBA functions (`get_ocba`, `get_ranks`) implement the OCBA algorithm for noisy optimization [@Bart11a]. Given current sample means, variances, and an incremental budget, `get_ocba` returns an allocation vector that concentrates additional evaluations on the most promising and most uncertain designs. `TorchStandardScaler` standardizes PyTorch tensors to zero mean and unit variance, analogous to scikit-learn's `StandardScaler`. The `is_gil_disabled` function checks whether the Python interpreter is a free-threaded build (PEP 703), which `spotoptim` uses internally to decide whether thread-based parallelism is safe for objective evaluation. - -The TensorBoard integration (`utils/tensorboard.py`) provides real-time monitoring of the optimization process. Setting `tensorboard_log=True` in the `SpotOptim` constructor activates logging: at each iteration, the module writes scalar metrics (current best objective value, last evaluation, success rate) and the coordinates of the best design point to a TensorBoard event file. For noisy optimization with repeated evaluations, additional statistics are logged, including the best mean objective value and the variance at the best design. Each evaluated hyperparameter configuration is also logged via `add_hparams`, which populates TensorBoard's HParams dashboard and enables interactive comparison of configurations across runs. The log directory defaults to `runs/spotoptim_YYYYMMDD_HHMMSS` but can be customized via the `tensorboard_path` parameter. Setting `tensorboard_clean=True` removes all previous log directories from the `runs` folder before a new optimization starts, preventing clutter from accumulating across experiments. After optimization completes, the writer is flushed and closed automatically. The logs can then be viewed by running `tensorboard --logdir=runs` in a terminal and opening the displayed URL in a browser. The integration works seamlessly with both synchronous and steady-state (parallel) optimization modes: in the latter case, the TensorBoard writer is temporarily detached before pickling the optimizer for process-based parallelism and reattached afterward, so logging continues uninterrupted. A minimal example that enables TensorBoard logging^[ View logs with: `tensorboard --logdir=runs/my_experiment`.] is: - -```{python} -from spotoptim import SpotOptim -from spotoptim.function import sphere - -opt = SpotOptim( - fun=sphere, - bounds=[(-5, 5), (-5, 5)], - max_iter=20, - tensorboard_log=True, - tensorboard_clean=True, -) -result = opt.optimize() -``` - -## Multi-Objective Optimization {#sec-mo} - -The `mo` subpackage supports multi-objective optimization through Pareto front analysis and scalarization. The `is_pareto_efficient` function accepts a cost array of shape $(n, m)$, where $n$ is the number of solutions and $m$ is the number of objectives, and returns a boolean mask identifying the non-dominated points. It works for any number of objectives and supports both minimization and maximization. - -Since the surrogate model operates on scalar objectives, multi-objective functions must be scalarized before fitting. The `fun_mo2so` parameter of `SpotOptim` converts the $(n, m)$ output of the objective function into a scalar $(n,)$ vector. The simplest scalarization is a weighted sum: - -```python -import numpy as np -from spotoptim import SpotOptim -from spotoptim.function import ( - fonseca_fleming -) - -fun_mo2so = lambda y: np.sum( - y * np.array([0.5, 0.5]), axis=1 -) - -opt = SpotOptim( - fun=fonseca_fleming, - bounds=[(-4, 4), (-4, 4)], - max_iter=30, - n_initial=15, - seed=0, - fun_mo2so=fun_mo2so, -) -result = opt.optimize() -``` - -Different weight vectors trace different regions of the Pareto front. For more sophisticated multi-objective handling, the `spotdesirability` package provides desirability functions that map multiple objectives onto a single composite scale while respecting individual target values and importance weights [@bart25a; @bart25b]. - -## Hyperparameter Management {#sec-hyperparams} - -The `hyperparameters` subpackage provides the `ParameterSet` class, a fluent API for defining search spaces with typed variables. Parameters are added through chained calls to `add_float()`, `add_int()`, and `add_factor()`, each specifying a name, bounds, default value, and optional transformation. - -```python -from spotoptim.hyperparameters.parameters ( - import ParameterSet) - -ps = ParameterSet() -ps.add_float( - "learning_rate", - low=-5, high=-1, default=-3, - transform="log10", -) -ps.add_int( - "num_layers", - low=1, high=5, default=2, -) -ps.add_float( - "dropout", - low=0.0, high=0.5, default=0.1, -) -``` - -The properties `ps.bounds`, `ps.var_type`, `ps.names()`, and `ps.var_trans` map directly to the corresponding `SpotOptim` constructor arguments, providing a clean separation between search space definition and optimizer configuration. The `MLP` and `LinearRegressor` classes provide `get_default_parameters()` class methods that return pre-configured `ParameterSet` instances with sensible bounds for their hyperparameters. - -## Datasets {#sec-data} - -The `data` subpackage provides PyTorch `Dataset` wrappers for use in hyperparameter tuning workflows. `DiabetesDataset` wraps the scikit-learn diabetes regression dataset (442 samples, 10 features) as a PyTorch `Dataset`, and `get_diabetes_dataloaders()` creates train and test `DataLoader` objects with configurable train/test split, batch size, and optional feature scaling. These utilities simplify the setup of neural network tuning experiments by providing ready-to-use data pipelines. - -## Model Inspection {#sec-inspection} - -The `inspection` subpackage provides feature importance and prediction diagnostics. `generate_mdi()` trains a Random Forest and extracts impurity-based feature importance scores. `generate_imp()` computes permutation importance by shuffling each feature and measuring the degradation in model performance on a held-out test set. `plot_actual_vs_predicted()` creates scatter plots comparing true values against model predictions, providing a visual diagnostic of surrogate quality. - -@fig-importances shows impurity-based (Gini) and permutation-based feature importances for the sphere optimization from @sec-plotting. Both methods correctly identify $x_0$ and $x_1$ as equally important, which is expected for the symmetric sphere function. - -```{python} -#| label: fig-importances -#| fig-cap: "Feature importances for the sphere optimization. Left: impurity-based (Gini) importances from a Random Forest. Right: permutation importances on the test set." -from sklearn.model_selection import ( - train_test_split -) -from spotoptim.inspection import ( - generate_mdi, generate_imp, plot_importances -) - -X_tr, X_te, y_tr, y_te = train_test_split( - opt.X_, opt.y_, test_size=0.3, random_state=42 -) -df_mdi = generate_mdi(X_tr, y_tr) -perm_imp = generate_imp(X_tr, X_te, y_tr, y_te) -plot_importances( - df_mdi, perm_imp, X_te, - feature_names=["x0", "x1"], - show=False, -) -``` - -@fig-actual-vs-predicted compares the surrogate's predictions against the true objective values for all evaluated points. The left panel shows actual versus predicted values (points on the diagonal indicate perfect agreement); the right panel shows residuals versus predicted values. - -```{python} -#| label: fig-actual-vs-predicted -#| fig-cap: "Surrogate prediction diagnostics. Left: actual versus predicted objective values. Right: residuals versus predicted values." -from spotoptim.inspection import ( - plot_actual_vs_predicted -) - -y_pred = opt.surrogate.predict(opt.X_) -plot_actual_vs_predicted(opt.y_, y_pred, show=False) -``` - -## Factor Analysis {#sec-factor} - -The `factor_analyzer` subpackage provides tools for exploratory factor analysis of high-dimensional optimization data. It is a port of the `factor_analyzer` package for Python^[\url{https://factor-analyzer.readthedocs.io/en/latest/index.html}]. Before running the analysis, suitability tests (`calculate_kmo` for the Kaiser-Meyer-Olkin measure, `calculate_bartlett_sphericity` for Bartlett's test) check whether the data has sufficient correlational structure. The `FactorAnalyzer` class extracts latent factors with optional varimax or promax rotation, helping to reveal the latent structure in large parameter spaces. - -## Exploratory Data Analysis {#sec-eda} - -The `eda` subpackage provides quick visualization functions for inspecting optimization data. `plot_ip_histograms()` creates a grid of histograms for each variable, with categorical variables shown as bar charts. Specific configurations (such as the best solution) can be overlaid as vertical lines using the `add_points` parameter. - -## Triangulation Candidates {#sec-tricands} - -The `tricands` module generates candidate points for acquisition optimization by computing the Delaunay triangulation of existing evaluated points [@gram22a]. Interior candidates are placed at simplex centroids, exploring gaps between existing evaluations. Fringe candidates extend beyond the convex hull toward the search space boundary, encouraging exploration of unexplored regions. The `p` parameter controls the extension fraction, and `nmax` limits the total number of candidates. This geometry-aware approach complements the global search performed by differential evolution and is particularly effective in low-to-moderate dimensions where the triangulation remains computationally tractable. - - -# Hyperparameter Tuning with spotoptim {#sec-hpt} - -A primary application of `spotoptim` is the tuning of machine learning hyperparameters, where each function evaluation corresponds to training and validating a model with a specific configuration. This section demonstrates a complete neural network tuning workflow using the diabetes regression dataset, a multi-layer perceptron architecture, and the `spotoptim` optimization loop. To keep execution time manageable, the number of training epochs and optimization iterations has been reduced. In practice, longer training runs (50--200 epochs per evaluation) and larger evaluation budgets (`max_iter` $\geq 30$) are necessary to obtain reliable results. The short configuration used here is intended solely as a demonstration of the workflow and API; the best hyperparameters found in such a short run should not be considered representative. - -The workflow follows five steps: define the search space, prepare the dataset, define the objective function, run the optimization, and analyze the results. This structure mirrors the hyperparameter tuning methodology described in @bart21i and @bart21ic3, now implemented entirely in Python. - -## Defining the Search Space - -The search space is defined using a `ParameterSet` that specifies the hyperparameters to tune, their types, bounds, and transformations: - -```{python} -#| echo: true -#| code-overflow: wrap -from spotoptim.hyperparameters \ - .parameters import ParameterSet - -ps_hpt = ParameterSet() -ps_hpt.add_float("lr", low=1e-5, high=0.1, - default=0.001, transform="log10") -ps_hpt.add_int("l1", low=8, high=128, - default=32) -ps_hpt.add_int("num_hidden_layers", - low=1, high=4, default=2) -ps_hpt.add_float("dropout", low=0.0, - high=0.5, default=0.1) -for n, t, b in zip( - ps_hpt.names(), - ps_hpt.var_type, - ps_hpt.bounds, -): - print(f"{n} ({t}): {b}") -``` - -The learning rate bounds are specified in natural scale ($[10^{-5}, 10^{-1}]$); the `log10` transformation tells SpotOptim to work internally in log space, so the surrogate models a smooth landscape. SpotOptim automatically converts back to natural scale before calling the objective function. The `ParameterSet` properties (`ps_hpt.bounds`, `ps_hpt.var_type`, `ps_hpt.names()`, `ps_hpt.var_trans`) map directly to the `SpotOptim` constructor arguments. - -## Preparing the Dataset - -The diabetes dataset is loaded and split into training and test sets using the provided data loader utility: - -```{python} -#| echo: true -#| code-overflow: wrap -from spotoptim.data import ( - get_diabetes_dataloaders, -) - -train_loader, test_loader, scaler = ( - get_diabetes_dataloaders( - test_size=0.2, - batch_size=32, - scale_features=True, - random_state=0, - ) -) -print(f"Training batches: {len(train_loader)}") -print(f"Test batches: {len(test_loader)}") -``` - -The `scale_features=True` option standardizes input features to zero mean and unit variance, which is important for neural network training stability. - -## Defining the Objective Function - -The objective function decodes hyperparameters from the search vector, constructs a `LinearRegressor`, trains it on the training set, and returns the mean squared error (MSE) on the test set. Because SpotOptim applies the inverse of `var_trans` before calling the objective, the learning rate arrives in natural scale and can be used directly. The number of epochs is set to 10 for this demo; production runs should use 50--200. - -```{python} -#| echo: true -#| code-overflow: wrap -import numpy as np -import torch -from spotoptim.nn import LinearRegressor - -N_EPOCHS = 10 # short demo; use 50-200 - -def nn_objective(X): - X = np.atleast_2d(X) - results = np.zeros(X.shape[0]) - for i in range(X.shape[0]): - lr = X[i, 0] - l1 = int(X[i, 1]) - n_layers = int(X[i, 2]) - dropout = X[i, 3] - model = LinearRegressor( - input_dim=10, output_dim=1, - l1=l1, - num_hidden_layers=n_layers, - activation="ReLU", - ) - opt = torch.optim.Adam( - model.parameters(), lr=lr) - loss_fn = torch.nn.MSELoss() - model.train() - for epoch in range(N_EPOCHS): - for xb, yb in train_loader: - opt.zero_grad() - loss = loss_fn(model(xb), yb) - loss.backward() - opt.step() - model.eval() - total_loss, n = 0.0, 0 - with torch.no_grad(): - for xb, yb in test_loader: - total_loss += ( - loss_fn(model(xb), yb) - .item() * len(yb)) - n += len(yb) - results[i] = total_loss / n - return results -``` - -The function follows `spotoptim`'s convention: it accepts a 2-D array where each row is a configuration and returns a 1-D array of objective values. - -## Running the Optimization - -With the search space and objective function defined, the optimization is launched with a single call. The optimizer is configured with Expected Improvement and a small budget suitable for a demo. Production runs should increase `max_iter` to 30 or more. - -```{python} -#| echo: true -#| code-overflow: wrap -from spotoptim import SpotOptim - -opt_hpt = SpotOptim( - fun=nn_objective, - bounds=ps_hpt.bounds, - var_type=ps_hpt.var_type, - var_name=ps_hpt.names(), - var_trans=ps_hpt.var_trans, - acquisition="ei", - max_iter=15, n_initial=8, seed=0, -) -result_hpt = opt_hpt.optimize() - -print(f"Best MSE: {result_hpt.fun:.4f}") -print(f"Evaluations: {result_hpt.nfev}") -print("Best config:") -for n, v in zip( - ps_hpt.names(), result_hpt.x -): - print(f" {n}: {v:.6g}") -``` - -The Kriging surrogate builds a model of the validation loss as a function of the hyperparameters, and Expected Improvement guides the search toward configurations that are either predicted to perform well or that have high uncertainty. - -## Analyzing the Results - -After optimization, the reporting utilities summarize which hyperparameters were most influential and display the best configuration. The progress plot (@fig-hpt-progress) shows the convergence of the optimization. - -```{python} -#| echo: true -#| code-overflow: wrap -#| label: fig-hpt-progress -#| fig-cap: "Hyperparameter tuning progress (demo run with reduced epochs and budget). The red curve shows the best validation MSE found so far." -from spotoptim.plot.visualization import ( - plot_progress, -) -plot_progress(opt_hpt, show=False, log_y=True) -``` - -The feature importances (@fig-hpt-importances) reveal which hyperparameters had the strongest influence on the validation loss. - -```{python} -#| echo: true -#| code-overflow: wrap -#| label: fig-hpt-importances -#| fig-cap: "Feature importances for the hyperparameter tuning demo. Left: impurity-based (Gini) importances. Right: permutation importances on the test set." -from sklearn.model_selection import ( - train_test_split, -) -from spotoptim.inspection import ( - generate_mdi, generate_imp, - plot_importances, -) - -X_tr, X_te, y_tr, y_te = train_test_split( - opt_hpt.X_, opt_hpt.y_, - test_size=0.3, random_state=42, -) -df_mdi = generate_mdi( - X_tr, y_tr, - feature_names=ps_hpt.names(), -) -perm_imp = generate_imp( - X_tr, X_te, y_tr, y_te, -) -plot_importances( - df_mdi, perm_imp, X_te, - feature_names=ps_hpt.names(), - show=False, -) -``` - -The `sensitivity_spearman` function reports Spearman rank correlations between each hyperparameter and the objective value, with significance stars indicating statistical confidence. This helps the practitioner understand which hyperparameters merit further investigation and which can be fixed at their default values. - -```{python} -#| echo: true -#| code-overflow: wrap -from spotoptim.reporting.analysis import ( - sensitivity_spearman, -) -sensitivity_spearman(opt_hpt) -``` - -The complete workflow described here can be compared with the corresponding Ray Tune setup documented by @bart23e. While Ray Tune provides distributed scheduling across multiple machines, `spotoptim` offers a more transparent, model-centric approach where the user controls the surrogate model, acquisition function, and experimental design. For single-machine workflows with moderate evaluation budgets (tens to hundreds of configurations), the surrogate-based approach is typically more sample-efficient than the random or bandit-based strategies employed by Ray Tune's default schedulers. - - - -# Summary and Outlook {#sec-outlook} - -This report has presented `spotoptim`, a Python package for surrogate-model-based optimization of expensive black-box functions. The package implements the Sequential Parameter Optimization methodology with Kriging as the default surrogate, Expected Improvement and related acquisition functions, native support for mixed variable types, noise-aware evaluation through repeated evaluations and OCBA, and multi-objective extensions via Pareto analysis and desirability functions. The architecture is designed around scikit-learn compatibility for surrogates and scipy compatibility for results, making the package interoperable with the broader Python scientific computing ecosystem. - -`spotoptim` represents the current generation of a two-decade research lineage. It uses a modular architecture, structural typing protocols, and comprehensive documentation. -The package is part of an ecosystem of related tools. For example, `spotdesirability` provides desirability functions for multi-objective optimization, enabling the user to express preferences over multiple objectives through individual desirability curves and overall aggregation [@bart25a; @bart25b], `spotforecast2` extends the optimization framework to time-series forecasting, and `spotforecast2_safe` adds robustness guarantees for safety-critical forecasting applications. -The emergence of free-threaded Python opens the possibility of true thread-level parallelism for objective evaluation; `spotoptim` already includes a `is_gil_disabled()` check that detects free-threaded builds and can adapt its parallelism strategy accordingly. -The `spotoptim` package is open-source and available at under the AGPL-3.0 license. Documentation, including an API reference and a comprehensive user guide with executable code examples, is hosted at . - -# References {.unnumbered} - -::: {#refs} -::: - diff --git a/bart26g/orcidlink.sty b/bart26g/orcidlink.sty deleted file mode 100644 index cfa2f7fa..00000000 --- a/bart26g/orcidlink.sty +++ /dev/null @@ -1,63 +0,0 @@ -%% -%% This is file `orcidlink.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% orcidlink.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% Copyright (C) 2020 by Leo C. Stein -%% -------------------------------------------------------------------------- -%% This work may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either version 1.3 -%% of this license or (at your option) any later version. -%% The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% and version 1.3 or later is part of all distributions of LaTeX -%% version 2005/12/01 or later. -%% -\NeedsTeXFormat{LaTeX2e}[1994/06/01] -\ProvidesPackage{orcidlink} - [2021/06/11 v1.0.4 Linked ORCiD logo macro package] - -%% All I did was package up Milo's code on TeX.SE, -%% see https://tex.stackexchange.com/a/445583/34063 -\RequirePackage{hyperref} -\RequirePackage{tikz} - -\ProcessOptions\relax - -\usetikzlibrary{svg.path} - -\definecolor{orcidlogocol}{HTML}{A6CE39} -\tikzset{ - orcidlogo/.pic={ - \fill[orcidlogocol] svg{M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z}; - \fill[white] svg{M86.3,186.2H70.9V79.1h15.4v48.4V186.2z} - svg{M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z} - svg{M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1C84.2,46.7,88.7,51.3,88.7,56.8z}; - } -} - -%% Reciprocal of the height of the svg whose source is above. The -%% original generates a 256pt high graphic; this macro holds 1/256. -\newcommand{\@OrigHeightRecip}{0.00390625} - -%% We will compute the current X height to make the logo the right height -\newlength{\@curXheight} - -\DeclareRobustCommand\orcidlink[1]{% -\texorpdfstring{% -\setlength{\@curXheight}{\fontcharht\font`X}% -\href{https://orcid.org/#1}{\XeTeXLinkBox{\mbox{% -\begin{tikzpicture}[yscale=-\@OrigHeightRecip*\@curXheight, -xscale=\@OrigHeightRecip*\@curXheight,transform shape] -\pic{orcidlogo}; -\end{tikzpicture}% -}}}}{}} - -\endinput -%% -%% End of file `orcidlink.sty'. diff --git a/bart26g/pyproject.toml b/bart26g/pyproject.toml deleted file mode 100644 index d2d1f620..00000000 --- a/bart26g/pyproject.toml +++ /dev/null @@ -1,17 +0,0 @@ -[project] -name = "bart26g" -version = "0.0.1" -description = "Desirability" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "jupyter>=1.1.1", - "jupyter-cache>=1.0.1", - "matplotlib>=3.10.7", - "plotly>=6.5.0", - "spotoptim", - "spotdesirability", -] - -[tool.uv.sources] -spotoptim = { path = "..", editable = true } diff --git a/bart26g/spotoptim_arxiv.zip b/bart26g/spotoptim_arxiv.zip deleted file mode 100644 index 8d573b12..00000000 Binary files a/bart26g/spotoptim_arxiv.zip and /dev/null differ diff --git a/bart26g/steady-state.dot b/bart26g/steady-state.dot deleted file mode 100644 index 606de360..00000000 --- a/bart26g/steady-state.dot +++ /dev/null @@ -1,70 +0,0 @@ -digraph steady_state { - rankdir=TB; - fontname="Latin Modern Roman"; - node [fontname="Latin Modern Roman", fontsize=10, shape=box, style="rounded,filled", margin="0.12,0.07"]; - edge [fontname="Latin Modern Roman", fontsize=9]; - graph [fontsize=10, nodesep=0.6, ranksep=0.45]; - - // Phase labels as plain nodes - p1_label [label="Phase 1:\nInitial Design", shape=plaintext, fontsize=11, fontname="Latin Modern Roman"]; - p2_label [label="Phase 2: Steady-State Loop", shape=plaintext, fontsize=11, fontname="Latin Modern Roman"]; - - // Phase 1 nodes - init [label="Generate n_initial\ndesign points", fillcolor="#dce6f1"]; - eval_init [label="Evaluate in parallel\n(eval_pool)", fillcolor="#fff2cc"]; - fit_first [label="Fit surrogate", fillcolor="#d9ead3"]; - - // Phase 2 nodes - check [label="Budget\nexhausted?", shape=diamond, fillcolor="#fce5cd"]; - search [label="Optimize acquisition\n(search_pool, threads)", fillcolor="#d0e0f0"]; - fill [label="Launch new\nsearch tasks", fillcolor="#d0e0f0"]; - collect [label="Collect candidate\nin pending_cands", fillcolor="#f0f0f0"]; - refit [label="Refit surrogate\n(under lock)", fillcolor="#d9ead3"]; - batch_q [label="Batch ready?", shape=diamond, fillcolor="#fce5cd"]; - update [label="Update storage", fillcolor="#f0f0f0"]; - dispatch [label="Dispatch batch\nto eval_pool", fillcolor="#fff2cc"]; - eval_done [label="Batch evaluation\ncompletes", fillcolor="#fff2cc"]; - - result [label="Return\nOptimizeResult", fillcolor="#e6d9f2"]; - - // Row assignments: Phase 1 left, Phase 2 right, result far right - {rank=same; p1_label; p2_label;} - {rank=same; init; check;} - {rank=same; eval_init; search; fill; result;} - {rank=same; fit_first; collect; refit;} - {rank=same; batch_q; update;} - {rank=same; dispatch; eval_done;} - - // Phase 1 flow (vertical, left) - p1_label -> init [style=invis]; - init -> eval_init; - eval_init -> fit_first; - - // Phase label to check - p2_label -> check [style=invis]; - - // Phase 1 -> Phase 2 (horizontal) - fit_first -> check [label=" ", minlen=2]; - - // Phase 2: search path (left column, down) - check -> search [label=" no"]; - search -> collect; - collect -> batch_q; - batch_q -> search [label=" no\n (more slots)", style=dashed, constraint=false]; - - // Phase 2: dispatch (bottom, left to right) - batch_q -> dispatch [label=" yes"]; - dispatch -> eval_done; - - // Phase 2: eval return path (right column, up) - eval_done -> update; - update -> refit; - refit -> fill; - fill -> check; - - // Exit: from budget check to result (far right) - check -> result [label=" yes"]; - - // Invisible edge to ensure result is to the right of fill - fill -> result [style=invis]; -} diff --git a/bart26g/steady-state.pdf b/bart26g/steady-state.pdf deleted file mode 100644 index 5ca28c6d..00000000 Binary files a/bart26g/steady-state.pdf and /dev/null differ diff --git a/bart26g/uv.lock b/bart26g/uv.lock deleted file mode 100644 index 56876774..00000000 --- a/bart26g/uv.lock +++ /dev/null @@ -1,2300 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.13" -resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.14' and sys_platform == 'darwin'", - "python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version < '3.14' and sys_platform == 'emscripten'", - "python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version < '3.14' and sys_platform == 'darwin'", -] - -[[package]] -name = "anyio" -version = "4.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, -] - -[[package]] -name = "appnope" -version = "0.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, -] - -[[package]] -name = "argon2-cffi" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "argon2-cffi-bindings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, -] - -[[package]] -name = "argon2-cffi-bindings" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, - { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, - { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, - { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, - { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, - { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, - { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, - { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, - { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, - { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, - { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, - { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, - { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, - { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, - { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, - { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, - { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, -] - -[[package]] -name = "arrow" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, -] - -[[package]] -name = "asttokens" -version = "3.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, -] - -[[package]] -name = "async-lru" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, -] - -[[package]] -name = "attrs" -version = "26.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, -] - -[[package]] -name = "babel" -version = "2.18.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, -] - -[[package]] -name = "bart26g" -version = "0.0.1" -source = { virtual = "." } -dependencies = [ - { name = "jupyter" }, - { name = "jupyter-cache" }, - { name = "matplotlib" }, - { name = "plotly" }, - { name = "spotdesirability" }, - { name = "spotoptim" }, -] - -[package.metadata] -requires-dist = [ - { name = "jupyter", specifier = ">=1.1.1" }, - { name = "jupyter-cache", specifier = ">=1.0.1" }, - { name = "matplotlib", specifier = ">=3.10.7" }, - { name = "plotly", specifier = ">=6.5.0" }, - { name = "spotdesirability" }, - { name = "spotoptim", editable = "../" }, -] - -[[package]] -name = "beautifulsoup4" -version = "4.14.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, -] - -[[package]] -name = "bleach" -version = "6.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, -] - -[package.optional-dependencies] -css = [ - { name = "tinycss2" }, -] - -[[package]] -name = "build" -version = "1.4.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "os_name == 'nt' and sys_platform != 'darwin'" }, - { name = "packaging" }, - { name = "pyproject-hooks" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3f/16/4b272700dea44c1d2e8ca963ebb3c684efe22b3eba8cfa31c5fdb60de707/build-1.4.3.tar.gz", hash = "sha256:5aa4231ae0e807efdf1fd0623e07366eca2ab215921345a2e38acdd5d0fa0a74", size = 89314, upload-time = "2026-04-10T21:25:40.857Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/30/f169e1d8b2071beaf8b97088787e30662b1d8fb82f8c0941d14678c0cbf1/build-1.4.3-py3-none-any.whl", hash = "sha256:1bc22b19b383303de8f2c8554c9a32894a58d3f185fe3756b0b20d255bee9a38", size = 26171, upload-time = "2026-04-10T21:25:39.671Z" }, -] - -[[package]] -name = "certifi" -version = "2026.2.25" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, -] - -[[package]] -name = "cffi" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, - { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, - { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, - { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, - { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, - { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, - { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, - { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, - { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, - { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, - { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, - { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, - { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, - { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, - { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, - { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, - { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, - { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, - { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, - { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, - { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, - { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, - { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, - { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, - { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, - { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, - { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, - { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, - { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, - { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, - { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, - { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, - { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, - { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, - { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, - { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, -] - -[[package]] -name = "click" -version = "8.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "comm" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, -] - -[[package]] -name = "contourpy" -version = "1.3.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, - { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, - { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, - { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, - { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, - { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, - { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, - { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, - { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, - { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, - { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, - { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, - { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, - { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, - { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, - { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, - { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, - { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, - { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, - { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, - { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, - { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, - { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, - { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, - { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, -] - -[[package]] -name = "cycler" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, -] - -[[package]] -name = "debugpy" -version = "1.8.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" }, - { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" }, - { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" }, - { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" }, - { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" }, - { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" }, - { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, -] - -[[package]] -name = "decorator" -version = "5.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, -] - -[[package]] -name = "dill" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, -] - -[[package]] -name = "executing" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, -] - -[[package]] -name = "fastjsonschema" -version = "2.21.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, -] - -[[package]] -name = "fonttools" -version = "4.62.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, - { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, - { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, - { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, - { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, - { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, - { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, - { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, - { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, - { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, - { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, - { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, - { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, - { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, - { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, - { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, - { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, - { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, - { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, -] - -[[package]] -name = "fqdn" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, -] - -[[package]] -name = "greenlet" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/94/a5935717b307d7c71fe877b52b884c6af707d2d2090db118a03fbd799369/greenlet-3.4.0.tar.gz", hash = "sha256:f50a96b64dafd6169e595a5c56c9146ef80333e67d4476a65a9c55f400fc22ff", size = 195913, upload-time = "2026-04-08T17:08:00.863Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/75/7e9cd1126a1e1f0cd67b0eda02e5221b28488d352684704a78ed505bd719/greenlet-3.4.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:43748988b097f9c6f09364f260741aa73c80747f63389824435c7a50bfdfd5c1", size = 285856, upload-time = "2026-04-08T15:52:45.82Z" }, - { url = "https://files.pythonhosted.org/packages/9d/c4/3e2df392e5cb199527c4d9dbcaa75c14edcc394b45040f0189f649631e3c/greenlet-3.4.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5566e4e2cd7a880e8c27618e3eab20f3494452d12fd5129edef7b2f7aa9a36d1", size = 610208, upload-time = "2026-04-08T16:24:39.674Z" }, - { url = "https://files.pythonhosted.org/packages/da/af/750cdfda1d1bd30a6c28080245be8d0346e669a98fdbae7f4102aa95fff3/greenlet-3.4.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1054c5a3c78e2ab599d452f23f7adafef55062a783a8e241d24f3b633ba6ff82", size = 621269, upload-time = "2026-04-08T16:30:59.767Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/0cbc693622cd54ebe25207efbb3a0eb07c2639cb8594f6e3aaaa0bb077a8/greenlet-3.4.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f82cb6cddc27dd81c96b1506f4aa7def15070c3b2a67d4e46fd19016aacce6cf", size = 617549, upload-time = "2026-04-08T15:56:34.893Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c0/8966767de01343c1ff47e8b855dc78e7d1a8ed2b7b9c83576a57e289f81d/greenlet-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:227a46251ecba4ff46ae742bc5ce95c91d5aceb4b02f885487aff269c127a729", size = 1575310, upload-time = "2026-04-08T16:26:21.671Z" }, - { url = "https://files.pythonhosted.org/packages/b8/38/bcdc71ba05e9a5fda87f63ffc2abcd1f15693b659346df994a48c968003d/greenlet-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5b99e87be7eba788dd5b75ba1cde5639edffdec5f91fe0d734a249535ec3408c", size = 1640435, upload-time = "2026-04-08T15:57:32.572Z" }, - { url = "https://files.pythonhosted.org/packages/a1/c2/19b664b7173b9e4ef5f77e8cef9f14c20ec7fce7920dc1ccd7afd955d093/greenlet-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:849f8bc17acd6295fcb5de8e46d55cc0e52381c56eaf50a2afd258e97bc65940", size = 238760, upload-time = "2026-04-08T17:04:03.878Z" }, - { url = "https://files.pythonhosted.org/packages/9b/96/795619651d39c7fbd809a522f881aa6f0ead504cc8201c3a5b789dfaef99/greenlet-3.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9390ad88b652b1903814eaabd629ca184db15e0eeb6fe8a390bbf8b9106ae15a", size = 235498, upload-time = "2026-04-08T17:05:00.584Z" }, - { url = "https://files.pythonhosted.org/packages/78/02/bde66806e8f169cf90b14d02c500c44cdbe02c8e224c9c67bafd1b8cadd1/greenlet-3.4.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:10a07aca6babdd18c16a3f4f8880acfffc2b88dfe431ad6aa5f5740759d7d75e", size = 286291, upload-time = "2026-04-08T17:09:34.307Z" }, - { url = "https://files.pythonhosted.org/packages/05/1f/39da1c336a87d47c58352fb8a78541ce63d63ae57c5b9dae1fe02801bbc2/greenlet-3.4.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:076e21040b3a917d3ce4ad68fb5c3c6b32f1405616c4a57aa83120979649bd3d", size = 656749, upload-time = "2026-04-08T16:24:41.721Z" }, - { url = "https://files.pythonhosted.org/packages/d3/6c/90ee29a4ee27af7aa2e2ec408799eeb69ee3fcc5abcecac6ddd07a5cd0f2/greenlet-3.4.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e82689eea4a237e530bb5cb41b180ef81fa2160e1f89422a67be7d90da67f615", size = 669084, upload-time = "2026-04-08T16:31:01.372Z" }, - { url = "https://files.pythonhosted.org/packages/07/49/d4cad6e5381a50947bb973d2f6cf6592621451b09368b8c20d9b8af49c5b/greenlet-3.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df3b0b2289ec686d3c821a5fee44259c05cfe824dd5e6e12c8e5f5df23085cf", size = 665621, upload-time = "2026-04-08T15:56:35.995Z" }, - { url = "https://files.pythonhosted.org/packages/37/31/d1edd54f424761b5d47718822f506b435b6aab2f3f93b465441143ea5119/greenlet-3.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8bff29d586ea415688f4cec96a591fcc3bf762d046a796cdadc1fdb6e7f2d5bf", size = 1622259, upload-time = "2026-04-08T16:26:23.201Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c6/6d3f9cdcb21c4e12a79cb332579f1c6aa1af78eb68059c5a957c7812d95e/greenlet-3.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a569c2fb840c53c13a2b8967c63621fafbd1a0e015b9c82f408c33d626a2fda", size = 1686916, upload-time = "2026-04-08T15:57:34.282Z" }, - { url = "https://files.pythonhosted.org/packages/63/45/c1ca4a1ad975de4727e52d3ffe641ae23e1d7a8ffaa8ff7a0477e1827b92/greenlet-3.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:207ba5b97ea8b0b60eb43ffcacf26969dd83726095161d676aac03ff913ee50d", size = 239821, upload-time = "2026-04-08T17:03:48.423Z" }, - { url = "https://files.pythonhosted.org/packages/71/c4/6f621023364d7e85a4769c014c8982f98053246d142420e0328980933ceb/greenlet-3.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:f8296d4e2b92af34ebde81085a01690f26a51eb9ac09a0fcadb331eb36dbc802", size = 236932, upload-time = "2026-04-08T17:04:33.551Z" }, - { url = "https://files.pythonhosted.org/packages/d4/8f/18d72b629783f5e8d045a76f5325c1e938e659a9e4da79c7dcd10169a48d/greenlet-3.4.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d70012e51df2dbbccfaf63a40aaf9b40c8bed37c3e3a38751c926301ce538ece", size = 294681, upload-time = "2026-04-08T15:52:35.778Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ad/5fa86ec46769c4153820d58a04062285b3b9e10ba3d461ee257b68dcbf53/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a58bec0751f43068cd40cff31bb3ca02ad6000b3a51ca81367af4eb5abc480c8", size = 658899, upload-time = "2026-04-08T16:24:43.32Z" }, - { url = "https://files.pythonhosted.org/packages/43/f0/4e8174ca0e87ae748c409f055a1ba161038c43cc0a5a6f1433a26ac2e5bf/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05fa0803561028f4b2e3b490ee41216a842eaee11aed004cc343a996d9523aa2", size = 665284, upload-time = "2026-04-08T16:31:02.833Z" }, - { url = "https://files.pythonhosted.org/packages/19/da/991cf7cd33662e2df92a1274b7eb4d61769294d38a1bba8a45f31364845e/greenlet-3.4.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e60d38719cb80b3ab5e85f9f1aed4960acfde09868af6762ccb27b260d68f4ed", size = 661861, upload-time = "2026-04-08T15:56:37.269Z" }, - { url = "https://files.pythonhosted.org/packages/36/c5/6c2c708e14db3d9caea4b459d8464f58c32047451142fe2cfd90e7458f41/greenlet-3.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f50c804733b43eded05ae694691c9aa68bca7d0a867d67d4a3f514742a2d53f", size = 1622182, upload-time = "2026-04-08T16:26:24.777Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4c/50c5fed19378e11a29fabab1f6be39ea95358f4a0a07e115a51ca93385d8/greenlet-3.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2d4f0635dc4aa638cda4b2f5a07ae9a2cff9280327b581a3fcb6f317b4fbc38a", size = 1685050, upload-time = "2026-04-08T15:57:36.453Z" }, - { url = "https://files.pythonhosted.org/packages/db/72/85ae954d734703ab48e622c59d4ce35d77ce840c265814af9c078cacc7aa/greenlet-3.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1a4a48f24681300c640f143ba7c404270e1ebbbcf34331d7104a4ff40f8ea705", size = 245554, upload-time = "2026-04-08T17:03:50.044Z" }, -] - -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - -[[package]] -name = "idna" -version = "3.17" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/28/99c51f664567218d824af024c0251650fb27e4ca066df188dab0769c5b91/idna-3.17.tar.gz", hash = "sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f", size = 196048, upload-time = "2026-05-28T14:32:38.55Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl", hash = "sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c", size = 65316, upload-time = "2026-05-28T14:32:37.035Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", size = 27789, upload-time = "2026-03-20T06:42:55.665Z" }, -] - -[[package]] -name = "ipykernel" -version = "7.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "appnope", marker = "sys_platform == 'darwin'" }, - { name = "comm" }, - { name = "debugpy" }, - { name = "ipython" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "matplotlib-inline" }, - { name = "nest-asyncio" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" }, -] - -[[package]] -name = "ipython" -version = "9.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "ipython-pygments-lexers" }, - { name = "jedi" }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/73/7114f80a8f9cabdb13c27732dce24af945b2923dcab80723602f7c8bc2d8/ipython-9.12.0.tar.gz", hash = "sha256:01daa83f504b693ba523b5a407246cabde4eb4513285a3c6acaff11a66735ee4", size = 4428879, upload-time = "2026-03-27T09:42:45.312Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/22/906c8108974c673ebef6356c506cebb6870d48cedea3c41e949e2dd556bb/ipython-9.12.0-py3-none-any.whl", hash = "sha256:0f2701e8ee86e117e37f50563205d36feaa259d2e08d4a6bc6b6d74b18ce128d", size = 625661, upload-time = "2026-03-27T09:42:42.831Z" }, -] - -[[package]] -name = "ipython-pygments-lexers" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, -] - -[[package]] -name = "ipywidgets" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "comm" }, - { name = "ipython" }, - { name = "jupyterlab-widgets" }, - { name = "traitlets" }, - { name = "widgetsnbextension" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, -] - -[[package]] -name = "isoduration" -version = "20.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "arrow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, -] - -[[package]] -name = "jedi" -version = "0.19.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "parso" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, -] - -[[package]] -name = "joblib" -version = "1.5.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, -] - -[[package]] -name = "json5" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/4b/6f8906aaf67d501e259b0adab4d312945bb7211e8b8d4dcc77c92320edaa/json5-0.14.0.tar.gz", hash = "sha256:b3f492fad9f6cdbced8b7d40b28b9b1c9701c5f561bef0d33b81c2ff433fefcb", size = 52656, upload-time = "2026-03-27T22:50:48.108Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl", hash = "sha256:56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a", size = 36271, upload-time = "2026-03-27T22:50:47.073Z" }, -] - -[[package]] -name = "jsonpointer" -version = "3.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, -] - -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, -] - -[package.optional-dependencies] -format-nongpl = [ - { name = "fqdn" }, - { name = "idna" }, - { name = "isoduration" }, - { name = "jsonpointer" }, - { name = "rfc3339-validator" }, - { name = "rfc3986-validator" }, - { name = "rfc3987-syntax" }, - { name = "uri-template" }, - { name = "webcolors" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, -] - -[[package]] -name = "jupyter" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "ipywidgets" }, - { name = "jupyter-console" }, - { name = "jupyterlab" }, - { name = "nbconvert" }, - { name = "notebook" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, -] - -[[package]] -name = "jupyter-cache" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "click" }, - { name = "importlib-metadata" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "pyyaml" }, - { name = "sqlalchemy" }, - { name = "tabulate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bb/f7/3627358075f183956e8c4974603232b03afd4ddc7baf72c2bc9fff522291/jupyter_cache-1.0.1.tar.gz", hash = "sha256:16e808eb19e3fb67a223db906e131ea6e01f03aa27f49a7214ce6a5fec186fb9", size = 32048, upload-time = "2024-11-15T16:03:55.322Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/6b/67b87da9d36bff9df7d0efbd1a325fa372a43be7158effaf43ed7b22341d/jupyter_cache-1.0.1-py3-none-any.whl", hash = "sha256:9c3cafd825ba7da8b5830485343091143dff903e4d8c69db9349b728b140abf6", size = 33907, upload-time = "2024-11-15T16:03:54.021Z" }, -] - -[[package]] -name = "jupyter-client" -version = "8.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-core" }, - { name = "python-dateutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, -] - -[[package]] -name = "jupyter-console" -version = "6.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "ipython" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "pyzmq" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, -] - -[[package]] -name = "jupyter-core" -version = "5.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "platformdirs" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, -] - -[[package]] -name = "jupyter-events" -version = "0.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonschema", extra = ["format-nongpl"] }, - { name = "packaging" }, - { name = "python-json-logger" }, - { name = "pyyaml" }, - { name = "referencing" }, - { name = "rfc3339-validator" }, - { name = "rfc3986-validator" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, -] - -[[package]] -name = "jupyter-lsp" -version = "2.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-server" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, -] - -[[package]] -name = "jupyter-server" -version = "2.19.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "argon2-cffi" }, - { name = "jinja2" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "jupyter-events" }, - { name = "jupyter-server-terminals" }, - { name = "nbconvert" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "prometheus-client" }, - { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'darwin'" }, - { name = "pyzmq" }, - { name = "send2trash" }, - { name = "terminado" }, - { name = "tornado" }, - { name = "traitlets" }, - { name = "websocket-client" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/a0/eb3c511f54df7b54ca5fc7bff3f4d2277d69052d6a7f521643dfed5279d6/jupyter_server-2.19.0.tar.gz", hash = "sha256:1731236bc32b680223e1ceb9d68209a845203475012ef68773a81434b46a31a7", size = 754561, upload-time = "2026-05-29T11:21:26.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/78/d2881e68894cecdcd05912a9c585cfb776ef1fb38b62c8dba98f12ab3adc/jupyter_server-2.19.0-py3-none-any.whl", hash = "sha256:cb76591b76d7093584c2ad2ae72ac3d58614a4b597507a1bb04e1f9f683cf9ea", size = 392244, upload-time = "2026-05-29T11:21:23.871Z" }, -] - -[[package]] -name = "jupyter-server-terminals" -version = "0.5.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'darwin'" }, - { name = "terminado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" }, -] - -[[package]] -name = "jupyterlab" -version = "4.5.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "async-lru" }, - { name = "httpx" }, - { name = "ipykernel" }, - { name = "jinja2" }, - { name = "jupyter-core" }, - { name = "jupyter-lsp" }, - { name = "jupyter-server" }, - { name = "jupyterlab-server" }, - { name = "notebook-shim" }, - { name = "packaging" }, - { name = "setuptools" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2b/22/8440ec827762146e7cdecf04335bd348795899d29dc6ae82238707353a2c/jupyterlab-4.5.7.tar.gz", hash = "sha256:55a9822c4754da305f41e113452c68383e214dcf96de760146af89ce5d5117b0", size = 23992763, upload-time = "2026-04-29T16:43:51.328Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl", hash = "sha256:fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d", size = 12450123, upload-time = "2026-04-29T16:43:46.639Z" }, -] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, -] - -[[package]] -name = "jupyterlab-server" -version = "2.28.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "babel" }, - { name = "jinja2" }, - { name = "json5" }, - { name = "jsonschema" }, - { name = "jupyter-server" }, - { name = "packaging" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, -] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, -] - -[[package]] -name = "kiwisolver" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, - { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, - { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, - { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, - { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, - { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, - { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, - { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, - { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, - { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, - { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, - { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, - { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, - { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, - { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, - { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, - { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, - { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, - { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, - { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, - { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, - { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, - { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, - { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, - { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, - { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, - { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, - { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, - { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, - { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, - { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, - { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, - { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, - { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, -] - -[[package]] -name = "lark" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, -] - -[[package]] -name = "markdown" -version = "3.10.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, -] - -[[package]] -name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, -] - -[[package]] -name = "matplotlib" -version = "3.10.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "contourpy" }, - { name = "cycler" }, - { name = "fonttools" }, - { name = "kiwisolver" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyparsing" }, - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, - { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, - { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, - { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, - { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, - { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, - { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, - { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, - { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, - { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, - { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, - { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, - { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, - { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, - { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, - { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, - { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, - { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, - { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, -] - -[[package]] -name = "matplotlib-inline" -version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, -] - -[[package]] -name = "mistune" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, -] - -[[package]] -name = "narwhals" -version = "2.19.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/1a/bd3317c0bdbcd9ffb710ddf5250b32898f8f2c240be99494fe137feb77a7/narwhals-2.19.0.tar.gz", hash = "sha256:14fd7040b5ff211d415a82e4827b9d04c354e213e72a6d0730205ffd72e3b7ff", size = 623698, upload-time = "2026-04-06T15:50:58.786Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/72/e61e3091e0e00fae9d3a8ef85ece9d2cd4b5966058e1f2901ce42679eebf/narwhals-2.19.0-py3-none-any.whl", hash = "sha256:1f8dfa4a33a6dbff878c3e9be4c3b455dfcaf2a9322f1357db00e4e92e95b84b", size = 446991, upload-time = "2026-04-06T15:50:57.046Z" }, -] - -[[package]] -name = "nbclient" -version = "0.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "nbformat" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, -] - -[[package]] -name = "nbconvert" -version = "7.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "bleach", extra = ["css"] }, - { name = "defusedxml" }, - { name = "jinja2" }, - { name = "jupyter-core" }, - { name = "jupyterlab-pygments" }, - { name = "markupsafe" }, - { name = "mistune" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "pandocfilters" }, - { name = "pygments" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, -] - -[[package]] -name = "nbformat" -version = "5.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema" }, - { name = "jupyter-core" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, -] - -[[package]] -name = "nest-asyncio" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, -] - -[[package]] -name = "notebook" -version = "7.5.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-server" }, - { name = "jupyterlab" }, - { name = "jupyterlab-server" }, - { name = "notebook-shim" }, - { name = "tornado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2a/c2/cf59bd2e6f2c8b976b52477e3e53bf6f97bc714ed046a51821afb428eaee/notebook-7.5.6.tar.gz", hash = "sha256:621174aade80108f0020b0f00738000b215f75fa3cd90771ad7aa0f24536a4e1", size = 14170814, upload-time = "2026-04-30T11:46:26.613Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/d6/1fd0646b9bbd9efbb0b8ae21b2325fbef515769a5621c03e31d8eb8da587/notebook-7.5.6-py3-none-any.whl", hash = "sha256:4dde3f8fb55fa8fb7946d58c6e869ce9baf46d00fc070664f62604569d0faca0", size = 14581730, upload-time = "2026-04-30T11:46:22.342Z" }, -] - -[[package]] -name = "notebook-shim" -version = "0.2.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-server" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, -] - -[[package]] -name = "numpy" -version = "2.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, - { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, - { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, - { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, - { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, - { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, - { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, - { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, - { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, - { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, - { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, - { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, - { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, - { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, - { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, - { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, - { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, - { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, - { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, - { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, - { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, - { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, - { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, - { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, - { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, - { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, - { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, - { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, - { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, - { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, - { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, -] - -[[package]] -name = "packaging" -version = "26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, -] - -[[package]] -name = "pandas" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "python-dateutil" }, - { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/ca/3e639a1ea6fcd0617ca4e8ca45f62a74de33a56ae6cd552735470b22c8d3/pandas-3.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5918ba197c951dec132b0c5929a00c0bf05d5942f590d3c10a807f6e15a57d3", size = 10321105, upload-time = "2026-03-31T06:46:57.327Z" }, - { url = "https://files.pythonhosted.org/packages/0b/77/dbc82ff2fb0e63c6564356682bf201edff0ba16c98630d21a1fb312a8182/pandas-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d606a041c89c0a474a4702d532ab7e73a14fe35c8d427b972a625c8e46373668", size = 9864088, upload-time = "2026-03-31T06:46:59.935Z" }, - { url = "https://files.pythonhosted.org/packages/5c/2b/341f1b04bbca2e17e13cd3f08c215b70ef2c60c5356ef1e8c6857449edc7/pandas-3.0.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:710246ba0616e86891b58ab95f2495143bb2bc83ab6b06747c74216f583a6ac9", size = 10369066, upload-time = "2026-03-31T06:47:02.792Z" }, - { url = "https://files.pythonhosted.org/packages/12/c5/cbb1ffefb20a93d3f0e1fdcda699fb84976210d411b008f97f48bf6ce27e/pandas-3.0.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d3cfe227c725b1f3dff4278b43d8c784656a42a9325b63af6b1492a8232209e", size = 10876780, upload-time = "2026-03-31T06:47:06.205Z" }, - { url = "https://files.pythonhosted.org/packages/98/fe/2249ae5e0a69bd0ddf17353d0a5d26611d70970111f5b3600cdc8be883e7/pandas-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c3b723df9087a9a9a840e263ebd9f88b64a12075d1bf2ea401a5a42f254f084d", size = 11375181, upload-time = "2026-03-31T06:47:09.383Z" }, - { url = "https://files.pythonhosted.org/packages/de/64/77a38b09e70b6464883b8d7584ab543e748e42c1b5d337a2ee088e0df741/pandas-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3096110bf9eac0070b7208465f2740e2d8a670d5cb6530b5bb884eca495fd39", size = 11928899, upload-time = "2026-03-31T06:47:12.686Z" }, - { url = "https://files.pythonhosted.org/packages/5e/52/42855bf626868413f761addd574acc6195880ae247a5346477a4361c3acb/pandas-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:07a10f5c36512eead51bc578eb3354ad17578b22c013d89a796ab5eee90cd991", size = 9746574, upload-time = "2026-03-31T06:47:15.64Z" }, - { url = "https://files.pythonhosted.org/packages/88/39/21304ae06a25e8bf9fc820d69b29b2c495b2ae580d1e143146c309941760/pandas-3.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:5fdbfa05931071aba28b408e59226186b01eb5e92bea2ab78b65863ca3228d84", size = 9047156, upload-time = "2026-03-31T06:47:18.595Z" }, - { url = "https://files.pythonhosted.org/packages/72/20/7defa8b27d4f330a903bb68eea33be07d839c5ea6bdda54174efcec0e1d2/pandas-3.0.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:dbc20dea3b9e27d0e66d74c42b2d0c1bed9c2ffe92adea33633e3bedeb5ac235", size = 10756238, upload-time = "2026-03-31T06:47:22.012Z" }, - { url = "https://files.pythonhosted.org/packages/e9/95/49433c14862c636afc0e9b2db83ff16b3ad92959364e52b2955e44c8e94c/pandas-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b75c347eff42497452116ce05ef461822d97ce5b9ff8df6edacb8076092c855d", size = 10408520, upload-time = "2026-03-31T06:47:25.197Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f8/462ad2b5881d6b8ec8e5f7ed2ea1893faa02290d13870a1600fe72ad8efc/pandas-3.0.2-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1478075142e83a5571782ad007fb201ed074bdeac7ebcc8890c71442e96adf7", size = 10324154, upload-time = "2026-03-31T06:47:28.097Z" }, - { url = "https://files.pythonhosted.org/packages/0a/65/d1e69b649cbcddda23ad6e4c40ef935340f6f652a006e5cbc3555ac8adb3/pandas-3.0.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5880314e69e763d4c8b27937090de570f1fb8d027059a7ada3f7f8e98bdcb677", size = 10714449, upload-time = "2026-03-31T06:47:30.85Z" }, - { url = "https://files.pythonhosted.org/packages/47/a4/85b59bc65b8190ea3689882db6cdf32a5003c0ccd5a586c30fdcc3ffc4fc/pandas-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5329e26898896f06035241a626d7c335daa479b9bbc82be7c2742d048e41172", size = 11338475, upload-time = "2026-03-31T06:47:34.026Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c4/bc6966c6e38e5d9478b935272d124d80a589511ed1612a5d21d36f664c68/pandas-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:81526c4afd31971f8b62671442a4b2b51e0aa9acc3819c9f0f12a28b6fcf85f1", size = 11786568, upload-time = "2026-03-31T06:47:36.941Z" }, - { url = "https://files.pythonhosted.org/packages/e8/74/09298ca9740beed1d3504e073d67e128aa07e5ca5ca2824b0c674c0b8676/pandas-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:7cadd7e9a44ec13b621aec60f9150e744cfc7a3dd32924a7e2f45edff31823b0", size = 10488652, upload-time = "2026-03-31T06:47:40.612Z" }, - { url = "https://files.pythonhosted.org/packages/bb/40/c6ea527147c73b24fc15c891c3fcffe9c019793119c5742b8784a062c7db/pandas-3.0.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:db0dbfd2a6cdf3770aa60464d50333d8f3d9165b2f2671bcc299b72de5a6677b", size = 10326084, upload-time = "2026-03-31T06:47:43.834Z" }, - { url = "https://files.pythonhosted.org/packages/95/25/bdb9326c3b5455f8d4d3549fce7abcf967259de146fe2cf7a82368141948/pandas-3.0.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0555c5882688a39317179ab4a0ed41d3ebc8812ab14c69364bbee8fb7a3f6288", size = 9914146, upload-time = "2026-03-31T06:47:46.67Z" }, - { url = "https://files.pythonhosted.org/packages/8d/77/3a227ff3337aa376c60d288e1d61c5d097131d0ac71f954d90a8f369e422/pandas-3.0.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01f31a546acd5574ef77fe199bc90b55527c225c20ccda6601cf6b0fd5ed597c", size = 10444081, upload-time = "2026-03-31T06:47:49.681Z" }, - { url = "https://files.pythonhosted.org/packages/15/88/3cdd54fa279341afa10acf8d2b503556b1375245dccc9315659f795dd2e9/pandas-3.0.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:deeca1b5a931fdf0c2212c8a659ade6d3b1edc21f0914ce71ef24456ca7a6535", size = 10897535, upload-time = "2026-03-31T06:47:53.033Z" }, - { url = "https://files.pythonhosted.org/packages/06/9d/98cc7a7624f7932e40f434299260e2917b090a579d75937cb8a57b9d2de3/pandas-3.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f48afd9bb13300ffb5a3316973324c787054ba6665cda0da3fbd67f451995db", size = 11446992, upload-time = "2026-03-31T06:47:56.193Z" }, - { url = "https://files.pythonhosted.org/packages/9a/cd/19ff605cc3760e80602e6826ddef2824d8e7050ed80f2e11c4b079741dc3/pandas-3.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6c4d8458b97a35717b62469a4ea0e85abd5ed8687277f5ccfc67f8a5126f8c53", size = 11968257, upload-time = "2026-03-31T06:47:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/db/60/aba6a38de456e7341285102bede27514795c1eaa353bc0e7638b6b785356/pandas-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:b35d14bb5d8285d9494fe93815a9e9307c0876e10f1e8e89ac5b88f728ec8dcf", size = 9865893, upload-time = "2026-03-31T06:48:02.038Z" }, - { url = "https://files.pythonhosted.org/packages/08/71/e5ec979dd2e8a093dacb8864598c0ff59a0cee0bbcdc0bfec16a51684d4f/pandas-3.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:63d141b56ef686f7f0d714cfb8de4e320475b86bf4b620aa0b7da89af8cbdbbb", size = 9188644, upload-time = "2026-03-31T06:48:05.045Z" }, - { url = "https://files.pythonhosted.org/packages/f1/6c/7b45d85db19cae1eb524f2418ceaa9d85965dcf7b764ed151386b7c540f0/pandas-3.0.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:140f0cffb1fa2524e874dde5b477d9defe10780d8e9e220d259b2c0874c89d9d", size = 10776246, upload-time = "2026-03-31T06:48:07.789Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3e/7b00648b086c106e81766f25322b48aa8dfa95b55e621dbdf2fdd413a117/pandas-3.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae37e833ff4fed0ba352f6bdd8b73ba3ab3256a85e54edfd1ab51ae40cca0af8", size = 10424801, upload-time = "2026-03-31T06:48:10.897Z" }, - { url = "https://files.pythonhosted.org/packages/da/6e/558dd09a71b53b4008e7fc8a98ec6d447e9bfb63cdaeea10e5eb9b2dabe8/pandas-3.0.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d888a5c678a419a5bb41a2a93818e8ed9fd3172246555c0b37b7cc27027effd", size = 10345643, upload-time = "2026-03-31T06:48:13.7Z" }, - { url = "https://files.pythonhosted.org/packages/be/e3/921c93b4d9a280409451dc8d07b062b503bbec0531d2627e73a756e99a82/pandas-3.0.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b444dc64c079e84df91baa8bf613d58405645461cabca929d9178f2cd392398d", size = 10743641, upload-time = "2026-03-31T06:48:16.659Z" }, - { url = "https://files.pythonhosted.org/packages/56/ca/fd17286f24fa3b4d067965d8d5d7e14fe557dd4f979a0b068ac0deaf8228/pandas-3.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4544c7a54920de8eeacaa1466a6b7268ecfbc9bc64ab4dbb89c6bbe94d5e0660", size = 11361993, upload-time = "2026-03-31T06:48:19.475Z" }, - { url = "https://files.pythonhosted.org/packages/e4/a5/2f6ed612056819de445a433ca1f2821ac3dab7f150d569a59e9cc105de1d/pandas-3.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:734be7551687c00fbd760dc0522ed974f82ad230d4a10f54bf51b80d44a08702", size = 11815274, upload-time = "2026-03-31T06:48:22.695Z" }, - { url = "https://files.pythonhosted.org/packages/00/2f/b622683e99ec3ce00b0854bac9e80868592c5b051733f2cf3a868e5fea26/pandas-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:57a07209bebcbcf768d2d13c9b78b852f9a15978dac41b9e6421a81ad4cdd276", size = 10888530, upload-time = "2026-03-31T06:48:25.806Z" }, - { url = "https://files.pythonhosted.org/packages/cb/2b/f8434233fab2bd66a02ec014febe4e5adced20e2693e0e90a07d118ed30e/pandas-3.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:5371b72c2d4d415d08765f32d689217a43227484e81b2305b52076e328f6f482", size = 9455341, upload-time = "2026-03-31T06:48:28.418Z" }, -] - -[[package]] -name = "pandocfilters" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, -] - -[[package]] -name = "parso" -version = "0.8.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, -] - -[[package]] -name = "pexpect" -version = "4.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, -] - -[[package]] -name = "pillow" -version = "12.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, - { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, - { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, - { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, - { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, - { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, - { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, - { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, - { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, - { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, - { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, - { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, - { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, - { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, - { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, - { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, - { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, - { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, - { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, - { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, - { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, - { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, - { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, - { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, - { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, - { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, - { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, - { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, - { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, - { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, - { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, - { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, - { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, - { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.9.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, -] - -[[package]] -name = "plotly" -version = "6.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "narwhals" }, - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/7f/0f100df1172aadf88a929a9dbb902656b0880ba4b960fe5224867159d8f4/plotly-6.7.0.tar.gz", hash = "sha256:45eea0ff27e2a23ccd62776f77eb43aa1ca03df4192b76036e380bb479b892c6", size = 6911286, upload-time = "2026-04-09T20:36:45.738Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl", hash = "sha256:ac8aca1c25c663a59b5b9140a549264a5badde2e057d79b8c772ae2920e32ff0", size = 9898444, upload-time = "2026-04-09T20:36:39.812Z" }, -] - -[[package]] -name = "prometheus-client" -version = "0.25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, -] - -[[package]] -name = "prompt-toolkit" -version = "3.0.52" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, -] - -[[package]] -name = "psutil" -version = "7.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, - { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, - { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, - { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, - { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, - { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, - { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, - { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, - { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, - { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, - { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, - { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, - { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, - { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, - { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, - { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, -] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, -] - -[[package]] -name = "pure-eval" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, -] - -[[package]] -name = "pycparser" -version = "3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, -] - -[[package]] -name = "pygments" -version = "2.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, -] - -[[package]] -name = "pyparsing" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, -] - -[[package]] -name = "pyproject-hooks" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - -[[package]] -name = "python-json-logger" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, -] - -[[package]] -name = "python-markdown-math" -version = "0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4c/68/fbea05ec6fb318bdcf56ea47596605614554f51d77bfd14f6fb481139ad8/python_markdown_math-0.9.tar.gz", hash = "sha256:567395553dc4941e79b3789a1096dcabb3fda9539d150d558ef3507948b264a3", size = 8680, upload-time = "2025-04-10T10:10:31.84Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/68/ecf3535c40845de2efd8ac2d092dd5fca0868219fa3684d9e58ef7abeece/python_markdown_math-0.9-py3-none-any.whl", hash = "sha256:ac9932df517a5c0f6d01c56e7a44d065eca4a420893ac45f7a6937c67cb41e86", size = 6046, upload-time = "2025-04-10T10:10:30.318Z" }, -] - -[[package]] -name = "pywinpty" -version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/54/37c7370ba91f579235049dc26cd2c5e657d2a943e01820844ffc81f32176/pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412", size = 31309, upload-time = "2026-02-04T21:51:09.524Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/cb/58d6ed3fd429c96a90ef01ac9a617af10a6d41469219c25e7dc162abbb71/pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab", size = 2112686, upload-time = "2026-02-04T21:52:03.035Z" }, - { url = "https://files.pythonhosted.org/packages/fd/50/724ed5c38c504d4e58a88a072776a1e880d970789deaeb2b9f7bd9a5141a/pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523", size = 234591, upload-time = "2026-02-04T21:52:29.821Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ad/90a110538696b12b39fd8758a06d70ded899308198ad2305ac68e361126e/pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a", size = 2112360, upload-time = "2026-02-04T21:55:33.397Z" }, - { url = "https://files.pythonhosted.org/packages/44/0f/7ffa221757a220402bc79fda44044c3f2cc57338d878ab7d622add6f4581/pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759", size = 233107, upload-time = "2026-02-04T21:51:45.455Z" }, - { url = "https://files.pythonhosted.org/packages/28/88/2ff917caff61e55f38bcdb27de06ee30597881b2cae44fbba7627be015c4/pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9", size = 2113282, upload-time = "2026-02-04T21:52:08.188Z" }, - { url = "https://files.pythonhosted.org/packages/63/32/40a775343ace542cc43ece3f1d1fce454021521ecac41c4c4573081c2336/pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019", size = 234207, upload-time = "2026-02-04T21:51:58.687Z" }, - { url = "https://files.pythonhosted.org/packages/8d/54/5d5e52f4cb75028104ca6faf36c10f9692389b1986d34471663b4ebebd6d/pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1", size = 2112910, upload-time = "2026-02-04T21:52:30.976Z" }, - { url = "https://files.pythonhosted.org/packages/0a/44/dcd184824e21d4620b06c7db9fbb15c3ad0a0f1fa2e6de79969fb82647ec/pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5", size = 233425, upload-time = "2026-02-04T21:51:56.754Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - -[[package]] -name = "pyzmq" -version = "27.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, - { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, - { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, - { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, - { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, - { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, - { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, - { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, - { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, - { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, - { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, - { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, - { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, - { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, - { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, - { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, - { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, - { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, - { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, - { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, - { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, - { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, -] - -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, -] - -[[package]] -name = "requests" -version = "2.33.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, -] - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, -] - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, -] - -[[package]] -name = "rfc3987-syntax" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lark" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, -] - -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, -] - -[[package]] -name = "scikit-learn" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "numpy" }, - { name = "scipy" }, - { name = "threadpoolctl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, - { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, - { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, - { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, - { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, - { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, - { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, - { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, - { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, - { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, - { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, - { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, - { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, - { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, - { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, - { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, - { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, - { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, - { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, -] - -[[package]] -name = "scipy" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, - { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, - { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, - { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, - { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, - { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, - { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, - { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, - { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, - { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, - { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, - { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, - { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, - { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, - { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, - { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, - { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, - { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, - { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, - { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, - { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, - { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, - { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, - { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, - { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, - { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, - { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, - { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, - { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, - { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, -] - -[[package]] -name = "seaborn" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "matplotlib" }, - { name = "numpy" }, - { name = "pandas" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, -] - -[[package]] -name = "send2trash" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, -] - -[[package]] -name = "setuptools" -version = "81.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - -[[package]] -name = "soupsieve" -version = "2.8.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, -] - -[[package]] -name = "spotdesirability" -version = "0.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "build" }, - { name = "matplotlib" }, - { name = "nbformat" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "pillow" }, - { name = "python-markdown-math" }, - { name = "scipy" }, - { name = "seaborn" }, - { name = "tabulate" }, - { name = "typing-extensions" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7b/29/d8ca06f4c063fc279c30dfd34124fa192d03f90c978932b13e70bc48a93a/spotdesirability-0.1.1.tar.gz", hash = "sha256:9fb2c21880faf2f5dca3039345aebb1484fc3d34e34247f2089c7d8edd1c086a", size = 29246, upload-time = "2026-03-30T16:57:32.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/ec/b1bda57445775820eb521373c0c29e0aa024da7e30b98068ed66e9b7aa59/spotdesirability-0.1.1-py3-none-any.whl", hash = "sha256:96e300b94c8c55565418d75424199b41ad584f00b79e4d3a95e63dd16fc10b57", size = 30811, upload-time = "2026-03-30T16:57:31.593Z" }, -] - -[[package]] -name = "spotoptim" -version = "1.0.1" -source = { editable = "../" } -dependencies = [ - { name = "dill" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "scikit-learn" }, - { name = "scipy" }, - { name = "tabulate" }, -] - -[package.metadata] -requires-dist = [ - { name = "bandit", marker = "extra == 'dev'", specifier = ">=1.8.0" }, - { name = "black", marker = "extra == 'dev'", specifier = ">=24.1.0" }, - { name = "colorama", marker = "extra == 'docs'", specifier = ">=0.4.6" }, - { name = "dill", specifier = ">=0.4.1" }, - { name = "griffe", marker = "extra == 'docs'", specifier = ">=1.7.3" }, - { name = "importlib-metadata", marker = "extra == 'docs'" }, - { name = "isort", marker = "extra == 'dev'", specifier = ">=5.13.0" }, - { name = "jupyter", marker = "extra == 'docs'", specifier = ">=1.1.1" }, - { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.10.7" }, - { name = "numpy", specifier = ">=1.24.3" }, - { name = "pandas", specifier = ">=2.1.0" }, - { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.7.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, - { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, - { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.3.0" }, - { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.5.0" }, - { name = "quartodoc", marker = "extra == 'docs'", specifier = ">=0.11.1" }, - { name = "requests", marker = "extra == 'remote'", specifier = ">=2.32.3" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.3.0" }, - { name = "safety", marker = "extra == 'dev'", specifier = ">=3.0.0" }, - { name = "scikit-learn", specifier = ">=1.5.0" }, - { name = "scipy", specifier = ">=1.10.1" }, - { name = "seaborn", marker = "extra == 'viz'", specifier = ">=0.13.2" }, - { name = "spotdesirability", marker = "extra == 'dev'", specifier = ">=0.0.1" }, - { name = "spotoptim", extras = ["all"], marker = "extra == 'dev'" }, - { name = "spotoptim", extras = ["torch", "viz", "stats", "remote"], marker = "extra == 'all'" }, - { name = "statsmodels", marker = "extra == 'stats'", specifier = ">=0.14.6" }, - { name = "tabulate", specifier = ">=0.9.0" }, - { name = "tensorboard", marker = "extra == 'torch'", specifier = ">=2.20.0" }, - { name = "torch", marker = "extra == 'torch'", specifier = ">=2.9.1", index = "https://download.pytorch.org/whl/cpu" }, - { name = "ty", marker = "extra == 'dev'", specifier = ">=0.0.29" }, -] -provides-extras = ["torch", "viz", "stats", "remote", "all", "dev", "docs"] - -[package.metadata.requires-dev] -dev = [ - { name = "bandit", specifier = ">=1.8.0" }, - { name = "black", specifier = ">=24.1.0" }, - { name = "isort", specifier = ">=5.13.0" }, - { name = "pre-commit", specifier = ">=3.7.0" }, - { name = "pytest", specifier = ">=7.4.0" }, - { name = "pytest-cov", specifier = ">=4.1.0" }, - { name = "pytest-timeout", specifier = ">=2.3.0" }, - { name = "pytest-xdist", specifier = ">=3.5.0" }, - { name = "ruff", specifier = ">=0.3.0" }, - { name = "safety", specifier = ">=3.0.0" }, - { name = "ty", specifier = ">=0.0.29" }, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.49" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/45/461788f35e0364a8da7bda51a1fe1b09762d0c32f12f63727998d85a873b/sqlalchemy-2.0.49.tar.gz", hash = "sha256:d15950a57a210e36dd4cec1aac22787e2a4d57ba9318233e2ef8b2daf9ff2d5f", size = 9898221, upload-time = "2026-04-03T16:38:11.704Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/81/81755f50eb2478eaf2049728491d4ea4f416c1eb013338682173259efa09/sqlalchemy-2.0.49-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df2d441bacf97022e81ad047e1597552eb3f83ca8a8f1a1fdd43cd7fe3898120", size = 2154547, upload-time = "2026-04-03T16:53:08.64Z" }, - { url = "https://files.pythonhosted.org/packages/a2/bc/3494270da80811d08bcfa247404292428c4fe16294932bce5593f215cad9/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e20e511dc15265fb433571391ba313e10dd8ea7e509d51686a51313b4ac01a2", size = 3280782, upload-time = "2026-04-03T17:07:43.508Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f5/038741f5e747a5f6ea3e72487211579d8cbea5eb9827a9cbd61d0108c4bd/sqlalchemy-2.0.49-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47604cb2159f8bbd5a1ab48a714557156320f20871ee64d550d8bf2683d980d3", size = 3297156, upload-time = "2026-04-03T17:12:27.697Z" }, - { url = "https://files.pythonhosted.org/packages/88/50/a6af0ff9dc954b43a65ca9b5367334e45d99684c90a3d3413fc19a02d43c/sqlalchemy-2.0.49-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:22d8798819f86720bc646ab015baff5ea4c971d68121cb36e2ebc2ee43ead2b7", size = 3228832, upload-time = "2026-04-03T17:07:45.38Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d1/5f6bdad8de0bf546fc74370939621396515e0cdb9067402d6ba1b8afbe9a/sqlalchemy-2.0.49-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9b1c058c171b739e7c330760044803099c7fff11511e3ab3573e5327116a9c33", size = 3267000, upload-time = "2026-04-03T17:12:29.657Z" }, - { url = "https://files.pythonhosted.org/packages/f7/30/ad62227b4a9819a5e1c6abff77c0f614fa7c9326e5a3bdbee90f7139382b/sqlalchemy-2.0.49-cp313-cp313-win32.whl", hash = "sha256:a143af2ea6672f2af3f44ed8f9cd020e9cc34c56f0e8db12019d5d9ecf41cb3b", size = 2115641, upload-time = "2026-04-03T17:05:43.989Z" }, - { url = "https://files.pythonhosted.org/packages/17/3a/7215b1b7d6d49dc9a87211be44562077f5f04f9bb5a59552c1c8e2d98173/sqlalchemy-2.0.49-cp313-cp313-win_amd64.whl", hash = "sha256:12b04d1db2663b421fe072d638a138460a51d5a862403295671c4f3987fb9148", size = 2141498, upload-time = "2026-04-03T17:05:45.7Z" }, - { url = "https://files.pythonhosted.org/packages/28/4b/52a0cb2687a9cd1648252bb257be5a1ba2c2ded20ba695c65756a55a15a4/sqlalchemy-2.0.49-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24bd94bb301ec672d8f0623eba9226cc90d775d25a0c92b5f8e4965d7f3a1518", size = 3560807, upload-time = "2026-04-03T16:58:31.666Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d8/fda95459204877eed0458550d6c7c64c98cc50c2d8d618026737de9ed41a/sqlalchemy-2.0.49-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a51d3db74ba489266ef55c7a4534eb0b8db9a326553df481c11e5d7660c8364d", size = 3527481, upload-time = "2026-04-03T17:06:00.155Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0a/2aac8b78ac6487240cf7afef8f203ca783e8796002dc0cf65c4ee99ff8bb/sqlalchemy-2.0.49-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:55250fe61d6ebfd6934a272ee16ef1244e0f16b7af6cd18ab5b1fc9f08631db0", size = 3468565, upload-time = "2026-04-03T16:58:33.414Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3d/ce71cfa82c50a373fd2148b3c870be05027155ce791dc9a5dcf439790b8b/sqlalchemy-2.0.49-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:46796877b47034b559a593d7e4b549aba151dae73f9e78212a3478161c12ab08", size = 3477769, upload-time = "2026-04-03T17:06:02.787Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e8/0a9f5c1f7c6f9ca480319bf57c2d7423f08d31445974167a27d14483c948/sqlalchemy-2.0.49-cp313-cp313t-win32.whl", hash = "sha256:9c4969a86e41454f2858256c39bdfb966a20961e9b58bf8749b65abf447e9a8d", size = 2143319, upload-time = "2026-04-03T17:02:04.328Z" }, - { url = "https://files.pythonhosted.org/packages/0e/51/fb5240729fbec73006e137c4f7a7918ffd583ab08921e6ff81a999d6517a/sqlalchemy-2.0.49-cp313-cp313t-win_amd64.whl", hash = "sha256:b9870d15ef00e4d0559ae10ee5bc71b654d1f20076dbe8bc7ed19b4c0625ceba", size = 2175104, upload-time = "2026-04-03T17:02:05.989Z" }, - { url = "https://files.pythonhosted.org/packages/55/33/bf28f618c0a9597d14e0b9ee7d1e0622faff738d44fe986ee287cdf1b8d0/sqlalchemy-2.0.49-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:233088b4b99ebcbc5258c755a097aa52fbf90727a03a5a80781c4b9c54347a2e", size = 2156356, upload-time = "2026-04-03T16:53:09.914Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a7/5f476227576cb8644650eff68cc35fa837d3802b997465c96b8340ced1e2/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57ca426a48eb2c682dae8204cd89ea8ab7031e2675120a47924fabc7caacbc2a", size = 3276486, upload-time = "2026-04-03T17:07:46.9Z" }, - { url = "https://files.pythonhosted.org/packages/2e/84/efc7c0bf3a1c5eef81d397f6fddac855becdbb11cb38ff957888603014a7/sqlalchemy-2.0.49-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:685e93e9c8f399b0c96a624799820176312f5ceef958c0f88215af4013d29066", size = 3281479, upload-time = "2026-04-03T17:12:32.226Z" }, - { url = "https://files.pythonhosted.org/packages/91/68/bb406fa4257099c67bd75f3f2261b129c63204b9155de0d450b37f004698/sqlalchemy-2.0.49-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9e0400fa22f79acc334d9a6b185dc00a44a8e6578aa7e12d0ddcd8434152b187", size = 3226269, upload-time = "2026-04-03T17:07:48.678Z" }, - { url = "https://files.pythonhosted.org/packages/67/84/acb56c00cca9f251f437cb49e718e14f7687505749ea9255d7bd8158a6df/sqlalchemy-2.0.49-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a05977bffe9bffd2229f477fa75eabe3192b1b05f408961d1bebff8d1cd4d401", size = 3248260, upload-time = "2026-04-03T17:12:34.381Z" }, - { url = "https://files.pythonhosted.org/packages/56/19/6a20ea25606d1efd7bd1862149bb2a22d1451c3f851d23d887969201633f/sqlalchemy-2.0.49-cp314-cp314-win32.whl", hash = "sha256:0f2fa354ba106eafff2c14b0cc51f22801d1e8b2e4149342023bd6f0955de5f5", size = 2118463, upload-time = "2026-04-03T17:05:47.093Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4f/8297e4ed88e80baa1f5aa3c484a0ee29ef3c69c7582f206c916973b75057/sqlalchemy-2.0.49-cp314-cp314-win_amd64.whl", hash = "sha256:77641d299179c37b89cf2343ca9972c88bb6eef0d5fc504a2f86afd15cd5adf5", size = 2144204, upload-time = "2026-04-03T17:05:48.694Z" }, - { url = "https://files.pythonhosted.org/packages/1f/33/95e7216df810c706e0cd3655a778604bbd319ed4f43333127d465a46862d/sqlalchemy-2.0.49-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c1dc3368794d522f43914e03312202523cc89692f5389c32bea0233924f8d977", size = 3565474, upload-time = "2026-04-03T16:58:35.128Z" }, - { url = "https://files.pythonhosted.org/packages/0c/a4/ed7b18d8ccf7f954a83af6bb73866f5bc6f5636f44c7731fbb741f72cc4f/sqlalchemy-2.0.49-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c821c47ecfe05cc32140dcf8dc6fd5d21971c86dbd56eabfe5ba07a64910c01", size = 3530567, upload-time = "2026-04-03T17:06:04.587Z" }, - { url = "https://files.pythonhosted.org/packages/73/a3/20faa869c7e21a827c4a2a42b41353a54b0f9f5e96df5087629c306df71e/sqlalchemy-2.0.49-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9c04bff9a5335eb95c6ecf1c117576a0aa560def274876fd156cfe5510fccc61", size = 3474282, upload-time = "2026-04-03T16:58:37.131Z" }, - { url = "https://files.pythonhosted.org/packages/b7/50/276b9a007aa0764304ad467eceb70b04822dc32092492ee5f322d559a4dc/sqlalchemy-2.0.49-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7f605a456948c35260e7b2a39f8952a26f077fd25653c37740ed186b90aaa68a", size = 3480406, upload-time = "2026-04-03T17:06:07.176Z" }, - { url = "https://files.pythonhosted.org/packages/e5/c3/c80fcdb41905a2df650c2a3e0337198b6848876e63d66fe9188ef9003d24/sqlalchemy-2.0.49-cp314-cp314t-win32.whl", hash = "sha256:6270d717b11c5476b0cbb21eedc8d4dbb7d1a956fd6c15a23e96f197a6193158", size = 2149151, upload-time = "2026-04-03T17:02:07.281Z" }, - { url = "https://files.pythonhosted.org/packages/05/52/9f1a62feab6ed368aff068524ff414f26a6daebc7361861035ae00b05530/sqlalchemy-2.0.49-cp314-cp314t-win_amd64.whl", hash = "sha256:275424295f4256fd301744b8f335cff367825d270f155d522b30c7bf49903ee7", size = 2184178, upload-time = "2026-04-03T17:02:08.623Z" }, - { url = "https://files.pythonhosted.org/packages/e5/30/8519fdde58a7bdf155b714359791ad1dc018b47d60269d5d160d311fdc36/sqlalchemy-2.0.49-py3-none-any.whl", hash = "sha256:ec44cfa7ef1a728e88ad41674de50f6db8cfdb3e2af84af86e0041aaf02d43d0", size = 1942158, upload-time = "2026-04-03T16:53:44.135Z" }, -] - -[[package]] -name = "stack-data" -version = "0.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pure-eval" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, -] - -[[package]] -name = "tabulate" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, -] - -[[package]] -name = "terminado" -version = "0.18.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess", marker = "os_name != 'nt'" }, - { name = "pywinpty", marker = "os_name == 'nt' and sys_platform != 'darwin'" }, - { name = "tornado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, -] - -[[package]] -name = "threadpoolctl" -version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, -] - -[[package]] -name = "tinycss2" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, -] - -[[package]] -name = "tornado" -version = "6.5.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, - { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, - { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, - { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, - { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, - { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, - { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, -] - -[[package]] -name = "traitlets" -version = "5.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, -] - -[[package]] -name = "tzdata" -version = "2026.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" }, -] - -[[package]] -name = "uri-template" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, -] - -[[package]] -name = "urllib3" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, -] - -[[package]] -name = "wcwidth" -version = "0.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, -] - -[[package]] -name = "webcolors" -version = "25.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, -] - -[[package]] -name = "websocket-client" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, -] - -[[package]] -name = "widgetsnbextension" -version = "4.0.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, -] - -[[package]] -name = "zipp" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, -] diff --git a/pyproject.toml b/pyproject.toml index 2af78a58..5183504b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,7 +104,7 @@ filterwarnings = [ ] [build-system] -requires = ["uv_build>=0.9.18,<1"] +requires = ["uv_build>=0.9.18"] build-backend = "uv_build" [tool.uv]