diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5507d37 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "modules/MCcubed"] + path = lisa/modules/MCcubed + url = https://github.com/mdhimes/mc3 +[submodule "modules/PolyChordLite"] + path = lisa/modules/PolyChordLite + url = https://github.com/PolyChord/PolyChordLite +[submodule "lisa/modules/PyDREAM"] + path = lisa/modules/PyDREAM + url = https://github.com/mdhimes/PyDREAM diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..efb07b9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,38 @@ +The Large-selection Interface for Sampling Algorithms (LISA), a Python +interface for Markov chain and nested sampling algorithms. + +This project was completed with the support of the NASA Fellowship Activity, +grant 80NSSC20K0682, held by Principal Investigator Joseph Harrington in +support of Michael Himes, the principal developer of LISA. + +Copyright (C) 2020 - 2021 University of Central Florida. +All rights reserved. + +This is a test version only, and may not be redistributed to any third +party. Please refer such requests to us. This program is distributed +in the hope that it will be useful, but WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. + +LISA is under a reproducible-research license. Until LISA's first +publication, we do not permit others to redistribute the code in either +original or modified form, nor to publish work based in whole or in part on +the output of this code. By downloading, running, or modifying this code, +you agree to these conditions. We do encourage sharing any modifications +with us and discussing them openly. +For more details, see +https://planets.ucf.edu/resources/reproducible-research/software-license/ + +We welcome your feedback, but do not guarantee support. Please send +feedback or inquiries to: +Michael Himes +Joseph Harrington + +or alternatively, +Joseph Harrington and Michael Himes +UCF PSB 441 +4111 Libra Drive +Orlando, FL 32816-2385 +USA + +Thank you for using LISA! diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..ae6dccb --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +recursive-include doc/ * +recursive-include lisa/modules/ * diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5530d65 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +all: mc3 polychord pydream + +mc3: + @cd ./lisa/modules/MCcubed && make + @echo "Finished compiling MCcubed.\n" + +polychord: + @cd ./lisa/modules/PolyChordLite && python setup.py --no-mpi install + @echo "Finished installing pypolychord.\n" + +pydream: + @cd ./lisa/modules/PyDREAM && python setup.py install + @echo "Finished installing PyDREAM.\n" diff --git a/README b/README new file mode 100644 index 0000000..2e04d81 --- /dev/null +++ b/README @@ -0,0 +1,175 @@ + LISA + Large-selection Interface for Sampling Algorithms +=============================================================================== + + +Author : Michael D. Himes University of Central Florida +Contact: mhimes@knights.ucf.edu + +Advisor: Joseph Harrington University of Central Florida + +Contributors: + + +Acknowledgements +---------------- +This research was supported by the NASA Fellowship Activity under NASA Grant +80NSSC20K0682. We gratefully thank Nvidia Corporation for the Titan Xp GPU +that was used throughout development of the software. + + +Summary +======= +LISA provides an interface for a variety of sampling algorithms. Currently, +the following sampling methods are available: + DE-MC (ter Braak 2006), via a fork (https://github.com/mdhimes/mc3/tree/mpi) + of MC3 (https://github.com/pcubillos/mc3) + DE-MC with snooker updates (ter Braak & Vrugt 2008), via MC3 fork + DNest4 (Brewer & Foreman-Mackey 2018) + DREAM with snooker updates and multi-try (Laloy & Vrugt 2012), via PyDREAM + (https://github.com/LoLab-VU/PyDREAM) + dynesty (Speagle 2019; https://github.com/joshspeagle/dynesty) + MULTINEST (Feroz et al. 2009), via PyMultiNest (Buchner et al. 2014; + https://github.com/JohannesBuchner/PyMultiNest) + PolyChord (Handley et al. 2015a, 2015b; + https://github.com/PolyChord/PolyChordLite) + UltraNest (Buchner 2014, 2019; https://github.com/JohannesBuchner/UltraNest) + +LISA comes with complete documentation as well as a user manual to assist +in its usage. Users can find the latest LISA User Manual at +https://exosports.github.io/LISA/doc/LISA_User_Manual.html. + +LISA is an open-source project that welcomes improvements from the community +to be submitted via pull requests on Github. To be accepted, such improvements +must be generally consistent with the existing coding style, and all changes +must be updated in associated documentation. + +LISA is released under the Reproducible Research Software License. Users are +free to use the software for personal reasons. Users publishing results from +LISA or modified versions of it in a peer-reviewed journal are required to +publicly release all necessary code/data to reproduce the published work. +Modified versions of LISA are required to also be released open source under +the same Reproducible Research License. For more details, see the text of the +license. + + +Files & Directories +=================== +LISA contains various files and directories, described here. + +doc/ - Contains documentation for LISA. The User Manual contains + the information in the README with more detail, as well as a + walkthrough for setup and running an example. +environment.yml - Contains the required packages for LISA. +example/ - Contains examples of executing LISA. +LICENSE - Contains the text of the sfotware's license. +lisa/ - Contains the LISA package. + __init__.py - Contains the main functions to use LISA. + modules/ - Contains submodules for some sampling algorithms. + MCcubed - MC3 package. + PolyChordLite - polychord's public release on Github. + _version.py - Tracks the code's version. + wrappers/ - Contains wrappers for the sampling algorithms. + helper.py - Contains the parent class for samplers. +Makefile - Handles building MC3. +README - This file! +setup.py - Used to install the package. + + +Note that all .py files have complete documentation; consult a specific file +for more details. + + +Installation +============ +To build the supplied conda environment, enter + conda env create -f environment.yml +and activate it: + conda activate lisa + +On some systems, this approach may fail. For a more robust approach that +requires additional steps, enter + conda create -n lisa python=3.7.2 + conda activate lisa + conda env update --file environment.yml +This will build a base Python 3.7.2 environment, activate it, and then update +it with the packages necessary to run LISA. + +Mac users may need to install additional tools: + xcode-select --install +This installs make, gcc, git, and other utilities needed. + +Now, install LISA: + python setup.py install +This will compile required submodules and build an importable package. + +To check that everything installed properly, start up a Python session and try + import lisa +If it succeeds without warnings about missing MultiNest files, +you are now ready to use LISA! + + +Executing LISA +=============== +LISA is designed to be imported into existing projects. LISA provides two +functions for usage: setup instantiates a sampler, while run performs setup, +runs the inference, and produces posterior plots. For example, + import lisa + sampler = lisa.setup('demc') +will set up a DEMC sampler object. Users would then need to specify required +parameters, such as the data, uncertainties, phase space, etc. For a list of +the required parameters, + print(sampler.reqpar) +These parameters are attributes of the sampler object, and must be set to +execute the inference. For example, if my data were y = x from 0 through 9, + sampler.data = np.arange(10) +Optional parameters are also available. View those via + print(sampler.optpar) +To get more information about some parameter P, there are two options: + sampler.help('P') + print(sampler.helpinfo['P']) + +Once all required parameters are specified, execute the inference via + sampler.run() +If the sampler object is not properly set up, LISA will print to terminal +the issues that must be corrected, provided that the `verb` parameter is at +least 1. After fixing them, call the run() method as before. + +To make plots of the posterior, enter + sampler.make_plots() + +Alternatively, if users already know what parameters to include, + sampler = lisa.run(algorithm, keyword1=parameter1, keyword2=parameter2, ...) +If a required parameter is missing, users can follow the above instructions +for adding the required parameters, run it, and produce plots. + +For more examples of how to incorporate LISA into your project, see the +example/ directory. + + +Versions +======== +LISA was developed on a Unix/Linux machine using the following +versions of packages: + - Python 3.7.2 + - Numpy 1.16.2 + - Matplotlib 3.0.2 + - mpi4py 3.0.3 + - Scipy 1.5.3 + - h5py 2.9.0 + - MULTINEST 3.10 + - PyMultiNest 2.10 + - UltraNest 2.2.2 + - dynesty 1.0.1 + - dnest4 0.2.4 + - PyDREAM 2.0.0 + + +Be kind +======= +Please note that this software has not been officially released yet; see the +license for some restrictions on its usage prior to release. Upon release, +we will add the relevant citation here, with a Bibtex entry. + +Thanks! + diff --git a/doc/LISA_User_Manual.html b/doc/LISA_User_Manual.html new file mode 100644 index 0000000..0ec7f51 --- /dev/null +++ b/doc/LISA_User_Manual.html @@ -0,0 +1,10 @@ + + + + + LISA User Manual + + + + + diff --git a/doc/LISA_user_manual/LISA_user_manual.aux b/doc/LISA_user_manual/LISA_user_manual.aux new file mode 100644 index 0000000..df561f6 --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.aux @@ -0,0 +1,52 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\bibstyle{apj_hyperref} +\@writefile{toc}{\contentsline {section}{\numberline {1}Team Members}{2}{section.1}\protected@file@percent } +\newlabel{sec:team}{{1}{2}{Team Members}{section.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Introduction}{2}{section.2}\protected@file@percent } +\newlabel{sec:theory}{{2}{2}{Introduction}{section.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Installation}{2}{section.3}\protected@file@percent } +\newlabel{sec:installation}{{3}{2}{Installation}{section.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}System Requirements}{2}{subsection.3.1}\protected@file@percent } +\newlabel{sec:requirements}{{3.1}{2}{System Requirements}{subsection.3.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Install and Compile}{3}{subsection.3.2}\protected@file@percent } +\newlabel{sec:install}{{3.2}{3}{Install and Compile}{subsection.3.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Example}{4}{section.4}\protected@file@percent } +\newlabel{sec:example}{{4}{4}{Example}{section.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5}Program Inputs}{4}{section.5}\protected@file@percent } +\newlabel{sec:inputs}{{5}{4}{Program Inputs}{section.5}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Sampling Algorithm}{5}{subsection.5.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.1}demc \& snooker}{5}{subsubsection.5.1.1}\protected@file@percent } +\newlabel{sec:mcmc-inputs}{{5.1.1}{5}{demc \& snooker}{subsubsection.5.1.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.2}dream}{6}{subsubsection.5.1.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.3}dnest4}{7}{subsubsection.5.1.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.1.4}dynesty, multinest, polychord, \& ultranest}{8}{subsubsection.5.1.4}\protected@file@percent } +\newlabel{sec:ns-inputs}{{5.1.4}{8}{dynesty, multinest, polychord, \& ultranest}{subsubsection.5.1.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Parameter Dictionary}{9}{subsection.5.2}\protected@file@percent } +\newlabel{sec:param-desc}{{5.2}{9}{Parameter Dictionary}{subsection.5.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6}Program Outputs}{12}{section.6}\protected@file@percent } +\newlabel{sec:outputs}{{6}{12}{Program Outputs}{section.6}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}Returns}{12}{subsection.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}Output Files}{12}{subsection.6.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.3}demc \& snooker}{12}{subsection.6.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.4}dnest4}{13}{subsection.6.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.5}multinest}{13}{subsection.6.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.6}polychord}{13}{subsection.6.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.7}ultranest}{13}{subsection.6.7}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7}FAQ}{13}{section.7}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {8}Be Kind}{14}{section.8}\protected@file@percent } +\newlabel{sec:bekind}{{8}{14}{Be Kind}{section.8}{}} +\gdef \@abspage@last{15} diff --git a/doc/LISA_user_manual/LISA_user_manual.fdb_latexmk b/doc/LISA_user_manual/LISA_user_manual.fdb_latexmk new file mode 100644 index 0000000..2d95bad --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.fdb_latexmk @@ -0,0 +1,150 @@ +# Fdb version 4 +["pdflatex"] 1718988489 "LISA_user_manual.tex" "LISA_user_manual.pdf" "LISA_user_manual" 1718988490 0 + "/usr/local/texlive/2023/texmf-dist/fonts/enc/dvips/base/8r.enc" 1165713224 4850 80dc9bab7f31fb78a000ccfed0e27cab "" + "/usr/local/texlive/2023/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrb7t.tfm" 1136768653 960 4ab65358b8406f30ef5496c8c096d22b "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm" 1136768653 1292 3059476c50a24578715759f22652f3d0 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrr7t.tfm" 1136768653 960 379cc0019370a9e0208a0a3f949f847a "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm" 1136768653 1292 bd42be2f344128bff6d35d98474adfe3 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm" 1136768653 2172 fd0c924230362ff848a33632ed45dc23 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm" 1136768653 4524 6bce29db5bc272ba5f332261583fee9c "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm" 1136768653 2124 2601a75482e9426d33db523edf23570a "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm" 1136768653 1352 fa28a7e6d323c65ce7d13d5342ff6be2 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm" 1136768653 4408 25b74d011a4c66b7f212c0cc3c90061b "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmrc7t.tfm" 1136768653 2680 312a2d12b1f1df8ee0212e7ba1962402 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm" 1136768653 2288 f478fc8fed18759effb59f3dad7f3084 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm" 1136768653 4640 532ca3305aad10cc01d769f3f91f1029 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm10.tfm" 1246382020 1228 9be37fdf0dc0e1f4df4af3594876d628 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm5.tfm" 1246382020 1228 6fc4d2f2c0a79dc4f413411f6e2f336c "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm7.tfm" 1246382020 1228 22a83614922c993c1b2e124955a38ca1 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam5.tfm" 1246382020 924 9904cf1d39e9767e7a3622f2a125a565 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1246382020 928 2dc8d444221b7a635bb58038579b861a "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm5.tfm" 1246382020 940 75ac932a52f80982a9f8ea75d03a34cf "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1246382020 940 228d6584342e91276bf566bcf9716b83 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1136768653 992 662f679a0b3d2d53c1b94050fdaa3f50 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1136768653 1512 f21f83efb36853c0b70002322c1ab3ad "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1136768653 1520 eccf95517727cb11801f4f1aee3a21b4 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1136768653 1300 b62933e007d01cfd073f79b963c01526 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1136768653 1292 21c1c5bfeaebccffdb478fd231a0997d "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1136768653 1116 933a60c408fc0a863a92debe84b2d294 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xbtt.tfm" 1136768653 1436 f00b2a275be56a8355f5c3b07a5a7a4c "" + "/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm" 1136768653 1384 8943063000d26272532f74ca134dfecd "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb" 1248133631 36741 fa121aac0049305630cf160b86157ee4 "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb" 1248133631 35469 70d41d2b9ea31d5d813066df7c99281c "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb" 1248133631 32722 d7379af29a190c3f453aba36302ff5a9 "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb" 1248133631 32726 0a1aea6fcd6468ee2cf64d891f5c43c8 "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb" 1136849748 50493 4ed1f7e9eba8f1f3e1ec25195460190d "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb" 1136849748 45758 19968a0990191524e34e1994d4a31cb6 "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/urw/times/utmb8a.pfb" 1136849748 44729 811d6c62865936705a31c797a1d5dada "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/urw/times/utmr8a.pfb" 1136849748 46026 6dab18b61c907687b520c72847215a68 "" + "/usr/local/texlive/2023/texmf-dist/fonts/type1/urw/times/utmri8a.pfb" 1136849748 45458 a3faba884469519614ca56ba5f6b1de1 "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/courier/pcrb7t.vf" 1136768653 1344 c590fc3b8640445e169e64e330afb3d5 "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/courier/pcrr7t.vf" 1136768653 1344 6ff472164bf9de0fb2e864b28ac156d9 "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmb7t.vf" 1136768653 1372 788387fea833ef5963f4c5bffe33eb89 "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr7t.vf" 1136768653 1380 0ea3a3370054be6da6acd929ec569f06 "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf" 1136768653 3556 8a9a6dcbcd146ef985683f677f4758a6 "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmrc7t.vf" 1136768653 1948 7330aeef3af211edff3b35fb2c12a0fd "" + "/usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmri7t.vf" 1136768653 1384 a9d8adaf491ce34e5fba99dc7bbe5f39 "" + "/usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty" 1355443861 1883 4aee9c0e00b4a0c2729c07aa1ea41bad "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.tex" 1355443861 5890 e9acda8da77544e04e1e6041a77a14c7 "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty" 1644112042 7237 bdd120a32c8fdb4b433cf9ca2e7cd98a "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1600895880 17859 4409f8f50cd365c68e684407e5350b1b "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b "" + "/usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/ueur.fd" 1359763108 1065 55c4c6a48223d6c0832237c226be423c "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd" 1359763108 961 6518c6525a34feb5e8250ffa91731cff "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd" 1359763108 961 d02606146ba5601b5645f987c92e6193 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1654720880 2222 78b930a5a6e3dc2ac69b78c2057b94d7 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty" 1654720880 4173 c989ee3ced31418e3593916ab26c793a "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty" 1654720880 88393 1adf6fa3f245270d06e3d4f8910f7fc5 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty" 1654720880 4474 f04cd1cc7bd76eb033e6fb12eb6a0d77 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty" 1654720880 2444 70065bddd85997dc1fd0bb7ae634e5fa "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty" 1576625391 3935 57aa3c3e203a5c2effb4d2bd2efbc323 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty" 1654720880 3137 837d2e4f1defd7c190a44408f494ec95 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls" 1667332637 20144 d5ecf0a5140c8d8d8b72cbe86e320eff "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1667332637 3052 30236f0cc243a8651b82240dfd2e8b9d "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1667332637 2462 8ce5f9a9c63002f2c1af03c262cf29af "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty" 1654720880 5319 48d7f3cfa322abd2788e3c09d624b922 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/base/size12.clo" 1667332637 8449 c314623021fbddd0180c05345324933c "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty" 1256071977 4523 a9044e2dc40e764dac60d2acda7ae919 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty" 1159951381 9537 ecb0f152230e8d1c561906edc314dcbc "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty" 1561238569 51697 f8f08183cd2080d9d18a41432d651dfb "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1601931149 46845 3b58f70c6e861a13d927bff09d35ecbc "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def" 1663965824 19448 1e988b341dda20961a6b931bcde55519 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/color.sty" 1654720880 7233 e46ce9241d2b2ca2a78155475fdd557a "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty" 1654720880 3449 f3ec22800fdd089ce68250fc1e50dd90 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty" 1654720880 18387 8f900a490197ebaf93c02ae9476d4b09 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty" 1654720880 8010 a8d949cbdbc5c983593827c9eec252e1 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty" 1654720880 2671 7e67d78d9b88c845599a85b2d41f2e39 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx" 1667332637 2885 9c645d672ae17285bba324998918efd8 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty" 1654720880 7060 497c495d7b832441a479571bbce898ae "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty" 1654720880 4023 293ea1c16429fc0c4cf605f4da1791a9 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def" 1682193862 48272 b5ae1add85d8ece752855fae0f9f458f "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty" 1682193862 221029 5c00f036722c9c727bf1dd905b725918 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty" 1675889938 12947 1ce831528e963a8568de1f4d67cfb982 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def" 1682193862 14249 1815c1b3449cd1b96bcf0e0902900d05 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def" 1682193862 117125 88dec63e1b79b5b322c1629594c47e1f "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1655478651 22555 6d8e155cfef6d82c3d5c742fea7c992e "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1665067230 13815 760b0c02f691ea230f5359c4e1de23a7 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1681935207 29940 9473d58112bc8a88f5505b823a053dde "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty" 1575499565 5766 13a9e8766c47f30327caf893ece86ac8 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg" 1677530001 1829 d8258b7d94f5f955e70c623e525f9f45 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty" 1677530001 80947 75a96bb4c9f40ae31d54a01d924df2ff "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty" 1677530001 205154 31132370016e8c97e49bc3862419679b "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty" 1677530001 93648 37f37f89a55d35f95036cd331d48114f "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty" 1677530001 90074 7af0c10701a4f48b0bf8886e6b18ec82 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty" 1677530001 77021 d05e9115c67855816136d82929db8892 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty" 1193854157 3400 e000bb2fc43fc077e107f62f8c25613e "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty" 1291685959 45456 1c8843383c0bd05870c45fa0ebea6cc2 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1pcr.fd" 1137110629 985 1ed784d7bfe47179f3550d2303b073f8 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1ptm.fd" 1137110629 961 15056f4a61917ceed3a44e4ac11fcc52 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty" 1586716065 856 8e0e5c8cca7b18e0400f97f5a2b90a99 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ts1ptm.fd" 1137110629 619 96f56dc5d1ef1fe1121f1cfeec70ee0c "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1657483315 9714 ba3194bd52c8499b3f1e3eb91d409670 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/txfonts/t1txtt.fd" 1137111002 1324 7b6c95370a64cd8c7620cbefefb53dba "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 "" + "/usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty" 1655066402 56148 51a9a8571c07b9921892ae11063ae853 "" + "/usr/local/texlive/2023/texmf-dist/web2c/texmf.cnf" 1681165822 40967 d940221f8762fd5848760382d97d1226 "" + "/usr/local/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1683470464 4643545 53f31c3af0ba3b947cdc80fb4da1ecab "" + "/usr/local/texlive/2023/texmf-var/web2c/pdftex/pdflatex.fmt" 1683470675 7886660 8ca379e923703c32578767fd4cb91c4a "" + "/usr/local/texlive/2023/texmf.cnf" 1683470455 455 5b996dcaa0eb4ef14a83b026bc0a008c "" + "LISA_user_manual.aux" 1718988490 4115 a252d7bd457fcd5776b6a4f2f1a64733 "pdflatex" + "LISA_user_manual.out" 1718988490 3260 1f6ffd326e525308689900f896e7e129 "pdflatex" + "LISA_user_manual.tex" 1718988488 23359 4c53fc9fd9245cebdac5497ce8799f3a "" + "LISA_user_manual.toc" 1718988490 1782 623eeaa257499c4abe40ede5c2b85355 "pdflatex" + "astjnlabbrev-jh.sty" 1718988488 4043 4ed0717cbd473ef869a844c81d934589 "" + "top-LISA_user_manual.tex" 1718988488 11874 d7c6ca91efcb5a1412f49369f4547d1f "" + (generated) + "LISA_user_manual.aux" + "LISA_user_manual.log" + "LISA_user_manual.out" + "LISA_user_manual.pdf" + "LISA_user_manual.toc" + (rewritten before read) diff --git a/doc/LISA_user_manual/LISA_user_manual.fls b/doc/LISA_user_manual/LISA_user_manual.fls new file mode 100644 index 0000000..5f20947 --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.fls @@ -0,0 +1,874 @@ +PWD /github/workspace/doc/LISA_user_manual +INPUT /usr/local/texlive/2023/texmf.cnf +INPUT /usr/local/texlive/2023/texmf-dist/web2c/texmf.cnf +INPUT /usr/local/texlive/2023/texmf-var/web2c/pdftex/pdflatex.fmt +INPUT LISA_user_manual.tex +OUTPUT LISA_user_manual.log +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/local/texlive/2023/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT ./top-LISA_user_manual.tex +INPUT ./top-LISA_user_manual.tex +INPUT ./top-LISA_user_manual.tex +INPUT top-LISA_user_manual.tex +INPUT ./top-LISA_user_manual.tex +INPUT ./top-LISA_user_manual.tex +INPUT top-LISA_user_manual.tex +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT ./astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT astjnlabbrev-jh.sty +INPUT ./astjnlabbrev-jh.sty +INPUT astjnlabbrev-jh.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.tex +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.tex +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.tex +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.tex +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xbtt.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xbtt.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/color.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT ./LISA_user_manual.aux +INPUT LISA_user_manual.aux +INPUT LISA_user_manual.aux +OUTPUT LISA_user_manual.aux +INPUT /usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/graphics/color.sty +INPUT ./LISA_user_manual.out +INPUT LISA_user_manual.out +INPUT ./LISA_user_manual.out +INPUT LISA_user_manual.out +INPUT ./LISA_user_manual.out +INPUT LISA_user_manual.out +INPUT ./LISA_user_manual.out +INPUT LISA_user_manual.out +OUTPUT LISA_user_manual.pdf +INPUT ./LISA_user_manual.out +INPUT ./LISA_user_manual.out +OUTPUT LISA_user_manual.out +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmrc7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmrc7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmrc7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmri7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmrc7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr8.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr6.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/ueur.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/ueur.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/ueur.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/ueur.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmrc7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map +INPUT /usr/local/texlive/2023/texmf-dist/fonts/enc/dvips/base/8r.enc +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmb7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmrc7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmri7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmri8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmrc7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT ./LISA_user_manual.toc +INPUT LISA_user_manual.toc +INPUT LISA_user_manual.toc +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +OUTPUT LISA_user_manual.toc +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmb7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmb7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ts1ptm.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8c.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam5.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm5.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm10.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm7.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/public/amsfonts/euler/eurm5.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1pcr.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1pcr.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1pcr.fd +INPUT /usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1pcr.fd +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrr7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr8c.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/courier/pcrr7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmb7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmb8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/times/ptmr7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/times/ptmr8r.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrb7t.tfm +INPUT /usr/local/texlive/2023/texmf-dist/fonts/vf/adobe/courier/pcrb7t.vf +INPUT /usr/local/texlive/2023/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm +INPUT LISA_user_manual.aux +INPUT ./LISA_user_manual.out +INPUT ./LISA_user_manual.out +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/urw/times/utmb8a.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/urw/times/utmr8a.pfb +INPUT /usr/local/texlive/2023/texmf-dist/fonts/type1/urw/times/utmri8a.pfb diff --git a/doc/LISA_user_manual/LISA_user_manual.log b/doc/LISA_user_manual/LISA_user_manual.log new file mode 100644 index 0000000..6f6653b --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.log @@ -0,0 +1,1369 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2023.5.7) 21 JUN 2024 16:48 +entering extended mode + restricted \write18 enabled. + file:line:error style messages enabled. + %&-line parsing enabled. +**LISA_user_manual.tex +(./LISA_user_manual.tex +LaTeX2e <2022-11-01> patch level 1 +L3 programming layer <2023-05-05> +(/usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls +Document Class: article 2022/07/02 v1.4n Standard LaTeX document class +(/usr/local/texlive/2023/texmf-dist/tex/latex/base/size12.clo +File: size12.clo 2022/07/02 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@section=\count186 +\c@subsection=\count187 +\c@subsubsection=\count188 +\c@paragraph=\count189 +\c@subparagraph=\count190 +\c@figure=\count191 +\c@table=\count192 +\abovecaptionskip=\skip48 +\belowcaptionskip=\skip49 +\bibindent=\dimen140 +) +(./top-LISA_user_manual.tex +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 107. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen141 +\Gin@req@width=\dimen142 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip50 +\enit@outerparindent=\dimen143 +\enit@toks=\toks17 +\enit@inbox=\box51 +\enit@count@id=\count193 +\enitdp@description=\count194 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks18 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2022/04/08 v2.17n AMS math features +\@mathmargin=\skip51 + +For additional information on amsmath, use the `?' option. +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen144 +)) +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen145 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2022/04/08 v2.04 operator names +) +\inf@bad=\count195 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count196 +\leftroot@=\count197 +LaTeX Info: Redefining \overline on input line 399. +LaTeX Info: Redefining \colon on input line 410. +\classnum@=\count198 +\DOTSCASE@=\count199 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box52 +\strutbox@=\box53 +LaTeX Info: Redefining \big on input line 722. +LaTeX Info: Redefining \Big on input line 723. +LaTeX Info: Redefining \bigg on input line 724. +LaTeX Info: Redefining \Bigg on input line 725. +\big@size=\dimen146 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count266 +LaTeX Info: Redefining \bmod on input line 905. +LaTeX Info: Redefining \pmod on input line 910. +LaTeX Info: Redefining \smash on input line 940. +LaTeX Info: Redefining \relbar on input line 970. +LaTeX Info: Redefining \Relbar on input line 971. +\c@MaxMatrixCols=\count267 +\dotsspace@=\muskip16 +\c@parentequation=\count268 +\dspbrk@lvl=\count269 +\tag@help=\toks20 +\row@=\count270 +\column@=\count271 +\maxfields@=\count272 +\andhelp@=\toks21 +\eqnshift@=\dimen147 +\alignsep@=\dimen148 +\tagshift@=\dimen149 +\tagwidth@=\dimen150 +\totwidth@=\dimen151 +\lineht@=\dimen152 +\@envbody=\toks22 +\multlinegap=\skip52 +\multlinetaggap=\skip53 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2953. +LaTeX Info: Redefining \] on input line 2954. +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2022/06/12 v2.14 LaTeX color extensions (UK) + +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 227. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/mathcolor.ltx) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1353. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1357. +Package xcolor Info: Model `RGB' extended on input line 1369. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1371. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1372. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1373. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1374. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1375. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1376. +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count273 +\lst@gtempboxa=\box54 +\lst@token=\toks24 +\lst@length=\count274 +\lst@currlwidth=\dimen153 +\lst@column=\count275 +\lst@pos=\count276 +\lst@lostspace=\dimen154 +\lst@width=\dimen155 +\lst@newlines=\count277 +\lst@lineno=\count278 +\lst@maxwidth=\dimen156 + +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz) +\c@lstnumber=\count279 +\lst@skipnumbers=\count280 +\lst@framebox=\box55 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2023/02/27 1.9 listings configuration +)) +Package: listings 2023/02/27 1.9 (Carsten Heinz) + +(/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/times.sty +Package: times 2020/03/25 PSNFSS-v9.3 (SPQR) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/natbib/natbib.sty +Package: natbib 2010/09/13 8.31b (PWD, AO) +\bibhang=\skip54 +\bibsep=\skip55 +LaTeX Info: Redefining \cite on input line 694. +\c@NAT@ctr=\count281 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count282 +) +(./astjnlabbrev-jh.sty) +(/usr/local/texlive/2023/texmf-dist/tex/latex/natbib/bibentry.sty +Package: bibentry 2007/10/30 1.5 (PWD) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2022/04/13 v1.1d Standard LaTeX ifthen package (DPC) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/epsfig.sty +Package: epsfig 2017/06/25 v1.7b (e)psfig emulation (SPQR) +\epsfxsize=\dimen157 +\epsfysize=\dimen158 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/commath/commath.sty) +(/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/rotating.sty +Package: rotating 2016/08/11 v2.16d rotated objects in LaTeX +\c@r@tfl@t=\count283 +\rotFPtop=\skip56 +\rotFPbot=\skip57 +\rot@float@box=\box56 +\rot@mess@toks=\toks25 +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.sty +Package: dirtree 2012/12/11 v0.32 package wrapper for dirtree + +(/usr/local/texlive/2023/texmf-dist/tex/generic/dirtree/dirtree.tex +`dirtree' v0.32, 2012/12/11 (jcc) +\DT@offset=\dimen159 +\DT@width=\dimen160 +\DT@sep=\dimen161 +\DT@all=\dimen162 +\DT@rulewidth=\dimen163 +\DT@dotwidth=\dimen164 +\DTbaselineskip=\dimen165 +\DT@counti=\count284 +\DT@countii=\count285 +\DT@countiii=\count286 +\DT@countiv=\count287 +\DT@indent=\dimen166 +\DT@parskip=\dimen167 +\DT@baselineskip=\dimen168 +) +File: dirtree.tex 2012/12/11 v0.32 `dirtree' (jcc) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/changepage/changepage.sty +Package: changepage 2009/10/20 v1.0c check page and change page layout +\c@cp@cntr=\count288 +\cp@tempcnt=\count289 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/base/alltt.sty +Package: alltt 2021/01/29 v2.0g defines alltt environment +) +LaTeX Font Info: Trying to load font information for T1+txtt on input line 5 +1. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/txfonts/t1txtt.fd +File: t1txtt.fd 2000/12/15 v3.1 +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +File: lstlang2.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +File: lstlang3.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +File: lstlang2.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +File: lstlang3.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang2.sty +File: lstlang2.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstlang3.sty +File: lstlang3.sty 2023/02/27 1.9 listings language file +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2023-04-22 v7.00x Hypertext links for LaTeX + +(/usr/local/texlive/2023/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2022/02/03 v1.0f TeX engine tests +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/local/texlive/2023/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2022-05-17 v2.50 Cross-referencing by name of section + +(/usr/local/texlive/2023/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/gettitlestring/gettitlestring.s +ty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) + (/usr/local/texlive/2023/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) +)) +\c@section@level=\count290 +) +\@linkdim=\dimen169 +\Hy@linkcounter=\count291 +\Hy@pagecounter=\count292 + +(/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2023-04-22 v7.00x Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/local/texlive/2023/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +\Hy@SavedSpaceFactor=\count293 + +(/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2023-04-22 v7.00x Hyperref: PDF Unicode definition (HO) +Now handling font encoding PU ... +... no UTF-8 mapping file for font encoding PU +) +Package hyperref Info: Option `bookmarks' set `true' on input line 4065. +Package hyperref Info: Option `bookmarksnumbered' set `true' on input line 4065 +. +Package hyperref Info: Option `colorlinks' set `true' on input line 4065. +Package hyperref Info: Option `breaklinks' set `true' on input line 4065. +Package hyperref Info: Option `frenchlinks' set `true' on input line 4065. +Package hyperref Info: Hyper figures OFF on input line 4182. +Package hyperref Info: Link nesting OFF on input line 4187. +Package hyperref Info: Hyper index ON on input line 4190. +Package hyperref Info: Plain pages OFF on input line 4197. +Package hyperref Info: Backreferencing OFF on input line 4202. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4449. +\c@Hy@tempcnt=\count294 + +(/usr/local/texlive/2023/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4787. +\XeTeXLinkMargin=\dimen170 + +(/usr/local/texlive/2023/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/local/texlive/2023/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count295 +\Field@Width=\dimen171 +\Fld@charsize=\dimen172 +Package hyperref Info: Hyper figures OFF on input line 6066. +Package hyperref Info: Link nesting OFF on input line 6071. +Package hyperref Info: Hyper index ON on input line 6074. +Package hyperref Info: backreferencing OFF on input line 6081. +Package hyperref Info: Link coloring ON on input line 6084. +Package hyperref Info: Link coloring with OCG OFF on input line 6091. +Package hyperref Info: PDF/A mode OFF on input line 6096. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count296 +\c@Item=\count297 +\c@Hfootnote=\count298 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2023-04-22 v7.00x Hyperref driver for pdfTeX + +(/usr/local/texlive/2023/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac +kage +with kernel methods +) +\Fld@listcount=\count299 +\c@bookmark@seq@number=\count300 + +(/usr/local/texlive/2023/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) + +(/usr/local/texlive/2023/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +85. +) +\Hy@SectionHShift=\skip58 +) +\symUPM=\mathgroup6 +\wdbox=\box57 +\timect=\count301 +\hourct=\count302 +\minct=\count303 + +Joe Harrington's personal setup, Wed Jun 17 10:53:17 EDT 1998 +\@sp=\box58 +\@sb=\box59 +) +LaTeX Font Info: Trying to load font information for OT1+ptm on input line 1 +1. + (/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1ptm.fd +File: ot1ptm.fd 2001/06/04 font definitions for OT1/ptm. +) +(/usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2023-04-19 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count304 +\l__pdf_internal_box=\box60 +) +(./LISA_user_manual.aux) +\openout1 = `LISA_user_manual.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. + +(/usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count305 +\scratchdimen=\dimen173 +\scratchbox=\box61 +\nofMPsegments=\count306 +\nofMParguments=\count307 +\everyMPshowfont=\toks26 +\MPscratchCnt=\count308 +\MPscratchDim=\dimen174 +\MPnumerator=\count309 +\makeMPintoPDFobject=\count310 +\everyMPtoPDFconversion=\toks27 +) (/usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +\c@lstlisting=\count311 +Package hyperref Info: Link coloring ON on input line 11. + +(./LISA_user_manual.out) (./LISA_user_manual.out) +\@outlinefile=\write3 +\openout3 = `LISA_user_manual.out'. + +LaTeX Font Info: Trying to load font information for U+msa on input line 33. + + +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 33. + + +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for U+eur on input line 33. + + +(/usr/local/texlive/2023/texmf-dist/tex/latex/amsfonts/ueur.fd +File: ueur.fd 2013/01/14 v3.01 Euler Roman +) [1 + +{/usr/local/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map}{/usr/loc +al/texlive/2023/texmf-dist/fonts/enc/dvips/base/8r.enc}] (./LISA_user_manual.to +c) +\tf@toc=\write4 +\openout4 = `LISA_user_manual.toc'. + + +pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has +been already used, duplicate ignored + + \relax +l.49 \newpage + [1] +LaTeX Font Info: Trying to load font information for TS1+ptm on input line 5 +5. + +(/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ts1ptm.fd +File: ts1ptm.fd 2001/06/04 font definitions for TS1/ptm. +) +Underfull \hbox (badness 10000) in paragraph at lines 64--68 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 69--80 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 81--85 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 86--89 + + [] + +LaTeX Font Info: Trying to load font information for OT1+pcr on input line 1 +02. +(/usr/local/texlive/2023/texmf-dist/tex/latex/psnfss/ot1pcr.fd +File: ot1pcr.fd 2001/06/04 font definitions for OT1/pcr. +) [2] +Underfull \hbox (badness 10000) in paragraph at lines 135--136 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 161--163 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 168--169 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 175--177 + + [] + +[3] +Underfull \hbox (badness 10000) in paragraph at lines 207--212 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 225--227 + + [] + + +Overfull \hbox (19.8448pt too wide) in paragraph at lines 232--237 +\OT1/pcr/m/n/12 argument (the desired algorithm; options are listed below), and + they + [] + + +Overfull \hbox (12.6448pt too wide) in paragraph at lines 232--237 +\OT1/pcr/m/n/12 take keyword arguments for the different parameters of the samp +ling + [] + +[4] +Overfull \hbox (20.41951pt too wide) in paragraph at lines 243--244 +[]\OT1/pcr/m/n/12 dnest4 : Diffusive NS implementation of Brewer & Foreman-Mack +ey + [] + + +Overfull \hbox (49.2195pt too wide) in paragraph at lines 246--247 +[]\OT1/pcr/m/n/12 polychord: PolyChord NS algorithm of Handley et al. (2015a, 2 +015b) + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 249--250 +[]\OT1/pcr/m/n/12 ultranest: UltraNest NS algorithm of Buchner (2014, 2016, 201 +9). + [] + + +Overfull \hbox (41.4448pt too wide) in paragraph at lines 252--259 +\OT1/pcr/m/n/12 The choice of sampling algorithm also decides the allowed input +s. Each + [] + + +Overfull \hbox (55.84479pt too wide) in paragraph at lines 252--259 +\OT1/pcr/m/n/12 sampler's inputs are listed in the following subsections. Bold +indicates + [] + + +Overfull \hbox (27.0448pt too wide) in paragraph at lines 252--259 +\OT1/pcr/m/n/12 a parameter that must be specified (typically, they have no def +ault); + [] + + +Overfull \hbox (55.84479pt too wide) in paragraph at lines 252--259 +\OT1/pcr/m/n/12 optional parameters are given reasonable defaults. Section [][] +5.2[][] describes + [] + + +Overfull \hbox (5.44481pt too wide) in paragraph at lines 252--259 +\OT1/pcr/m/n/12 each parameter. Note that some `optional' parameters can strong +ly + [] + + +Overfull \hbox (27.0448pt too wide) in paragraph at lines 252--259 +\OT1/pcr/m/n/12 influence the results (e.g., dlogz for nested samplers), so use +rs are + [] + +[5] [6] [7] +Overfull \hbox (19.8448pt too wide) in paragraph at lines 369--372 +\OT1/pcr/m/n/12 Users are only required to specify the relevant parameters list +ed in + [] + + +Overfull \hbox (55.84479pt too wide) in paragraph at lines 369--372 +\OT1/pcr/m/n/12 the previous section. Each parameter is described below, alphab +etically. + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 374--376 +[]\OT1/pcr/m/n/12 beta : float. DNest4 only. From their docs: strength of effec +t + [] + +[8] +Overfull \hbox (63.61949pt too wide) in paragraph at lines 376--383 +[]\OT1/pcr/m/n/12 bound : str. Dynesty only. Option to bound the target distrib +ution. + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 376--383 +\OT1/pcr/m/n/12 Choices: none (sample from unit cube), single (one ellipsoid), + [] + + +Overfull \hbox (49.2195pt too wide) in paragraph at lines 376--383 +\OT1/pcr/m/n/12 multi (multiple possibly overlapping ellipsoids), balls (overla +pping + [] + + +Overfull \hbox (56.4195pt too wide) in paragraph at lines 376--383 +\OT1/pcr/m/n/12 balls centered on each live point), cubes (overlapping cubes ce +ntered + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 384--386 +[]\OT1/pcr/m/n/12 data : array, Numpy binary. Measured data for inference. Must + + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 386--389 +[]\OT1/pcr/m/n/12 dlogz : float. Target evidence uncertainty (stops when below + [] + + +Overfull \hbox (63.61949pt too wide) in paragraph at lines 386--389 +\OT1/pcr/m/n/12 this value). Lower = more accurate, but also requires longer ru +ntime. + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 389--391 +[]\OT1/pcr/m/n/12 dumper : object. Polychord only. Function to output info duri +ng + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 391--393 +[]\OT1/pcr/m/n/12 fbestp : str. Filename for array of best-fit parameters. Must + + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 393--395 +[]\OT1/pcr/m/n/12 fext : str. File extension for saved plots. Options: .png, + [] + + +Overfull \hbox (42.0195pt too wide) in paragraph at lines 395--397 +[]\OT1/pcr/m/n/12 flog : str. MCMCs only. /path/to/log file to save out. Defaul +t: + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 397--403 +[]\OT1/pcr/m/n/12 fprefix : str. Prefix for output filenames. Recommended to be + + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 397--403 +\OT1/pcr/m/n/12 a directory (possibly with a prefix for all produced files), as + + [] + + +Overfull \hbox (42.0195pt too wide) in paragraph at lines 397--403 +\OT1/pcr/m/n/12 this will create a subdirectory within `outputdir`. Default: pm +n/ + [] + + +Overfull \hbox (63.61949pt too wide) in paragraph at lines 403--407 +[]\OT1/pcr/m/n/12 fsavefile : str. Filename to store parameters explored. If re +lative + [] + + +Overfull \hbox (171.61945pt too wide) in paragraph at lines 403--407 +\OT1/pcr/m/n/12 path, it is considered with respect to `outputdir`. Default: `o +utputdir`/output.npy + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 407--417 +[]\OT1/pcr/m/n/12 fsavemodel : str. MCMCs only (currently). Filename to store + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 407--417 +\OT1/pcr/m/n/12 models, corresponding to the parameters. If relative path, it + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 407--417 +\OT1/pcr/m/n/12 is considered with respect to `outputdir`. If None, file is not + + [] + + +Overfull \hbox (49.2195pt too wide) in paragraph at lines 407--417 +\OT1/pcr/m/n/12 saved. Beware: the file may be extremely large if the model out +put + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 407--417 +\OT1/pcr/m/n/12 has high dimensionality. See `modelper' to have it automaticall +y + [] + + +Overfull \hbox (39.13951pt too wide) in paragraph at lines 417--419 +[]\OT1/pcr/m/n/12 frac[]remain : float. UltraNest only. Sets the fraction remai +nder + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 419--421 +[]\OT1/pcr/m/n/12 hsize : int. Snooker only. Number of samples per chain to see +d + [] + +[9] +Overfull \hbox (20.41951pt too wide) in paragraph at lines 421--422 +[]\OT1/pcr/m/n/12 indparams : list. MCMCs only. Additional parameters needed by + + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 422--425 +[]\OT1/pcr/m/n/12 kll : object. Datasketches KLL object, for model quantiles. U +se + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 422--425 +\OT1/pcr/m/n/12 None if not desired or if Datasketches is not installed. Defaul +t: + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 425--427 +[]\OT1/pcr/m/n/12 lam : float. DNest 4 only. From their docs: backtracking scal +e + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 427--430 +[]\OT1/pcr/m/n/12 Lepsilon : float. UltraNest only. From their docs: "Terminate + + [] + + +Overfull \hbox (85.21948pt too wide) in paragraph at lines 427--430 +\OT1/pcr/m/n/12 when live point likelihoods are all the same, within Lepsilon t +olerance." + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 430--432 +[]\OT1/pcr/m/n/12 loglike : object. Nested samplers only. Function defining the + + [] + + +Overfull \hbox (3.13953pt too wide) in paragraph at lines 432--433 +[]\OT1/pcr/m/n/12 min[]ess : int. Minimum effective sample size (ESS). Default: + + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 434--440 +[]\OT1/pcr/m/n/12 modelper : int. MCMCs only. Sets how to split `fsavemodel` in +to + [] + + +Overfull \hbox (42.0195pt too wide) in paragraph at lines 434--440 +\OT1/pcr/m/n/12 subfiles. If 0, does not split. If >0, saves out every `modelpe +r` + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 434--440 +\OT1/pcr/m/n/12 iterations. E.g., if nchains=10 and modelper=5, splits every 50 + + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 440--442 +[]\OT1/pcr/m/n/12 multitry : int. DREAM only. Determines whether to use multi-t +ry + [] + + +Overfull \hbox (56.4195pt too wide) in paragraph at lines 443--445 +[]\OT1/pcr/m/n/12 niter : int. Maximum number of iterations. Nested samplers de +fault + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 445--446 +[]\OT1/pcr/m/n/12 nlive : int. (Minimum) number of live points to use. Default: + + [] + + +Overfull \hbox (17.53952pt too wide) in paragraph at lines 446--450 +[]\OT1/pcr/m/n/12 nlive[]batch: int. Dynesty only. From their docs: "The number + + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 446--450 +\OT1/pcr/m/n/12 of live points used when adding additional samples from a neste +d + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 450--452 +[]\OT1/pcr/m/n/12 nlevel : int. DNest4 only. From their docs: Maximum number + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 452--454 +[]\OT1/pcr/m/n/12 nlevelint : int. DNest4 only. Number of moves before creating + + [] + + +Overfull \hbox (42.0195pt too wide) in paragraph at lines 454--456 +[]\OT1/pcr/m/n/12 nperstep : int. DNest4 only. Number of moves per MCMC iterati +on. + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 456--461 +[]\OT1/pcr/m/n/12 nrepeat : int. Polychord only. From their docs: The number + [] + + +Overfull \hbox (34.8195pt too wide) in paragraph at lines 456--461 +\OT1/pcr/m/n/12 of slice slice-sampling steps to generate a new point. Increasi +ng + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 456--461 +\OT1/pcr/m/n/12 [nrepeat] increases the reliability of the algorithm. Default: + [] + +[10] +Overfull \hbox (20.41951pt too wide) in paragraph at lines 461--462 +[]\OT1/pcr/m/n/12 outputdir : str. path/to/directory where output will be saved +. + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 462--464 +[]\OT1/pcr/m/n/12 perturb : object. DNest4 only. Function that proposes changes + + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 464--469 +[]\OT1/pcr/m/n/12 pinit : array, Numpy binary. For MCMCs, initial parameters fo +r + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 464--469 +\OT1/pcr/m/n/12 samplers. For nested sampling algorithms, values are used for + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 464--469 +\OT1/pcr/m/n/12 parameters that are held constant, if any. Must be Numpy array, + + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 469--471 +[]\OT1/pcr/m/n/12 pmax : array, Numpy binary. Maximum value for each parameter. + + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 471--473 +[]\OT1/pcr/m/n/12 pmin : array, Numpy binary. Minimum value for each parameter. + + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 473--476 +[]\OT1/pcr/m/n/12 pnames : array. Name of each parameter (can use some LaTeX if + + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 477--483 +[]\OT1/pcr/m/n/12 pstep : array. Step size for each parameter. For MCMCs, only + [] + + +Overfull \hbox (49.2195pt too wide) in paragraph at lines 477--483 +\OT1/pcr/m/n/12 matters for the initial samples and determining constant parame +ters, + [] + + +Overfull \hbox (78.01949pt too wide) in paragraph at lines 477--483 +\OT1/pcr/m/n/12 as step size is automatically adjusted. For nested sampling alg +orithms, + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 483--487 +[]\OT1/pcr/m/n/12 resample : float. DNest4 only. Must be non-negative. If >0, + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 483--487 +\OT1/pcr/m/n/12 corresponds to a factor affecting the number of draws from the + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 487--489 +[]\OT1/pcr/m/n/12 resume: bool. Determines whether to resume a previous run, if + + [] + + +Overfull \hbox (63.61949pt too wide) in paragraph at lines 489--498 +[]\OT1/pcr/m/n/12 sample : str. Dynesty only. Sampling method. Choices (descrip +tions + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 489--498 +\OT1/pcr/m/n/12 from their docs): unif (uniform sampling), rwalk (random walks + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 489--498 +\OT1/pcr/m/n/12 from current live point), rstagger (random "staggering" away fr +om + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 489--498 +\OT1/pcr/m/n/12 current live point), slice (multivariate slice sampling), rslic +e + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 489--498 +\OT1/pcr/m/n/12 (random slice sampling), hslice ("Hamiltonian" slice sampling), + + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 489--498 +\OT1/pcr/m/n/12 auto (automatically selected based on problem dimensionality). + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 498--504 +[]\OT1/pcr/m/n/12 thinning : int. Thinning factor for the posterior (keep every + + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 498--504 +\OT1/pcr/m/n/12 N iterations). Example: a thinning factor of 3 will keep every + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 498--504 +\OT1/pcr/m/n/12 third iteration. Only recommended when the computed posterior + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 504--506 +[]\OT1/pcr/m/n/12 truepars : array, Numpy binary. Known true values for the mod +el + [] + +[11] +Overfull \hbox (34.8195pt too wide) in paragraph at lines 506--508 +[]\OT1/pcr/m/n/12 uncert : array, Numpy binary. Data uncertainties. Must be Num +py + [] + + +Overfull \hbox (27.6195pt too wide) in paragraph at lines 508--513 +[]\OT1/pcr/m/n/12 verb : int. Verbosity level. If 0, only essential messages ar +e + [] + + +Overfull \hbox (20.41951pt too wide) in paragraph at lines 508--513 +\OT1/pcr/m/n/12 printed by LISA. If 1, prints additional messages (e.g., loadin +g + [] + + +Overfull \hbox (63.61949pt too wide) in paragraph at lines 508--513 +\OT1/pcr/m/n/12 data files). In the future, additional levels may be added. Def +ault: + [] + + +Overfull \hbox (63.04478pt too wide) in paragraph at lines 519--522 +\OT1/pcr/m/n/12 LISA has two main functions: setup and run. setup returns an in +itialized + [] + + +Overfull \hbox (77.44478pt too wide) in paragraph at lines 519--522 +\OT1/pcr/m/n/12 Sampler object. run returns the Sampler object (with additional + attributes: + [] + + +Overfull \hbox (34.2448pt too wide) in paragraph at lines 519--522 +\OT1/pcr/m/n/12 outp for the posterior and bestp for the best parameters) and p +roduces + [] + + +Overfull \hbox (13.21951pt too wide) in paragraph at lines 525--527 +[]\OT1/pcr/m/n/12 samp: Sampler object. Contains the attributes listed Sections + + [] + + +Overfull \hbox (70.81949pt too wide) in paragraph at lines 531--532 +[]\OT1/pcr/m/n/12 pairwise: corner plot of histograms of the 2D marginalized po +steriors. + [] + + +Overfull \hbox (6.01952pt too wide) in paragraph at lines 532--533 +[]\OT1/pcr/m/n/12 posterior: histogram plots of the 1D marginalized posteriors. + + [] + + +Overfull \hbox (41.4448pt too wide) in paragraph at lines 536--539 +\OT1/pcr/m/n/12 If fsavefile and fbestp are not None, there are two NPY files p +roduced. + [] + + +Overfull \hbox (5.44481pt too wide) in paragraph at lines 543--545 +\OT1/pcr/m/n/12 Except for dynesty, each sampler also has additional output fil +es, + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 543--545 + + [] + + +Overfull \hbox (34.2448pt too wide) in paragraph at lines 552--555 +\OT1/pcr/m/n/12 DNest4 produces some files about the sampler's history. All are + saved + [] + + +Overfull \hbox (2.56482pt too wide) in paragraph at lines 552--555 +\OT1/pcr/m/n/12 into `outputdir` EXCEPT for sampler[]state.txt, which is saved +into + [] + + +Overfull \hbox (5.44481pt too wide) in paragraph at lines 552--555 +\OT1/pcr/m/n/12 the directory where LISA was executed from. For more details, s +ee + [] + +[12] +Overfull \hbox (17.53952pt too wide) in paragraph at lines 558--560 +[]\OT1/pcr/m/n/12 marginals[]multinest.png: plot of the 1D marginalized posteri +ors + [] + + +Overfull \hbox (27.0448pt too wide) in paragraph at lines 561--564 +\OT1/pcr/m/n/12 Additionally, a subdirectory containing the files necessary to +resume + [] + + +Overfull \hbox (48.64479pt too wide) in paragraph at lines 561--564 +\OT1/pcr/m/n/12 the run as well as summary plots and files is created (default +is pmn/). + [] + + +Overfull \hbox (34.2448pt too wide) in paragraph at lines 571--574 +\OT1/pcr/m/n/12 UltraNest's output gets saved into a subdirectory named `run` f +ollowed + [] + + +Overfull \hbox (27.0448pt too wide) in paragraph at lines 571--574 +\OT1/pcr/m/n/12 by a number. It contains a log file, chain histories, summary f +iles, + [] + + +Overfull \hbox (12.6448pt too wide) in paragraph at lines 578--581 +\OT1/pcr/m/n/12 This section will cover some frequently asked questions about u +sing + [] + + +Overfull \hbox (12.6448pt too wide) in paragraph at lines 578--581 +\OT1/pcr/m/n/12 LISA. Have a question that isn't answered below? Please send it + to + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 578--581 + + [] + + +Overfull \hbox (19.8448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/b/n/12 Q: What is effective sample size (ESS) and why should I care? \ +OT1/pcr/m/n/12 A: As + [] + + +Overfull \hbox (63.04478pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 Bayesian samplers explore a phase space, the subsequent sets of + parameters + [] + + +Overfull \hbox (5.44481pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 are based in part on earlier sets of parameters. Thus, iteratio +ns + [] + + +Overfull \hbox (5.44481pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 are correlated. After some number of samples, new iterations wi +ll + [] + + +Overfull \hbox (34.2448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 ``forget'' some of the earlier samples. Yet, we are really inte +rested + [] + + +Overfull \hbox (48.64479pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 in the number of independent samples, as that will inform how t +horoughly + [] + + +Overfull \hbox (41.4448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 the phase space has been explored (taking a bunch of correlated + samples + [] + + +Overfull \hbox (70.24478pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 doesn't give us much new information!). The number of iteration +s necessary + [] + + +Overfull \hbox (12.6448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 before a new sample is independent of a given earlier sample (s +teps + [] + + +Overfull \hbox (34.2448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 per effective independent sample, SPEIS) informs the ESS. For e +xample, + [] + + +Overfull \hbox (19.8448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 if we have 20,000 samples, but a given sample is correlated wit +h the + [] + + +Overfull \hbox (19.8448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 previous 100 samples, then the ESS is just 20000 / 100, or 200. + The + [] + + +Overfull \hbox (12.6448pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 ESS value, in turn, informs us of the accuracy of a credible re +gion + [] + + +Overfull \hbox (55.84479pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 determined from the posterior distribution. Without providing a + detailed + [] + + +Overfull \hbox (63.04478pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 proof (interested readers can find it in Harrington et al. 2021 +, Appendix + [] + + +Overfull \hbox (7.51305pt too wide) in paragraph at lines 582--599 +\OT1/pcr/m/n/12 A), the relationship between the ESS, a credible region $[]$, a +nd the + [] + +[13] +Overfull \hbox (34.15376pt too wide) in paragraph at lines 601--605 +\OT1/pcr/m/n/12 Thus, for a 0.5% uncertainty on the 95.45% region (2$\OML/cmm/m +/it/12 ^^[$ \OT1/pcr/m/n/12 for a Gaussian), + [] + + +Overfull \hbox (7.57817pt too wide) in paragraph at lines 601--605 +\OT1/pcr/m/n/12 an ESS $\OMS/cmsy/m/n/12 ^^Y$ \OT1/pcr/m/n/12 1700 is required. + A SPEIS of 1000 would thus require 1.7 + [] + + +Overfull \hbox (19.8448pt too wide) in paragraph at lines 609--612 +\OT1/pcr/m/n/12 Please note that this software has not been officially released + yet; + [] + + +Overfull \hbox (19.8448pt too wide) in paragraph at lines 609--612 +\OT1/pcr/m/n/12 see the license for some restrictions on its usage prior to rel +ease. + [] + + +Overfull \hbox (12.6448pt too wide) in paragraph at lines 609--612 +\OT1/pcr/m/n/12 Upon release, we will add the relevant citation here, with a Bi +btex + [] + +[14] (./LISA_user_manual.aux) +Package rerunfilecheck Info: File `LISA_user_manual.out' has not changed. +(rerunfilecheck) Checksum: 1F6FFD326E525308689900F896E7E129;3260. + ) +Here is how much of TeX's memory you used: + 13133 strings out of 476047 + 200445 string characters out of 5790254 + 1860248 words of memory out of 5000000 + 33278 multiletter control sequences out of 15000+600000 + 548410 words of font info for 105 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 80i,8n,79p,2608b,583s stack positions out of 10000i,1000n,20000p,200000b,200000s +< +/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb> +Output written on LISA_user_manual.pdf (15 pages, 141851 bytes). +PDF statistics: + 263 PDF objects out of 1000 (max. 8388607) + 223 compressed objects within 3 object streams + 42 named destinations out of 1000 (max. 500000) + 185 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/doc/LISA_user_manual/LISA_user_manual.out b/doc/LISA_user_manual/LISA_user_manual.out new file mode 100644 index 0000000..beeb47e --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.out @@ -0,0 +1,23 @@ +\BOOKMARK [1][-]{section.1}{\376\377\0001\000\040\000T\000e\000a\000m\000\040\000M\000e\000m\000b\000e\000r\000s}{}% 1 +\BOOKMARK [1][-]{section.2}{\376\377\0002\000\040\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n}{}% 2 +\BOOKMARK [1][-]{section.3}{\376\377\0003\000\040\000I\000n\000s\000t\000a\000l\000l\000a\000t\000i\000o\000n}{}% 3 +\BOOKMARK [2][-]{subsection.3.1}{\376\377\0003\000.\0001\000\040\000S\000y\000s\000t\000e\000m\000\040\000R\000e\000q\000u\000i\000r\000e\000m\000e\000n\000t\000s}{section.3}% 4 +\BOOKMARK [2][-]{subsection.3.2}{\376\377\0003\000.\0002\000\040\000I\000n\000s\000t\000a\000l\000l\000\040\000a\000n\000d\000\040\000C\000o\000m\000p\000i\000l\000e}{section.3}% 5 +\BOOKMARK [1][-]{section.4}{\376\377\0004\000\040\000E\000x\000a\000m\000p\000l\000e}{}% 6 +\BOOKMARK [1][-]{section.5}{\376\377\0005\000\040\000P\000r\000o\000g\000r\000a\000m\000\040\000I\000n\000p\000u\000t\000s}{}% 7 +\BOOKMARK [2][-]{subsection.5.1}{\376\377\0005\000.\0001\000\040\000S\000a\000m\000p\000l\000i\000n\000g\000\040\000A\000l\000g\000o\000r\000i\000t\000h\000m}{section.5}% 8 +\BOOKMARK [3][-]{subsubsection.5.1.1}{\376\377\0005\000.\0001\000.\0001\000\040\000d\000e\000m\000c\000\040\000\046\000\040\000s\000n\000o\000o\000k\000e\000r}{subsection.5.1}% 9 +\BOOKMARK [3][-]{subsubsection.5.1.2}{\376\377\0005\000.\0001\000.\0002\000\040\000d\000r\000e\000a\000m}{subsection.5.1}% 10 +\BOOKMARK [3][-]{subsubsection.5.1.3}{\376\377\0005\000.\0001\000.\0003\000\040\000d\000n\000e\000s\000t\0004}{subsection.5.1}% 11 +\BOOKMARK [3][-]{subsubsection.5.1.4}{\376\377\0005\000.\0001\000.\0004\000\040\000d\000y\000n\000e\000s\000t\000y\000,\000\040\000m\000u\000l\000t\000i\000n\000e\000s\000t\000,\000\040\000p\000o\000l\000y\000c\000h\000o\000r\000d\000,\000\040\000\046\000\040\000u\000l\000t\000r\000a\000n\000e\000s\000t}{subsection.5.1}% 12 +\BOOKMARK [2][-]{subsection.5.2}{\376\377\0005\000.\0002\000\040\000P\000a\000r\000a\000m\000e\000t\000e\000r\000\040\000D\000i\000c\000t\000i\000o\000n\000a\000r\000y}{section.5}% 13 +\BOOKMARK [1][-]{section.6}{\376\377\0006\000\040\000P\000r\000o\000g\000r\000a\000m\000\040\000O\000u\000t\000p\000u\000t\000s}{}% 14 +\BOOKMARK [2][-]{subsection.6.1}{\376\377\0006\000.\0001\000\040\000R\000e\000t\000u\000r\000n\000s}{section.6}% 15 +\BOOKMARK [2][-]{subsection.6.2}{\376\377\0006\000.\0002\000\040\000O\000u\000t\000p\000u\000t\000\040\000F\000i\000l\000e\000s}{section.6}% 16 +\BOOKMARK [2][-]{subsection.6.3}{\376\377\0006\000.\0003\000\040\000d\000e\000m\000c\000\040\000\046\000\040\000s\000n\000o\000o\000k\000e\000r}{section.6}% 17 +\BOOKMARK [2][-]{subsection.6.4}{\376\377\0006\000.\0004\000\040\000d\000n\000e\000s\000t\0004}{section.6}% 18 +\BOOKMARK [2][-]{subsection.6.5}{\376\377\0006\000.\0005\000\040\000m\000u\000l\000t\000i\000n\000e\000s\000t}{section.6}% 19 +\BOOKMARK [2][-]{subsection.6.6}{\376\377\0006\000.\0006\000\040\000p\000o\000l\000y\000c\000h\000o\000r\000d}{section.6}% 20 +\BOOKMARK [2][-]{subsection.6.7}{\376\377\0006\000.\0007\000\040\000u\000l\000t\000r\000a\000n\000e\000s\000t}{section.6}% 21 +\BOOKMARK [1][-]{section.7}{\376\377\0007\000\040\000F\000A\000Q}{}% 22 +\BOOKMARK [1][-]{section.8}{\376\377\0008\000\040\000B\000e\000\040\000K\000i\000n\000d}{}% 23 diff --git a/doc/LISA_user_manual/LISA_user_manual.pdf b/doc/LISA_user_manual/LISA_user_manual.pdf new file mode 100644 index 0000000..cc817bf Binary files /dev/null and b/doc/LISA_user_manual/LISA_user_manual.pdf differ diff --git a/doc/LISA_user_manual/LISA_user_manual.tex b/doc/LISA_user_manual/LISA_user_manual.tex new file mode 100644 index 0000000..791d321 --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.tex @@ -0,0 +1,621 @@ +% LISA User Manual +% +% Please note this document will be automatically compiled and hosted online +% after each commit to master. Because of this, renaming or moving the +% document should be done carefully. To see the compiled document, go to +% https://exosports.github.io/LISA/doc/LISA_User_Manual.html + +\documentclass[letterpaper, 12pt]{article} +\input{top-LISA_user_manual} + +\begin{document} + +\begin{titlepage} +\begin{center} + +\textsc{\LARGE University of Central Florida}\\[1.5cm] + +% Title +\rule{\linewidth}{0.5mm} \\[0.4cm] +{ \huge \bfseries LISA Users Manual \\[0.4cm] } +\rule{\linewidth}{0.5mm} \\[1.0cm] + +\textsc{\Large Large-selection Interface for Sampling Algorithms}\\[1.5cm] + +% Author and supervisor +\noindent +\begin{minipage}{0.4\textwidth} +\begin{flushleft} +\large +\emph{Authors:} \\ +Michael D. \textsc{Himes} \\ +\end{flushleft} +\end{minipage}% +\begin{minipage}{0.4\textwidth} +\begin{flushright} \large +\emph{Supervisor:} \\ +Dr.~Joseph \textsc{Harrington} +\end{flushright} +\end{minipage} +\vfill + +% Bottom of the page +{\large \today} + +\end{center} +\end{titlepage} + +\tableofcontents +\newpage + +\section{Team Members} +\label{sec:team} + +\begin{itemize} +\item \href{https://github.com/mdhimes/}{Michael Himes}% + \footnote{https://github.com/mdhimes/}, University of + Central Florida (mhimes@knights.ucf.edu) +\item Joseph Harrington, University of Central Florida +\end{itemize} + +\section{Introduction} +\label{sec:theory} + +\noindent This document describes LISA, the Large-selection Interface for +Sampling Algorithms. LISA provides a unified interface for different +Bayesian samplers, both Markov chain Monte Carlo (MCMC) and nested sampling +(NS). \newline + +\noindent Presently, LISA supports the +DEMC algorithm of ter Braak (2006), +DEMCzs of ter Braak \& Vrugt (2008, `snooker'), +MultiNest of Feroz et al. (2008) via PyMultiNest (Buchner et al. 2014), +UltraNest of Buchner (2016), +dynesty of Speagle (2019), +DNest4 of Brewer \& Foreman-Mackey (2018), +polychord of Handley et al. (2015a, 2015b), and +MT-DREAMzs of Laloy and Vrugt (2012) via PyDREAM (\href{https://github.com/LoLab-VU/PyDREAM}{https://github.com/LoLab-VU/PyDREAM}). +We welcome users to contribute wrappers for additional +algorithms via a pull request on Github. \newline + +\noindent The detailed LISA code documentation and User Manual\footnote{Most recent version of the manual available at +\href{https://exosports.github.io/LISA/doc/LISA_User_Manual.html}{https://exosports.github.io/LISA/doc/LISA\_User\_Manual.html}} +are provided with the package to assist users. +For additional support, contact the lead author (see Section \ref{sec:team}). \newline + +\noindent LISA is released under the Reproducible Research Software License. +For details, see \\ +\href{https://planets.ucf.edu/resources/reproducible-research/software-license/}{https://planets.ucf.edu/resources/reproducible-research/software-license/}.\newline + +\noindent The LISA package is organized as follows: \newline +% The framebox and minipage are necessary because dirtree kills the +% indentation. +\noindent\framebox{\begin{minipage}[t]{0.97\columnwidth}% +\dirtree{% + .1 LISA. + .2 doc. + .2 example. + .2 lib. + .2 modules. + .3 MCcubed. +} +\end{minipage}} +\vspace{0.7cm} +% \newline is not working here, therefore I use vspace. +% (because dirtree is such a pain in the ass) + +\section{Installation} +\label{sec:installation} + +\subsection{System Requirements} +\label{sec:requirements} + +\noindent LISA was developed on a Linux machine using the following +versions of packages: + +\begin{itemize} +\item Python 3.7.2 +\item Numpy 1.16.2 +\item Matplotlib 3.0.2 +\item mpi4py 3.0.3 +\item Scipy 1.5.3 +\item h5py 2.9.0 +\item MULTINEST 3.10 +\item pymultinest 2.10 +\item ultranest 2.2.2 +\item dynesty 1.0.1 +\item DNest4 0.2.4 +\item PyDREAM 2.0.0 +\end{itemize} + + +\subsection{Install and Compile} +\label{sec:install} + +\noindent To begin, obtain the latest stable version of LISA. \newline + +\noindent First, decide on a local directory to hold LISA. Let the path to this +directory be `LISA'. Now, recursively clone the repository: +\begin{verbatim} +git clone --recursive https://github.com/exosports/LISA LISA/ +cd LISA/ +\end{verbatim} + +\noindent LISA contains a file to easily build a conda environment capable of +executing the software. Create the environment and activate it via + +\begin{verbatim} +conda env create -f environment.yml +conda activate lisa +\end{verbatim} + +\noindent On some systems, this approach may fail. For a more robust approach that +requires additional steps, enter + +\begin{verbatim} +conda create -n lisa python=3.7.2 +conda activate lisa +conda env update --file environment.yml +\end{verbatim} + +\noindent This will build a base Python 3.7.2 environment, activate it, and then update +it with the packages necessary to run LISA.\newline + +\noindent Mac users may need to install additional tools: +\begin{verbatim} +xcode-select --install +\end{verbatim} +\noindent This installs make, gcc, git, and other utilities needed.\newline + + +\noindent Now, install LISA: +\begin{verbatim} + python setup.py install +\end{verbatim} +\noindent This will compile required submodules and build an importable +package.\newline + +\noindent To check that everything installed properly, start up a Python +session and try +\begin{verbatim} + import lisa +\end{verbatim} +\noindent If it succeeds without warnings about missing MultiNest files, +you are now ready to use LISA! + + +\section{Example} +\label{sec:example} + +The following script will walk a user through using LISA for a basic quadratic +fit. + +\noindent To begin, copy the requisite files to a directory parallel to LISA. +Beginning from LISA/, +\begin{verbatim} +mkdir ../run +cp -a ./example/* ../run/. +cd ../run +\end{verbatim} + +\noindent Make your test data. Execute the provided script with +desired parameters. For example, data following \math{3x^2 - x + 2} +would be created via +\begin{verbatim} +./make_data.py 3 -1 2 +\end{verbatim} +\noindent This will produce true.npy, data.npy, uncert.npy, and params.npy, +which contain the true data, noisy data, uncertainty on each data point, and +the true parameters, respectively. The x-axis is assumed to be the integers +from -5 to 5, inclusive, and the uncertainty is assumed to be the square root +of the true data.\newline + +\noindent Now, take a look at and execute LISA for each of the samplers: + +\begin{verbatim} +./demc_example.py +./dnest4_example.py +./dynesty_example.py +./snooker_example.py +./multinest_example.py +./polychord_example.py +./ultranest_example.py +\end{verbatim} + +\noindent Each will produce some output files (logs, plots, etc.) in +appropriately-named subdirectories.\newline + + +\section{Program Inputs} +\label{sec:inputs} + +LISA's design as an importable package allows for convenient usage in existing +codes. Users interact with LISA through its \tt{setup} or \tt{run} functions. +Each has 1 position argument (the desired algorithm; options are listed below), +and they take keyword arguments for the different parameters of the sampling +algorithm. + +\subsection{Sampling Algorithm} + +LISA currently supports 8 Bayesian sampling algorithms: +\begin{itemize} +\item demc : DEMC MCMC algorithm of ter Braak (2006) +\item dnest4 : Diffusive NS implementation of Brewer \& Foreman-Mackey (2018) +\item dream : MT-DREAMzs algorithm of Laloy and Vrugt (2012) +\item dynesty: Dynamic NS of Speagle (2019) +\item polychord: PolyChord NS algorithm of Handley et al. (2015a, 2015b) +\item snooker : DEMCzs MCMC algorithm of ter Braak \& Vrugt (2008) +\item multinest: MultiNest NS algorithm of Feroz et al. (2008) +\item ultranest: UltraNest NS algorithm of Buchner (2014, 2016, 2019). +\end{itemize} + +\noindent The choice of sampling algorithm also decides the allowed inputs. +Each sampler's inputs are listed in the following subsections. Bold +indicates a parameter that must be specified (typically, they have no default); +optional parameters are given reasonable defaults. Section +\ref{sec:param-desc} describes each parameter. Note that some `optional' +parameters can strongly influence the results (e.g., dlogz for nested samplers), +so users are encouraged to experiment with them. + +\subsubsection{demc \& snooker} +\label{sec:mcmc-inputs} +\begin{itemize} +\item \textbf{burnin} +\item \textbf{data} +\item fbestp +\item fext +\item flog +\item fsavefile +\item fsavemodel +\item hsize (only snooker) +\item indparams +\item kll +\item \textbf{model} +\item modelper +\item \textbf{nchains} +\item \textbf{niter} +\item \textbf{outputdir} +\item \textbf{pinit} +\item \textbf{pmax} +\item \textbf{pmin} +\item pnames +\item \textbf{pstep} +\item resume +\item thinning +\item truepars +\item \textbf{uncert} +\item verb +\end{itemize} + +\subsubsection{dream} +\begin{itemize} +\item burnin +\item fbestp +\item fext +\item fprefix +\item fsavefile +\item \textbf{loglike} +\item multitry +\item \textbf{nchains} +\item \textbf{niter} +\item \textbf{outputdir} +\item \textbf{pmax} +\item \textbf{pmin} +\item pnames +\item pstep +\item resume +\item thinning +\item truepars +\item verb +\end{itemize} + +\subsubsection{dnest4} +\begin{itemize} +\item beta +\item fbestp +\item fext +\item fsavefile +\item kll +\item lam +\item \textbf{loglike} +\item \textbf{model} +\item \textbf{niter} +\item \textbf{nlevel} +\item \textbf{nlevelint} +\item \textbf{nperstep} +\item \textbf{outputdir} +\item \textbf{perturb} +\item pnames +\item \textbf{prior} +\item \textbf{pstep} +\item resample +\item truepars +\item verb +\end{itemize} + +\subsubsection{dynesty, multinest, polychord, \& ultranest} +\label{sec:ns-inputs} +\begin{itemize} +\item bound (only dynesty) +\item dlogz +\item dumper +\item fbestp +\item fext +\item frac\_remain (only ultranest) +\item fprefix (only multinest) +\item fsavefile +\item kll +\item Lepsilon (only ultranest) +\item \textbf{loglike} +\item min\_ess (only dynesty \& ultranest) +\item \textbf{model} +\item niter +\item \textbf{nlive} +\item \textbf{nlive\_batch} (only dynesty) +\item nrepeat (only polychord) +\item \textbf{outputdir} +\item pnames +\item \textbf{prior} +\item \textbf{pstep} +\item resume (all except dynesty) +\item sample (only dynesty) +\item truepars +\item verb +\end{itemize} + +\subsection{Parameter Dictionary} +\label{sec:param-desc} + +Users are only required to specify the relevant parameters listed in +the previous section. Each parameter is described below, alphabetically. +To utilize default values, do not include it in **kwargs. + +\begin{itemize} +\item beta : float. DNest4 only. From their docs: strength of effect + to force histogram to equal push. Default: 100.0 +\item bound : str. Dynesty only. Option to bound the target + distribution. Choices: none (sample from unit + cube), single (one ellipsoid), multi (multiple + possibly overlapping ellipsoids), balls + (overlapping balls centered on each live point), + cubes (overlapping cubes centered on each live + point). Default: multi +\item burnin : int. Number of initial iterations to be discarded. +\item data : array, Numpy binary. Measured data for inference. + Must be Numpy array, list, or a path to a NPY file. +\item dlogz : float. Target evidence uncertainty (stops when below + this value). Lower = more accurate, but also + requires longer runtime. Default: 0.1 +\item dumper : object. Polychord only. Function to output info + during the inference. Default: None +\item fbestp : str. Filename for array of best-fit parameters. + Must be NPY file. +\item fext : str. File extension for saved plots. + Options: .png, .pdf Default: .png +\item flog : str. MCMCs only. /path/to/log file to save out. + Default: MCMC.log, located in `outputdir` +\item fprefix : str. Prefix for output filenames. Recommended to be + a directory (possibly with a prefix for all + produced files), as this will create a + subdirectory within `outputdir`. + Default: pmn/ for multinest, + run1 for polychord. +\item fsavefile : str. Filename to store parameters explored. + If relative path, it is considered with + respect to `outputdir`. + Default: `outputdir`/output.npy +\item fsavemodel : str. MCMCs only (currently). + Filename to store models, corresponding to + the parameters. If relative path, it is + considered with respect to `outputdir`. + If None, file is not saved. + Beware: the file may be extremely large + if the model output has high dimensionality. + See `modelper' to have it automatically split into + subfiles. + Default: None +\item frac\_remain : float. UltraNest only. Sets the fraction + remainder when integrating the posterior. +\item hsize : int. Snooker only. Number of samples per chain to seed the + phase space. Default: 10 +\item indparams : list. MCMCs only. Additional parameters needed by `model`. +\item kll : object. Datasketches KLL object, for model quantiles. + Use None if not desired or if Datasketches is + not installed. Default: None +\item lam : float. DNest 4 only. From their docs: backtracking scale + length. Default: 5.0 +\item Lepsilon : float. UltraNest only. From their docs: "Terminate + when live point likelihoods are all the same, + within Lepsilon tolerance." +\item loglike : object. Nested samplers only. Function defining the log + likelihood. +\item min\_ess : int. Minimum effective sample size (ESS). Default: 500 +\item model : object. Function defining the forward model. +\item modelper : int. MCMCs only. Sets how to split `fsavemodel` + into subfiles. + If 0, does not split. If >0, saves out every + `modelper` iterations. E.g., if nchains=10 and + modelper=5, splits every 50 model evaluations. + Default: 0 +\item multitry : int. DREAM only. Determines whether to use multi-try sampling. + Default: 5 +\item nchains : int. Number of parallel samplers. Default: 1 +\item niter : int. Maximum number of iterations. Nested samplers + default to no limit. +\item nlive : int. (Minimum) number of live points to use. Default: 500 +\item nlive\_batch: int. Dynesty only. From their docs: "The number of + live points used when adding additional + samples from a nested sampling run within + each batch." Default: 500. +\item nlevel : int. DNest4 only. From their docs: Maximum number of levels to + create. Default: 30 +\item nlevelint : int. DNest4 only. Number of moves before creating new level. + Default: 10000 +\item nperstep : int. DNest4 only. Number of moves per MCMC iteration. + Default: 10000 +\item nrepeat : int. Polychord only. From their docs: The number of + slice slice-sampling steps to generate a new + point. Increasing [nrepeat] increases the + reliability of the algorithm. Default: None + (uses polychord's default of 5*ndims) +\item outputdir : str. path/to/directory where output will be saved. +\item perturb : object. DNest4 only. Function that proposes changes to + parameter values. +\item pinit : array, Numpy binary. For MCMCs, initial parameters for + samplers. For nested sampling algorithms, + values are used for parameters that are held + constant, if any. + Must be Numpy array, list, or a path to a NPY file. +\item pmax : array, Numpy binary. Maximum value for each parameter. + Must be Numpy array, list, or a path to a NPY file. +\item pmin : array, Numpy binary. Minimum value for each parameter. + Must be Numpy array, list, or a path to a NPY file. +\item pnames : array. Name of each parameter (can use some LaTeX if + desired). + Must be Numpy array or list. +\item prior : object. Function defining the prior. +\item pstep : array. Step size for each parameter. For MCMCs, only + matters for the initial samples and determining + constant parameters, as step size is + automatically adjusted. For nested sampling + algorithms, only used to determine constant + parameters. +\item resample : float. DNest4 only. Must be non-negative. + If >0, corresponds to a factor affecting the + number of draws from the posterior. If 0, no + resampling is performed. Default: 100 +\item resume: bool. Determines whether to resume a previous run, if possible. + Default: False +\item sample : str. Dynesty only. Sampling method. Choices + (descriptions from their docs): unif (uniform + sampling), rwalk (random walks from current live + point), rstagger (random "staggering" away from + current live point), slice (multivariate slice + sampling), rslice (random slice sampling), hslice + ("Hamiltonian" slice sampling), auto + (automatically selected based on problem + dimensionality). Default: auto +\item thinning : int. Thinning factor for the posterior + (keep every N iterations). + Example: a thinning factor of 3 will keep every + third iteration. Only recommended when the + computed posterior is extremely large. + Default: 1 +\item truepars : array, Numpy binary. Known true values for the model + parameters. If unknown, use None. Default: None +\item uncert : array, Numpy binary. Data uncertainties. + Must be Numpy array, list, or a path to a NPY file. +\item verb : int. Verbosity level. If 0, only essential messages + are printed by LISA. If 1, prints additional + messages (e.g., loading data files). + In the future, additional levels may be added. + Default: 0 +\end{itemize} + + +\section{Program Outputs} +\label{sec:outputs} + +LISA has two main functions: \tt{setup} and \tt{run}. \tt{setup} returns +an initialized Sampler object. \tt{run} returns the Sampler object (with +additional attributes: outp for the posterior and bestp for the best parameters) and produces at least 3 plots. + +\subsection{Returns} +\begin{itemize} +\item samp: Sampler object. Contains the attributes listed Sections +\ref{sec:mcmc-inputs} -- \ref{sec:ns-inputs}. +\end{itemize} + +\subsection{Output Files} +\begin{itemize} +\item pairwise: corner plot of histograms of the 2D marginalized posteriors. +\item posterior: histogram plots of the 1D marginalized posteriors. +\item trace: parameter history plots. +\end{itemize} + +\noindent If fsavefile and fbestp are not None, there are two NPY files +produced. +\begin{itemize} +\item bestp.npy: Array of best parameters. +\item outp.npy: Array of the approximation to the posterior. +\end{itemize} + +\noindent Except for dynesty, each sampler also has additional output files, +briefly discussed below.\newline + +\subsection{demc \& snooker} +\begin{itemize} +\item MCMC.log: text file with statistics about the MCMC run. +\end{itemize} + +\subsection{dnest4} +DNest4 produces some files about the sampler's history. All are saved into +`outputdir` EXCEPT for sampler\_state.txt, which is saved into the directory +where LISA was executed from. For more details, see the DNest4 code/docs. + +\subsection{multinest} +\begin{itemize} +\item marginals\_multinest.png: plot of the 1D marginalized posteriors produced + by multinest. +\end{itemize} +\noindent Additionally, a subdirectory containing the files necessary to resume +the run as well as summary plots and files is created (default is pmn/). For +more details, see the MultiNest/PyMultiNest docs. + +\subsection{polychord} +\begin{itemize} +\item MCMC.log: text file with statistics about the MCMC run. +\end{itemize} + +\subsection{ultranest} +UltraNest's output gets saved into a subdirectory named `run` followed by a +number. It contains a log file, chain histories, summary files, and plots. +For more details, see UltraNest's docs. + + +\section{FAQ} + +This section will cover some frequently asked questions about using LISA. +Have a question that isn't answered below? Please send it to the corresponding +author so we can add it to this section! \newline + +\noindent \textbf{Q: What is effective sample size (ESS) and why should I care?} +A: As Bayesian samplers explore a phase space, the subsequent sets of parameters +are based in part on earlier sets of parameters. Thus, iterations are +correlated. After some number of samples, new iterations will ``forget'' some +of the earlier samples. Yet, we are really interested in the number of +independent samples, as that will inform how thoroughly the phase space has +been explored (taking a bunch of correlated samples doesn't give us much new +information!). The number of iterations necessary before a new sample is +independent of a given earlier sample (steps per effective independent sample, +SPEIS) informs the ESS. For example, if we have 20,000 samples, but a given +sample is correlated with the previous 100 samples, then the ESS is just +20000 / 100, or 200. The ESS value, in turn, informs us of the accuracy of +a credible region determined from the posterior distribution. Without +providing a detailed proof (interested readers can find it in Harrington et +al. 2021, Appendix A), the relationship between the ESS, a credible region +\math{\hat{C}}, and the uncertainty on the credible region +\math{s\sb{\hat{C}}} is +\begin{equation} +{\rm ESS} \approx \frac{\hat{C}(1-\hat{C})}{s\sbp{\hat{C}}{2}}. +\end{equation} +Thus, for a 0.5\% uncertainty on the 95.45\% region (2\math{\sigma} for a +Gaussian), an ESS \math{\approx} 1700 is required. A SPEIS of 1000 would +thus require 1.7 million iterations! + + +\section{Be Kind} +\label{sec:bekind} +Please note that this software has not been officially released yet; see the +license for some restrictions on its usage prior to release. Upon release, +we will add the relevant citation here, with a Bibtex entry. + +\noindent Thanks! + +% \section{Further Reading} +% \label{sec:furtherreading} + +% TBD: Add papers here. + + +\end{document} diff --git a/doc/LISA_user_manual/LISA_user_manual.toc b/doc/LISA_user_manual/LISA_user_manual.toc new file mode 100644 index 0000000..7e6129e --- /dev/null +++ b/doc/LISA_user_manual/LISA_user_manual.toc @@ -0,0 +1,23 @@ +\contentsline {section}{\numberline {1}Team Members}{2}{section.1}% +\contentsline {section}{\numberline {2}Introduction}{2}{section.2}% +\contentsline {section}{\numberline {3}Installation}{2}{section.3}% +\contentsline {subsection}{\numberline {3.1}System Requirements}{2}{subsection.3.1}% +\contentsline {subsection}{\numberline {3.2}Install and Compile}{3}{subsection.3.2}% +\contentsline {section}{\numberline {4}Example}{4}{section.4}% +\contentsline {section}{\numberline {5}Program Inputs}{4}{section.5}% +\contentsline {subsection}{\numberline {5.1}Sampling Algorithm}{5}{subsection.5.1}% +\contentsline {subsubsection}{\numberline {5.1.1}demc \& snooker}{5}{subsubsection.5.1.1}% +\contentsline {subsubsection}{\numberline {5.1.2}dream}{6}{subsubsection.5.1.2}% +\contentsline {subsubsection}{\numberline {5.1.3}dnest4}{7}{subsubsection.5.1.3}% +\contentsline {subsubsection}{\numberline {5.1.4}dynesty, multinest, polychord, \& ultranest}{8}{subsubsection.5.1.4}% +\contentsline {subsection}{\numberline {5.2}Parameter Dictionary}{9}{subsection.5.2}% +\contentsline {section}{\numberline {6}Program Outputs}{12}{section.6}% +\contentsline {subsection}{\numberline {6.1}Returns}{12}{subsection.6.1}% +\contentsline {subsection}{\numberline {6.2}Output Files}{12}{subsection.6.2}% +\contentsline {subsection}{\numberline {6.3}demc \& snooker}{12}{subsection.6.3}% +\contentsline {subsection}{\numberline {6.4}dnest4}{13}{subsection.6.4}% +\contentsline {subsection}{\numberline {6.5}multinest}{13}{subsection.6.5}% +\contentsline {subsection}{\numberline {6.6}polychord}{13}{subsection.6.6}% +\contentsline {subsection}{\numberline {6.7}ultranest}{13}{subsection.6.7}% +\contentsline {section}{\numberline {7}FAQ}{13}{section.7}% +\contentsline {section}{\numberline {8}Be Kind}{14}{section.8}% diff --git a/doc/LISA_user_manual/apj_hyperref.bst b/doc/LISA_user_manual/apj_hyperref.bst new file mode 100644 index 0000000..9daf616 --- /dev/null +++ b/doc/LISA_user_manual/apj_hyperref.bst @@ -0,0 +1,1701 @@ +% April 2006 Antony Lewis: added eprint, ADS and ISNB support +% See http://cosmocoffee.info/viewtopic.php?p=1567 +% in tex file add +% \usepackage{hyperref} +% \bibliographystyle{apj_hyperref} +% \providecommand{\eprint}[1]{\href{http://arxiv.org/abs/#1}{#1}} +% \newcommand{\ISBN}[1]{\href{http://cosmologist.info/ISBN/#1}{ISBN: #1}} +% \providecommand{\adsurl}[1]{\href{#1}{ADS}} +% +% eprint number will be written after paper info, and arxiv, ADS and ISBN will be hyperlinked +% +%% 2003 Jun 25 +%% Fix by Craig Wiegert +%% Added 8 author upper limit to reference list, based on aas.bst. +%% (This could also be accomplished by adding 'nmlm,x8,m1' options to +%% the input to merlin.mbs, and probably should be done that way as it's +%% more thorough... but that would ignore the other bug fixes below.) + +%% $Log: apj.bst,v $ +%% Revision 1.4 2002/06/18 16:37:48 alberto +%% Add comma after first author in two-author reference +%% Fix courtesy of Tim Robishaw +%% +%% Revision 1.3 2000/04/20 22:17:50 jbaker +%% Fixed INBOOK bug, now works essentially like BOOK. +%% +%% Revision 1.2 1998/08/30 22:35:45 jbaker +%% Added RCS keywords. +%% +%% 1998/08/12 J Baker +%% Tweaked by hand to get correct results for ApJ. Added functions from +%% astrobib. + + +%% +%% This is file `apj.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `,ay,nat,nm-rev,nmdash,dt-beg,yr-per,note-yr,atit-u,jtit-x,jttl-rm,thtit-a,vnum-x,volp-com,jpg-1,pp-last,btit-rm,add-pub,pub-par,pre-edn,edby,edbyx,blk-com,fin-bare,ppx,ed,abr,ord,jabr,amper,em-x') +%% ---------------------------------------- +%% *** Bibliographic Style for ApJ *** +%% + %------------------------------------------------------------------- + % The original source file contains the following version information: + % \ProvidesFile{merlin.mbs}[1998/02/25 3.85a (PWD)] + % + % NOTICE: + % This file may be used for non-profit purposes. + % It may not be distributed in exchange for money, + % other than distribution costs. + % + % The author provides it `as is' and does not guarantee it in any way. + % + % Copyright (C) 1994-98 Patrick W. Daly + %------------------------------------------------------------------- + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is an author-year citation style bibliography. As such, it is + % non-standard LaTeX, and requires a special package file to function properly. + % Such a package is natbib.sty by Patrick W. Daly + % The form of the \bibitem entries is + % \bibitem[Jones et al.(1990)]{key}... + % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... + % The essential feature is that the label (the part in brackets) consists + % of the author names, as they should appear in the citation, with the year + % in parentheses following. There must be no space before the opening + % parenthesis! + % With natbib v5.3, a full list of authors may also follow the year. + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \citet{key} ==>> Jones et al. (1990) + % \citet*{key} ==>> Jones, Baker, and Smith (1990) + % \citep{key} ==>> (Jones et al., 1990) + % \citep*{key} ==>> (Jones, Baker, and Smith, 1990) + % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) + % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990) + % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) + % \citeauthor{key} ==>> Jones et al. + % \citeauthor*{key} ==>> Jones, Baker, and Smith + % \citeyear{key} ==>> 1990 + %--------------------------------------------------------------------- + +ENTRY + { address + ISBN + adsurl + eprint + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + } + {} + { label extra.label sort.label short.list } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} + +STRINGS { s t } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {format.eprint} +{ eprint empty$ +{ "" } +{ ", \eprint{" * eprint * "}" * } +if$ +} +FUNCTION {format.adsurl} +{ adsurl empty$ +{ "" } +%{ ", \href{" * adsurl * "}{ADS}" * } +{ ", \adsurl{" * adsurl * "}" * } +if$ +} +FUNCTION {format.ISBN} +{ ISBN empty$ +{ "" } +%{ ", \href{http://cosmologist.info/ISBN/" * ISBN * "}{ISBN: " * ISBN * "}" * } +{ ", \ISBN{" * ISBN * "}" * } +if$ +} + + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {fin.entry} +{ duplicate$ empty$ + 'pop$ + 'write$ + if$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {date.block} +{ + skip$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ skip$ } + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.editors} +{ "eds." } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edn." } + +FUNCTION {bbl.volume} +{ "Vol." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "" } + +FUNCTION {bbl.page} +{ "" } + +FUNCTION {bbl.chapter} +{ "Ch." } +%{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "PhD thesis" } + +FUNCTION {bbl.first} +{ "1st" } + +FUNCTION {bbl.second} +{ "2nd" } + +FUNCTION {bbl.third} +{ "3rd" } + +FUNCTION {bbl.fourth} +{ "4th" } + +FUNCTION {bbl.fifth} +{ "5th" } + +FUNCTION {bbl.st} +{ "st" } + +FUNCTION {bbl.nd} +{ "nd" } + +FUNCTION {bbl.rd} +{ "rd" } + +FUNCTION {bbl.th} +{ "th" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +FUNCTION {eng.ord} +{ duplicate$ "1" swap$ * + #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ + duplicate$ "1" = + { pop$ bbl.st * } + { duplicate$ "2" = + { pop$ bbl.nd * } + { "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Softw. Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput.-Aided Design Integrated Circuits"} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Programming"} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Gr."} + +MACRO {toms} {"ACM Trans. Math. Softw."} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."} + +MACRO {tcs} {"Theoretical Comput. Sci."} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := +%% 2003 May 14 +%% Fix by Craig Wiegert +%% Added the following two lines to make 8 author upper limit to +%% reference list, based on what is found in aas.bst. + numnames #8 > + { s #1 "{vv~}{ll}{, jj}{, f.}" format.name$ " {et~al.}" * } + { { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, jj}{, f.}" format.name$ + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #1 > +%% AA 6/18/2002 +%% This fix courtesy of Tim Robishaw : +%% Original version left comma out after initials of first author +%% for two-author papers!! +%% numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " {et~al.}" * + } + { " \& " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +%% CCW: Closing the new max-author test + } + if$ +} + +FUNCTION {format.names.ed} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f.~}{vv~}{ll}{, jj}" + format.name$ + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " {et~al.}" * + } + { " \& " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { ", " * bbl.editors * } + { ", " * bbl.editor * } + if$ + } + if$ +} + +FUNCTION {format.in.editors} +{ editor empty$ + { "" } + { editor format.names.ed + } + if$ +} + +FUNCTION {format.note} +{ note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + } + if$ +} + +FUNCTION {format.full.names} +{'s := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}" format.name$ + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " {et~al.}" * + } + { " \& " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {author.editor.key.full} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {author.key.full} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {editor.key.full} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ +} + +FUNCTION {make.full.names} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.full + { type$ "proceedings" = + 'editor.key.full + 'author.key.full + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem[{" write$ + label write$ + ")" make.full.names duplicate$ short.list = + { pop$ } + { * } + if$ + "}]{" * write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in + " " * } + +FUNCTION {format.date} +{ year duplicate$ empty$ + { "empty year in " cite$ * "; set to ????" * warning$ + pop$ "????" } + 'skip$ + if$ + extra.label * + before.all 'output.state := + after.sentence 'output.state := +} + +FUNCTION {format.btitle} +{ title +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.connect + series empty$ + 'skip$ + { bbl.of space.word * series emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.connect + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { bbl.in space.word * series * } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +FUNCTION {convert.edition} +{ edition extract.num "l" change.case$ 's := + s "first" = s "1" = or + { bbl.first 't := } + { s "second" = s "2" = or + { bbl.second 't := } + { s "third" = s "3" = or + { bbl.third 't := } + { s "fourth" = s "4" = or + { bbl.fourth 't := } + { s "fifth" = s "5" = or + { bbl.fifth 't := } + { s #1 #1 substring$ is.num + { s eng.ord 't := } + { edition 't := } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + t +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { convert.edition "l" change.case$ " " * bbl.edition * } + { convert.edition "t" change.case$ " " * bbl.edition * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check +% { bbl.pages pages n.dashify tie.or.space.connect } +% { bbl.page pages tie.or.space.connect } + { pages n.dashify } + { pages } + if$ + } + if$ +} + +FUNCTION {first.page} +{ 't := + "" + { t empty$ not t #1 #1 substring$ "-" = not and } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + while$ +} + +FUNCTION {format.journal.pages} +{ pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { + ", " * + pages first.page * + } + if$ + } + if$ +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + { "" } + { type empty$ + { bbl.chapter } + { type "l" change.case$ } + if$ + chapter tie.or.space.connect + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { word.in booktitle emphasize * } + { word.in booktitle emphasize * + ", " * + editor num.names$ #1 > + { bbl.editors } + { bbl.editor } + if$ + * " " * + format.in.editors * + } + if$ + } + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { bbl.techrep } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + word.in + } + { bbl.volume volume tie.or.space.connect + bbl.of space.word * + } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} + +FUNCTION {format.publisher} +{ publisher empty$ + { "empty publisher in " cite$ * warning$ } + 'skip$ + if$ + "" + address empty$ publisher empty$ and + 'skip$ + { + add.blank "(" * + address empty$ + 'skip$ + { address * } + if$ + publisher empty$ + 'skip$ + { address empty$ + 'skip$ + { ": " * } + if$ + publisher * + } + if$ + ")" * + } + if$ + output +} + +STRINGS {oldname} + +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { "---" } + { s 'oldname := s } + if$ + } + if$ +} + +%%%%%%%% Functions added from astrobib + +FUNCTION {format.edn.btitle} % Title should be on stack. +{ duplicate$ empty$ edition empty$ or + 'skip$ + { ", " * format.edition * } + if$ +} + +FUNCTION {format.ed.booktitle} % The title should be on the stack. +{ duplicate$ empty$ + { "no book title in " cite$ * warning$ "" pop$ } + { editor empty$ + author empty$ or % Empty author means editor already given. + 'format.edn.btitle + { format.edn.btitle ", " * bbl.editor * " " * format.in.editors * } + if$ + } + if$ +} + +FUNCTION {format.full.book.spec} % The title should be on the stack. +{ series empty$ + { format.ed.booktitle + volume empty$ + { number empty$ + 'skip$ + { " there's a number but no series in " cite$ * warning$ + " No." number tie.or.space.connect * } + if$ + } + { ", Vol." volume tie.or.space.connect * + number empty$ + 'skip$ + {"Both volume and number fields in " * cite$ * warning$ } + if$ + } + if$ + } + { volume empty$ + { format.ed.booktitle ", " * series * + number empty$ + 'skip$ + { " No." number tie.or.space.connect * } + if$ + } + { series ", Vol." volume tie.or.space.connect * + ", " * swap$ format.ed.booktitle * + number empty$ + 'skip$ + {"Both volume and number fields in " * cite$ * warning$ } + if$ + } + if$ + } + if$ +} + +%%%%%%% End of functions from astrobib + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + author format.key output + name.or.dash + format.date "year" output.check + date.block + crossref missing$ + { journal + "journal" output.check + format.vol.num.pages output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + format.journal.pages + format.adsurl output + format.eprint output + format.note output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + name.or.dash + } + { format.authors output.nonnull + name.or.dash + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + title format.full.book.spec output +% format.btitle "title" output.check +% crossref missing$ +% { format.bvolume output +% format.number.series output +% format.edition output + format.publisher +% } +% { +% format.book.crossref output.nonnull +% } +% if$ + format.pages output + format.eprint output + format.ISBN output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output + name.or.dash + format.date "year" output.check + date.block + format.title "title" output.check + howpublished output + address output + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + name.or.dash + } + { format.authors output.nonnull + name.or.dash + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + title format.full.book.spec output +% format.btitle "title" output.check +% crossref missing$ +% { +% format.bvolume output +% format.chapter.pages "chapter and pages" output.check +% format.number.series output +% format.edition output + format.publisher +% } +% { +% format.chapter.pages "chapter and pages" output.check +% format.book.crossref output.nonnull +% } +% if$ + format.pages "pages" output.check + format.eprint output + format.ISBN output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + author format.key output + name.or.dash + format.date "year" output.check + date.block + bbl.in " " * booktitle format.full.book.spec * output +% crossref missing$ +% { format.in.ed.booktitle "booktitle" output.check +% format.bvolume output +% format.number.series output +% format.edition output +% format.chapter.pages output + format.publisher +% } +% { format.incoll.inproc.crossref output.nonnull +% format.chapter.pages output +% } +% if$ + format.pages "pages" output.check + format.eprint output + format.ISBN output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output % added + format.date "year" output.check + date.block + bbl.in " " * booktitle format.full.book.spec * output +% crossref missing$ +% { format.in.ed.booktitle "booktitle" output.check +% format.bvolume output +% format.number.series output + publisher empty$ + { organization output + address output + } + { organization output + format.publisher + } + if$ +% } +% { format.incoll.inproc.crossref output.nonnull +% } +% if$ + format.pages output + format.eprint output + format.ISBN output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output + name.or.dash + format.date "year" output.check + date.block + format.btitle "title" output.check + format.edition output + organization output + address output + format.eprint output + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + name.or.dash + format.date "year" output.check + date.block +% format.title "title" output.check + bbl.mthesis format.thesis.type output.nonnull + school "school" output.check + address output + format.eprint output + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output + name.or.dash + format.date "year" output.check + date.block + format.title output + howpublished output + format.eprint output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + name.or.dash + format.date "year" output.check + date.block +% format.title "title" output.check + bbl.phdthesis format.thesis.type output.nonnull + school "school" output.check + address output + format.eprint output + format.note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization output + organization format.key output } + { format.editors output } + if$ +% format.editors output +% editor format.key output + name.or.dash + format.date "year" output.check + date.block + title format.full.book.spec output +% format.btitle "title" output.check +% format.bvolume output +% format.number.series output + publisher empty$ not % No need for warning if no pub. + { format.publisher } + { editor empty$ % For empty editor, organization was already given. + 'skip$ + { organization output } + if$ + address output + } + if$ +% address output +% organization output +% publisher output + format.pages output + format.eprint output + format.ISBN output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output + name.or.dash + format.date "year" output.check + date.block + format.title "title" output.check + format.tr.number output.nonnull + institution "institution" output.check + address output + format.eprint output + format.ISBN output + format.adsurl output + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output + name.or.dash + format.date "year" output.check + date.block +% format.title "title" output.check + format.eprint output + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } + +READ + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +FUNCTION {format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ + " {et~al.}" * + } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + " {et~al.}" * + } + { " \& " * s #2 "{vv~}{ll}" format.name$ + * } + if$ + } + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + "(" + * + year duplicate$ empty$ + { pop$ "????" } + 'skip$ + if$ + * + 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ calc.label + label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +STRINGS { last.label next.extra } + +INTEGERS { last.extra.num number.label } + +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := + #0 'number.label := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} + +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + extra.label + duplicate$ empty$ + 'skip$ + { "{\natexlab{" swap$ * "}}" * } + if$ + 'extra.label := + label extra.label * 'label := +} + +EXECUTE {initialize.extra.label.stuff} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {bib.sort.order} + +SORT + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * + write$ newline$ + "\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi" + write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `apj.bst'. diff --git a/doc/LISA_user_manual/astjnlabbrev-jh.sty b/doc/LISA_user_manual/astjnlabbrev-jh.sty new file mode 100644 index 0000000..89243cb --- /dev/null +++ b/doc/LISA_user_manual/astjnlabbrev-jh.sty @@ -0,0 +1,102 @@ +% these are abbreviations for journals, cribbed from aastex502/aastex.cls + +\let\jnl@style=\rmfamily +\def\ref@jnl#1{{\jnl@style#1}}% +\newcommand\aj{\ref@jnl{AJ}}% + % Astronomical Journal +\newcommand\araa{\ref@jnl{ARA\&A}}% + % Annual Review of Astron and Astrophys +\newcommand\apj{\ref@jnl{ApJ}}% + % Astrophysical Journal +\newcommand\apjl{\ref@jnl{ApJ}}% + % Astrophysical Journal, Letters +\newcommand\apjs{\ref@jnl{ApJS}}% + % Astrophysical Journal, Supplement +\newcommand\ao{\ref@jnl{Appl.~Opt.}}% + % Applied Optics +\newcommand\apss{\ref@jnl{Ap\&SS}}% + % Astrophysics and Space Science +\newcommand\aap{\ref@jnl{A\&A}}% + % Astronomy and Astrophysics +\newcommand\aapr{\ref@jnl{A\&A~Rev.}}% + % Astronomy and Astrophysics Reviews +\newcommand\aaps{\ref@jnl{A\&AS}}% + % Astronomy and Astrophysics, Supplement +\newcommand\azh{\ref@jnl{AZh}}% + % Astronomicheskii Zhurnal +\newcommand\baas{\ref@jnl{BAAS}}% + % Bulletin of the AAS +\newcommand\jrasc{\ref@jnl{JRASC}}% + % Journal of the RAS of Canada +\newcommand\memras{\ref@jnl{MmRAS}}% + % Memoirs of the RAS +\newcommand\maps{\ref@jnl{MAPS}}% *** added by jh + % Meteoritics and Planetary Science +\newcommand\mnras{\ref@jnl{MNRAS}}% + % Monthly Notices of the RAS +\newcommand\pra{\ref@jnl{Phys.~Rev.~A}}% + % Physical Review A: General Physics +\newcommand\prb{\ref@jnl{Phys.~Rev.~B}}% + % Physical Review B: Solid State +\newcommand\prc{\ref@jnl{Phys.~Rev.~C}}% + % Physical Review C +\newcommand\prd{\ref@jnl{Phys.~Rev.~D}}% + % Physical Review D +\newcommand\pre{\ref@jnl{Phys.~Rev.~E}}% + % Physical Review E +\newcommand\prl{\ref@jnl{Phys.~Rev.~Lett.}}% + % Physical Review Letters +\newcommand\pasp{\ref@jnl{PASP}}% + % Publications of the ASP +\newcommand\pasj{\ref@jnl{PASJ}}% + % Publications of the ASJ +\newcommand\qjras{\ref@jnl{QJRAS}}% + % Quarterly Journal of the RAS +\newcommand\skytel{\ref@jnl{S\&T}}% + % Sky and Telescope +\newcommand\solphys{\ref@jnl{Sol.~Phys.}}% + % Solar Physics +\newcommand\sovast{\ref@jnl{Soviet~Ast.}}% + % Soviet Astronomy +\newcommand\ssr{\ref@jnl{Space~Sci.~Rev.}}% + % Space Science Reviews +\newcommand\zap{\ref@jnl{ZAp}}% + % Zeitschrift fuer Astrophysik +\newcommand\nat{\ref@jnl{Nature}}% + % Nature +\newcommand\iaucirc{\ref@jnl{IAU~Circ.}}% + % IAU Cirulars +\newcommand\aplett{\ref@jnl{Astrophys.~Lett.}}% + % Astrophysics Letters +\newcommand\apspr{\ref@jnl{Astrophys.~Space~Phys.~Res.}}% + % Astrophysics Space Physics Research +\newcommand\bain{\ref@jnl{Bull.~Astron.~Inst.~Netherlands}}% + % Bulletin Astronomical Institute of the Netherlands +\newcommand\fcp{\ref@jnl{Fund.~Cosmic~Phys.}}% + % Fundamental Cosmic Physics +\newcommand\gca{\ref@jnl{Geochim.~Cosmochim.~Acta}}% + % Geochimica Cosmochimica Acta +\newcommand\grl{\ref@jnl{Geophys.~Res.~Lett.}}% + % Geophysics Research Letters +\newcommand\jcp{\ref@jnl{J.~Chem.~Phys.}}% + % Journal of Chemical Physics +\newcommand\jgr{\ref@jnl{J.~Geophys.~Res.}}% + % Journal of Geophysics Research +\newcommand\jqsrt{\ref@jnl{J.~Quant.~Spec.~Radiat.~Transf.}}% + % Journal of Quantitiative Spectroscopy and Radiative Trasfer +\newcommand\memsai{\ref@jnl{Mem.~Soc.~Astron.~Italiana}}% + % Mem. Societa Astronomica Italiana +\newcommand\nphysa{\ref@jnl{Nucl.~Phys.~A}}% + % Nuclear Physics A +\newcommand\physrep{\ref@jnl{Phys.~Rep.}}% + % Physics Reports +\newcommand\physscr{\ref@jnl{Phys.~Scr}}% + % Physica Scripta +\newcommand\planss{\ref@jnl{Planet.~Space~Sci.}}% + % Planetary Space Science +\newcommand\procspie{\ref@jnl{Proc.~SPIE}}% + % Proceedings of the SPIE +\let\astap=\aap +\let\apjlett=\apjl +\let\apjsupp=\apjs +\let\applopt=\ao diff --git a/doc/LISA_user_manual/top-LISA_user_manual.tex b/doc/LISA_user_manual/top-LISA_user_manual.tex new file mode 100644 index 0000000..8cf3d77 --- /dev/null +++ b/doc/LISA_user_manual/top-LISA_user_manual.tex @@ -0,0 +1,422 @@ +\textwidth=6.5in +\textheight=9.5in +\topmargin=-0.75in +\oddsidemargin=0.0in +\evensidemargin=0.0in + +\usepackage{graphicx} +\usepackage{enumitem} +\usepackage{amssymb, amsmath} +\usepackage{xcolor} +\usepackage{listings} + +\usepackage{times} +\usepackage{natbib} +\usepackage{etoolbox} +\usepackage{astjnlabbrev-jh} +\usepackage{bibentry} +\usepackage{ifthen} +\usepackage{epsfig} + +\usepackage{commath} +\usepackage{rotating} + +\usepackage{dirtree} +\usepackage{changepage} +\usepackage{alltt} + +%\usepackage[T1]{fontenc} +%\usepackage[scaled]{beramono} +%\usepackage[utf8]{inputenc} +%\renewcommand*\familydefault{\ttdefault} + +% \lstset{ +% language=Python, +% showstringspaces=false, +% formfeed=\newpage, +% tabsize=4, +% commentstyle=\itshape, +% basicstyle=\ttfamily, +% morekeywords={models, lambda, forms} +% } + +% \newcommand{\code}[2]{ +% \hrulefill +% \subsection*{#1} +% \lstinputlisting{#2} +% \vspace{2em} +% } + +% Default fixed font does not support bold face +\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{10} % for bold +\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{10} % for normal +% twelve-sized ttm: +\DeclareFixedFont{\tttb}{T1}{txtt}{bx}{n}{12} % for bold +\DeclareFixedFont{\tttm}{T1}{txtt}{m} {n}{12} % for normal + +\DeclareFixedFont{\ttnm}{T1}{txtt}{m}{n}{9.8} % for normal + +% Custom colors +\usepackage{color} +\definecolor{deepblue} {rgb}{0.0, 0.0, 0.5} +\definecolor{deepred} {rgb}{0.8, 0.0, 0.0} +\definecolor{deepgreen} {rgb}{0.0, 0.5, 0.0} +\definecolor{commentc} {rgb}{0.5, 0.5, 0.5} +\definecolor{DodgerBlue}{rgb}{0.1, 0.6, 1.0} + +% Python style for highlighting +\newcommand\pythonstyle{\lstset{ +language=Python, +basicstyle = \ttm, +morekeywords = {self, as, assert, with, yield}, % Add keywords here +keywordstyle = \ttb\color{blue}, % +emph = {MyClass, __init__}, % Custom highlighting +emphstyle = \ttb\color{DodgerBlue}, % Custom highlighting style +stringstyle = \color{deepred}, % Strings highlighting style +commentstyle=\color{commentc}, % Comment highlighting style +frame = tb, % Any extra options here +showstringspaces = false +}} + +% Python environment: +\lstnewenvironment{python}[1][]{\pythonstyle\lstset{#1}}{} +% Python for external files: +\newcommand\pythonexternal[2][]{{\pythonstyle\lstinputlisting[#1]{#2}}} +% Python for inline: +\newcommand\pythoninline[1]{{\pythonstyle\lstinline!#1!}} + +% Python style for highlighting +\newcommand\plainstyle{\lstset{ +language=Python, +basicstyle = \ttnm, +keywordstyle = \ttnm, % +emph = {MyClass, __init__}, % Custom highlighting +emphstyle = \ttnm\color{black}, % Custom highlighting style +stringstyle = \color{black}, % Strings highlighting style +commentstyle=\color{black}, % Comment highlighting style +frame = tb, % Any extra options here +showstringspaces = false +}} + +% Plain environment: +\lstnewenvironment{plain}[1][]{\plainstyle\lstset{#1}}{\vspace{10pt}} +\newcommand\plaininline[1]{{\plainstyle\lstinline!#1!}} + +% To use boldface verbatim: +%\lstset{basicstyle=\ttfamily, +% escapeinside={||}, +% mathescape=true} + +\lstset{ + language={[LaTeX]TeX}, + basicstyle=\tt\color{red}, + escapeinside={||}, +} + +\bibliographystyle{apj_hyperref} +\usepackage[%pdftex, %%% hyper-references for pdflatex +bookmarks=true, %%% generate bookmarks ... +bookmarksnumbered=true, %%% ... with numbers +colorlinks=true, % links are colored +citecolor=blue, % green % color of cite links +linkcolor=blue, %cyan, % color of hyperref links +menucolor=blue, % color of Acrobat Reader menu buttons +urlcolor=blue, % color of page of \url{...} +breaklinks=true, +linkbordercolor={0 0 1}, %%% blue frames around links +pdfborder={0 0 1}, +frenchlinks=true]{hyperref} +%\usepackage{breakurl} + +\newcommand{\eprint}[1]{\href{http://arxiv.org/abs/#1}{#1}} +\newcommand{\ISBN}[1]{\href{http://cosmologist.info/ISBN/#1}{ISBN: #1}} +\providecommand{\adsurl}[1]{\href{#1}{ADS}} + +% hyper ref only the year in citations: +\makeatletter +% Patch case where name and year are separated by aysep: +\patchcmd{\NAT@citex} + {\@citea\NAT@hyper@{% + \NAT@nmfmt{\NAT@nm}% + \hyper@natlinkbreak{\NAT@aysep\NAT@spacechar}{\@citeb\@extra@b@citeb}% + \NAT@date}} + {\@citea\NAT@nmfmt{\NAT@nm}% + \NAT@aysep\NAT@spacechar\NAT@hyper@{\NAT@date}}{}{} +% Patch case where name and year are separated by opening bracket: +\patchcmd{\NAT@citex} + {\@citea\NAT@hyper@{% + \NAT@nmfmt{\NAT@nm}% + \hyper@natlinkbreak{\NAT@spacechar\NAT@@open\if*#1*\else#1\NAT@spacechar\fi}% + {\@citeb\@extra@b@citeb}% + \NAT@date}} + {\@citea\NAT@nmfmt{\NAT@nm}% + \NAT@spacechar\NAT@@open\if*#1*\else#1\NAT@spacechar\fi\NAT@hyper@{\NAT@date}} + {}{} +\makeatother + + +%\def\bibAnnoteFile#1{} +%\bibpunct[, ]{(}{)}{,}{a}{}{,} + +% Packed reference list: +\setlength\bibsep{0pt} + +% \pagestyle{myheadings} +% \markright{MC\sp{3}} +% \pagenumbering{arabic} + + +% ::::::::::::::::::::::: +\newcommand\degree{\degr} +\newcommand\degrees{\degree} +\newcommand\vs{\emph{vs.}} + +% unslanted mu, for ``micro'' abbrev. +\DeclareSymbolFont{UPM}{U}{eur}{m}{n} +\DeclareMathSymbol{\umu}{0}{UPM}{"16} +\let\oldumu=\umu +\renewcommand\umu{\ifmmode\oldumu\else\math{\oldumu}\fi} +\newcommand\micro{\umu} +\newcommand\micron{\micro m} +\newcommand\microns{\micron} + +\let\oldsim=\sim +\renewcommand\sim{\ifmmode\oldsim\else\math{\oldsim}\fi} +\let\oldpm=\pm +\renewcommand\pm{\ifmmode\oldpm\else\math{\oldpm}\fi} +\newcommand\by{\ifmmode\times\else\math{\times}\fi} +\newcommand\ttt[1]{10\sp{#1}} +\newcommand\tttt[1]{\by\ttt{#1}} +\newcommand\tablebox[1]{\begin{tabular}[t]{@{}l@{}}#1\end{tabular}} +\newbox{\wdbox} +\renewcommand\c{\setbox\wdbox=\hbox{,}\hspace{\wd\wdbox}} +\renewcommand\i{\setbox\wdbox=\hbox{i}\hspace{\wd\wdbox}} +\newcommand\n{\hspace{0.5em}} +\newcommand\marnote[1]{\marginpar{\raggedright\tiny\ttfamily\baselineskip=9pt #1}} +\newcommand\herenote[1]{{\bfseries #1}\typeout{======================> note on page \arabic{page} <====================}} +\newcommand\fillin{\herenote{fill in}} +\newcommand\fillref{\herenote{ref}} +\newcommand\findme[1]{\herenote{(FINDME: #1)}} + +\newcount\timect +\newcount\hourct +\newcount\minct +\newcommand\now{\timect=\time \divide\timect by 60 + \hourct=\timect \multiply\hourct by 60 + \minct=\time \advance\minct by -\hourct + \number\timect:\ifnum \minct < 10 0\fi\number\minct} + +\newcommand\citeauthyear[1]{\citeauthor{#1} \citeyear{#1}} + +\newcommand\mc{\multicolumn} +\newcommand\mctc{\multicolumn{2}{c}} + + +% {\tttm -h, --help} \\ +% Print the list of arguments. \newline + +% \newenvironment{myindentpar}[1]% +% {\begin{list}{}% +% {\setlength{\leftmargin}{3cm}}% +% \item[]% +% } +% {\end{list}} + +\newenvironment{packed_enum}{ +\begin{enumerate}[leftmargin=3cm] + \setlength{\itemsep}{1pt} + \setlength{\parskip}{5pt} + \setlength{\parsep}{0pt} +}{\end{enumerate}} + +\newcommand{\argument}[2]{{\noindent\tttm #1}% +\begin{adjustwidth}{2.5em}{0pt}% +#2 \vspace{0.3cm}% +\end{adjustwidth}% +} + +%\newcommand{\ttmb}[1]{\tttm\color{#1}} +\newcommand{\routine}[2]{{\noindent\tttm\color{blue} #1:}% +\begin{adjustwidth}{2.0em}{0pt}% +#2 \vspace{0.15cm}% +\end{adjustwidth}% +} + +% \newcommand{\routine}[2]{{\noindent\tttm\color{blue} #1}% +% \begin{adjustwidth}{0.0em}{0pt}% +% #2 \vspace{0.15cm}% +% \end{adjustwidth}% +% } + +% :::::::::::::::::: jhmacs2.tex ::::::::::::::::::::::::::::::::::::: +\typeout{Joe Harrington's personal setup, Wed Jun 17 10:53:17 EDT 1998} +% Tue Mar 29 22:23:03 EST 1994 + +% :::::: pato.tex :::::: +% Joetex character unreservations. +% This file frees most of TeX's reserved characters, and provides +% several alternatives for their functions. + + +% utility +\catcode`@=11 + +% comments are first.... +\newcommand\comment[1]{} + +\newcommand\commenton{\catcode`\%=14} +\newcommand\commentoff{\catcode`\%=12} + +% Not-a-comment: +\newcommand\nocomment[1]{#1} + +\renewcommand\math[1]{$#1$} +\newcommand\mathshifton{\catcode`\$=3} +\newcommand\mathshiftoff{\catcode`\$=12} + +\comment{alignment tab} +\let\atab=& +\newcommand\atabon{\catcode`\&=4} +\newcommand\ataboff{\catcode`\&=12} + +\let\oldmsp=\sp +\let\oldmsb=\sb +\def\sp#1{\ifmmode + \oldmsp{#1}% + \else\strut\raise.85ex\hbox{\scriptsize #1}\fi} +\def\sb#1{\ifmmode + \oldmsb{#1}% + \else\strut\raise-.54ex\hbox{\scriptsize #1}\fi} +\newbox\@sp +\newbox\@sb +\def\sbp#1#2{\ifmmode% + \oldmsb{#1}\oldmsp{#2}% + \else + \setbox\@sb=\hbox{\sb{#1}}% + \setbox\@sp=\hbox{\sp{#2}}% + \rlap{\copy\@sb}\copy\@sp + \ifdim \wd\@sb >\wd\@sp + \hskip -\wd\@sp \hskip \wd\@sb + \fi + \fi} +\def\msp#1{\ifmmode + \oldmsp{#1} + \else \math{\oldmsp{#1}}\fi} +\def\msb#1{\ifmmode + \oldmsb{#1} + \else \math{\oldmsb{#1}}\fi} +\def\supon{\catcode`\^=7} +\def\supoff{\catcode`\^=12} +\def\subon{\catcode`\_=8} +\def\suboff{\catcode`\_=12} +\def\supsubon{\supon \subon} +\def\supsuboff{\supoff \suboff} + + +\newcommand\actcharon{\catcode`\~=13} +\newcommand\actcharoff{\catcode`\~=12} + +\newcommand\paramon{\catcode`\#=6} +\newcommand\paramoff{\catcode`\#=12} + +\comment{And now to turn us totally on and off...} + +\newcommand\reservedcharson{ \commenton \mathshifton \atabon \supsubon + \actcharon \paramon} + +\newcommand\reservedcharsoff{\commentoff \mathshiftoff \ataboff \supsuboff + \actcharoff \paramoff} + +\newcommand\nojoe[1]{\reservedcharson #1 \reservedcharsoff} + +\catcode`@=12 +\reservedcharsoff + +\reservedcharson +\newcommand\jhauth[1]{{#1}} +\newcommand\jhstud[1]{{#1}} + +\comment{Must have ONLY ONE of these... trust these macros, they work +\newcommand\jhauth[1]{{\bfseries #1}} +\newcommand\jhstud[1]{{\em #1}} +} + +\reservedcharsoff +\reservedcharson + + +% :::::::::::::::::::::::::::::::::::::::::::::::::::: + +\def\vs{{\em vs.}} +\def\p{\phantom{(0)}} + +% Section levels: +\setcounter{secnumdepth}{5} +% \section{} % level 1 +% \subsection{} % level 2 +% \subsubsection{} % level 3 +% \paragraph{} % level 4 - equivalent to subsubsubsection +% \subparagraph{} % level 5 + +% To show in the table of content: +\setcounter{tocdepth}{5} + +% Linebreak after \paragraph +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +% Linebreak after \paragraph +\makeatletter +\renewcommand\subparagraph{% + \@startsection{subparagraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\actcharon +\renewcommand{\textfraction}{0.1} +\comment{\paramon\def\herenote#1{}\paramoff} +\renewcommand{\thepage}{\arabic{page}} +\reservedcharson + +% :::::::::::: My Additions :::::::::::::: +\newcommand\Spitzer{{\em Spitzer}} +\newcommand\SST{{\em Spitzer Space Telescope}} +\newcommand\chisq{$\chi^2$} +\newcommand\itbf[1]{\textit{\textbf{#1}}} +\newcommand\bftt[1]{\texttt{\textbf{#1}}} +\newcommand\function[1]{\noindent\texttt{\begin{tabular}{@{}l@{}l}#1\end{tabular}}\newline} +\newcommand\bfv[1]{|\textbf{#1}|} +\newcommand\ttred[1]{\textcolor{red}{\ttfamily #1}} +\newcommand\ttblue[1]{\textcolor{blue}{\ttfamily #1}} +\newcommand\ttblack[1]{\textcolor{black}{\ttfamily #1}} +\newcommand\der{{\rm d}} +\newcommand\tno{$\sp{-1}$} +\newcommand\tnt{$\sp{-2}$} +\newcommand*\Eval[3]{\left.#1\right\rvert_{#2}^{#3}} +\newcommand\mcc{MC\sp{3}} + +%::::::::::::::::::::::::::::::::::::::::: +% Next six lines adjust spacing above/below captions and Sections etc +% Adjust as needed + +\comment{ +% \setlength{\abovecaptionskip}{0pt} +% \setlength{\belowcaptionskip}{0pt} +% \setlength{\textfloatsep}{8pt} +% \titlespacing{\section}{0pt}{5pt}{*0} +% \titlespacing{\subsection}{0pt}{5pt}{*0} +% \titlespacing{\subsubsection}{0pt}{5pt}{*0} +} + +\reservedcharsoff +\actcharon +\mathshifton + +\reservedcharson diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..5d4df07 --- /dev/null +++ b/environment.yml @@ -0,0 +1,18 @@ +name: lisa +channels: + - conda-forge +dependencies: + - python=3.8.18 + - mpi4py=3.1.4 + - mpich=3.3.2 + - numpy=1.24.3 + - matplotlib=3.7.2 + - multiprocess=0.70.15 + - scipy=1.5.3 + - yaml=0.2.5 + - h5py=3.1.0 + - pymultinest=2.12 + - ultranest=3.6.4 + - dynesty=2.1.2 + - dnest4=0.2.4 + - emcee=3.1.4 diff --git a/example/demc_example.py b/example/demc_example.py new file mode 100755 index 0000000..74f646c --- /dev/null +++ b/example/demc_example.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +from mcmc_func import model +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6)[None, :] + +func = functools.partial(model, x=x) + +# Ensure the output directory exists +outputdir = "./output_demc/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('demc', burnin=4000, data=data, + fbestp='output_bestp.npy', + fext='.png', flog='MCMC.log', + fsavefile='output_posterior.npy', fsavemodel=None, + indparams=[], kll=None, model=func, modelper=0, + nchains=10, niter=100000, outputdir=outputdir, + pinit=pinit, pmax=pmax, pmin=pmin, pnames=pnames, + pstep=pstep, thinning=1, truepars=pars, + uncert=uncert, verb=1) + + diff --git a/example/dnest4_example.py b/example/dnest4_example.py new file mode 100755 index 0000000..6de9427 --- /dev/null +++ b/example/dnest4_example.py @@ -0,0 +1,54 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +import dnest4_func as dnf +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6) + +func = functools.partial(dnf.model, x=x) + +prior = functools.partial(dnf.prior, ndim=np.sum(pstep>0), + pmin=pmin[pstep>0], pmax=pmax[pstep>0]) + +loglike = functools.partial(dnf.loglikelihood, + data=data, uncert=uncert, model=func) + +perturb = functools.partial(dnf.perturb, ndim=np.sum(pstep>0), + width=pmax[pstep>0]-pmin[pstep>0]) + +prior.__name__ = 'prior' +loglike.__name__ = 'loglike' +perturb.__name__ = 'perturb' + +# Ensure the output directory exists +outputdir = "./output_dnest4/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('dnest4', fbestp='output_bestp.npy', + fext='.png', fsavefile='output_posterior.npy', + kll=None, loglike=loglike, model=func, + niter=10000, nlevel=30, nlevelint=1000, nperstep=100, + outputdir=outputdir, perturb=perturb, + pnames=pnames, prior=prior, pstep=pstep, + truepars=pars, verb=1) + + diff --git a/example/dnest4_func.py b/example/dnest4_func.py new file mode 100644 index 0000000..fdd74a1 --- /dev/null +++ b/example/dnest4_func.py @@ -0,0 +1,36 @@ +import numpy as np +import dnest4 + + +def model(params, x): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + return params[0]*x**2 + params[1]*x + params[2] + + +def prior(ndim, pmin, pmax): + return np.random.uniform(size=ndim) * (pmax - pmin) + pmin + + +def loglikelihood(cube, data, uncert, model): + ymodel = model(cube) + loglike = (-0.5 * ((ymodel - data) / uncert)**2).sum() + return loglike + +def perturb(coords, ndim, width): + i = np.random.randint(ndim) + coords[i] += (width[i])*dnest4.randh() + # Note: use the return value of wrap, unlike in C++ + coords[i] = dnest4.wrap(coords[i], -0.5*width[i], 0.5*width[i]) + return 0.0 + + diff --git a/example/dream_example.py b/example/dream_example.py new file mode 100755 index 0000000..657b674 --- /dev/null +++ b/example/dream_example.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +import dream_func as df +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6) + +func = functools.partial(df.model, x=x) + +loglike = functools.partial(df.loglikelihood, + data=data, uncert=uncert, model=func) + +loglike.__name__ = 'loglike' + +# Ensure the output directory exists +outputdir = "./output_dream/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('dream', fbestp='output_bestp.npy', fext='.png', + fprefix='model', fsavefile='output_posterior.npy', + loglike=loglike, nchains=4, niter=30000, + outputdir=outputdir, pmax=pmax, pmin=pmin, pnames=pnames, + pstep=pstep, thinning=1, truepars=pars, verb=1) + diff --git a/example/dream_func.py b/example/dream_func.py new file mode 100644 index 0000000..33f5657 --- /dev/null +++ b/example/dream_func.py @@ -0,0 +1,24 @@ +import numpy as np + + +def model(params, x): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + return params[0]*x**2 + params[1]*x + params[2] + + +def loglikelihood(cube, data, uncert, model): + ymodel = model(cube) + loglike = (-0.5 * ((ymodel - data) / uncert)**2).sum() + return loglike + + diff --git a/example/dynesty_example.py b/example/dynesty_example.py new file mode 100755 index 0000000..b88ee15 --- /dev/null +++ b/example/dynesty_example.py @@ -0,0 +1,48 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +import dynesty_func as dyf +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6) + +func = functools.partial(dyf.model, x=x) + +prior = functools.partial(dyf.prior, pmin=pmin, pmax=pmax, pstep=pstep) + +loglike = functools.partial(dyf.loglikelihood, + data=data, uncert=uncert, model=func) + +prior.__name__ = 'prior' +loglike.__name__ = 'loglike' + +# Ensure the output directory exists +outputdir = "./output_dynesty/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('dynesty', dlogz=0.001, fbestp='output_bestp.npy', + fext='.png', fsavefile='output_posterior.npy', + kll=None, loglike=loglike, model=func, + niter=100000, nlive=1000, outputdir=outputdir, + pnames=pnames, prior=prior, pstep=pstep, + truepars=pars, verb=1) + + diff --git a/example/dynesty_func.py b/example/dynesty_func.py new file mode 100644 index 0000000..50ffdc6 --- /dev/null +++ b/example/dynesty_func.py @@ -0,0 +1,30 @@ +import numpy as np + + +def model(params, x): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + return params[0]*x**2 + params[1]*x + params[2] + + +def prior(cube, pmin, pmax, pstep): + cube = cube.copy() + # Cube begins as [0,1] interval -- scale to [pmin, pmax] + return cube * (pmax[pstep>0] - pmin[pstep>0]) + pmin[pstep>0] + + +def loglikelihood(cube, data, uncert, model): + ymodel = model(cube) + loglike = (-0.5 * ((ymodel - data) / uncert)**2).sum() + return loglike + + diff --git a/example/make_data.py b/example/make_data.py new file mode 100755 index 0000000..2ce53b1 --- /dev/null +++ b/example/make_data.py @@ -0,0 +1,28 @@ +#! /usr/bin/env python + +import sys, os +import numpy as np + + +# Read parameters +if len(sys.argv[1:]) != 3: + raise ValueError("Too many inputs given. Expected 3.\nReceived: " + \ + str(sys.argv[1:])) +a, b, c = [float(val) for val in sys.argv[1:]] + +# Define the x-axis grid +x = np.arange(-5, 6) # [-5, 5] in steps of 1 + +# Compute the true data +true = a*x**2 + b*x + c +# get noise for each data point, add it +uncert = np.sqrt(true) +data = true + np.random.normal(0, uncert) + +# Save it +np.save('true.npy' , true) +np.save('data.npy' , data) +np.save('uncert.npy', uncert) +np.save('params.npy', np.array([a, b, c])) + + diff --git a/example/mcmc_func.py b/example/mcmc_func.py new file mode 100644 index 0000000..cbf26b1 --- /dev/null +++ b/example/mcmc_func.py @@ -0,0 +1,28 @@ +""" +Contains function to be evaluated at each MCMC iteration. + +""" + +import sys, os +import numpy as np + + +def model(params, x): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + # Input must be 2D + if len(params.shape) == 1: + params = np.expand_dims(params, 0) + + return params[:,0][:, None]*x**2 + params[:,1][:, None]*x + params[:,2][:, None] + + diff --git a/example/multinest_example.py b/example/multinest_example.py new file mode 100755 index 0000000..efcd7e7 --- /dev/null +++ b/example/multinest_example.py @@ -0,0 +1,45 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +import multinest_func as mnf +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6) + +func = functools.partial(mnf.model, x=x, inD=len(pnames)) + +prior = functools.partial(mnf.prior, pmin=pmin, pmax=pmax, pstep=pstep) + +loglike = functools.partial(mnf.loglikelihood, + data=data, uncert=uncert, model=func) + +# Ensure the output directory exists +outputdir = "./output_multinest/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('multinest', fbestp='output_bestp.npy', + fext='.png', fsavefile='output_posterior.npy', + kll=None, loglike=loglike, model=func, + niter=100000, nlive=1000, outputdir=outputdir, + pnames=pnames, prior=prior, pstep=pstep, + truepars=pars, verb=1) + + diff --git a/example/multinest_func.py b/example/multinest_func.py new file mode 100644 index 0000000..e658298 --- /dev/null +++ b/example/multinest_func.py @@ -0,0 +1,39 @@ +import numpy as np + + +def model(pars, x, inD): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + # Load params + params = np.zeros(inD, dtype=float) + for i in np.arange(inD): + params[i] = pars[i] + + return params[0]*x**2 + params[1]*x + params[2] + + + +def prior(cube, ndim, nparams, pmin, pmax, pstep): + # Cube begins as [0,1] interval -- scale to [pmin, pmax] + for i in range(ndim): + cube[i] = cube[i] \ + * (pmax[pstep>0][i] - pmin[pstep>0][i]) \ + + pmin[pstep>0][i] + return cube + + +def loglikelihood(cube, ndim, nparams, data, uncert, model): + ymodel = model(cube) + loglike = (-0.5 * ((ymodel - data) / uncert)**2).sum() + return loglike + + diff --git a/example/polychord_example.py b/example/polychord_example.py new file mode 100755 index 0000000..75f7c51 --- /dev/null +++ b/example/polychord_example.py @@ -0,0 +1,48 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +import polychord_func as pcf +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6) + +func = functools.partial(pcf.model, x=x) + +prior = functools.partial(pcf.prior, pmin=pmin[pstep>0], pmax=pmax[pstep>0]) + +loglike = functools.partial(pcf.loglikelihood, + data=data, uncert=uncert, model=func) + +prior.__name__ = 'prior' +loglike.__name__ = 'loglike' + +# Ensure the output directory exists +outputdir = "./output_polychord/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('polychord', fbestp='output_bestp.npy', + fext='.png', fsavefile='output_posterior.npy', + kll=None, loglike=loglike, model=func, + nlive=500, outputdir=outputdir, + pnames=pnames, prior=prior, pstep=pstep, + truepars=pars, verb=1) + + diff --git a/example/polychord_func.py b/example/polychord_func.py new file mode 100644 index 0000000..6216f90 --- /dev/null +++ b/example/polychord_func.py @@ -0,0 +1,30 @@ +import numpy as np +import pypolychord +from pypolychord.priors import UniformPrior + + +def model(params, x): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + return params[0]*x**2 + params[1]*x + params[2] + + +def prior(cube, pmin, pmax): + return UniformPrior(pmin, pmax)(cube) + + +def loglikelihood(cube, data, uncert, model): + ymodel = model(cube) + loglike = (-0.5 * ((ymodel - data) / uncert)**2).sum() + return loglike, [] + + diff --git a/example/snooker_example.py b/example/snooker_example.py new file mode 100755 index 0000000..c47791b --- /dev/null +++ b/example/snooker_example.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +from mcmc_func import model +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6)[None, :] + +func = functools.partial(model, x=x) + +# Ensure the output directory exists +outputdir = "./output_snooker/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('snooker', burnin=4000, data=data, + fbestp='output_bestp.npy', + fext='.png', flog='MCMC.log', + fsavefile='output_posterior.npy', fsavemodel=None, + hsize=100, indparams=[], kll=None, model=func, + modelper=0, nchains=10, niter=100000, + outputdir=outputdir, pinit=pinit, pmax=pmax, + pmin=pmin, pnames=pnames, pstep=pstep, thinning=1, + truepars=pars, uncert=uncert, verb=1) + + diff --git a/example/ultranest_example.py b/example/ultranest_example.py new file mode 100755 index 0000000..db57cb7 --- /dev/null +++ b/example/ultranest_example.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python + +import sys, os +import functools +import numpy as np + +import ultranest_func as unf +import lisa + + +# Load the inputs, and true parameters +data = np.load('data.npy') +uncert = np.load('uncert.npy') +pars = np.load('params.npy') + +pnames = ['a', 'b', 'c'] # Parameter names +pinit = np.array([ 0., 0., 0.]) # Initial param values +pmin = np.array([-10., -10., -10.]) # Minimum allowed values +pmax = np.array([ 10., 10., 10.]) # Maximum allowed values +pstep = np.array([ 3., 3., 3.]) # "Step" size (used for initial samples) + +# The defined x-axis values corresponding to the data +x = np.arange(-5, 6)[None, :] + +func = functools.partial(unf.model, x=x) + +prior = functools.partial(unf.prior, pmin=pmin, pmax=pmax, pstep=pstep) + +loglike = functools.partial(unf.loglikelihood, + data=data, uncert=uncert, model=func) + +prior.__name__ = 'prior' +loglike.__name__ = 'loglike' + +# Ensure the output directory exists +outputdir = "./output_ultranest/" +if not os.path.isdir(outputdir): + os.mkdir(outputdir) + +# Run it +samp = lisa.run('ultranest', dlogz=0.2, fbestp='output_bestp.npy', + fext='.png', frac_remain=0.1, + fsavefile='output_posterior.npy', + kll=None, loglike=loglike, model=func, + niter=100000, nlive=500, outputdir=outputdir, + pnames=pnames, prior=prior, pstep=pstep, + truepars=pars, verb=1) + + diff --git a/example/ultranest_func.py b/example/ultranest_func.py new file mode 100644 index 0000000..97af332 --- /dev/null +++ b/example/ultranest_func.py @@ -0,0 +1,34 @@ +import numpy as np + + +def model(params, x): + """ + Evaluates the model for given inputs. + + Inputs + ------ + params : array. Parameters to be predicted on. + + Outputs + ------- + results: array. Model corresponding to the given inputs + """ + return params[:,0][:, None]*x**2 + params[:,1][:, None]*x + params[:,2][:, None] + + +def prior(cube, pmin, pmax, pstep): + cube = cube.copy() + # Cube begins as [0,1] interval -- scale to [pmin, pmax] + for i in range(cube.shape[-1]): + cube[:,i] = cube[:,i] \ + * (pmax[pstep>0][i] - pmin[pstep>0][i]) \ + + pmin[pstep>0][i] + return cube + + +def loglikelihood(cube, data, uncert, model): + ymodel = model(cube) + loglike = (-0.5 * ((ymodel - data) / uncert)**2).sum(-1) + return loglike + + diff --git a/lisa/__init__.py b/lisa/__init__.py new file mode 100644 index 0000000..5ec7aeb --- /dev/null +++ b/lisa/__init__.py @@ -0,0 +1,79 @@ +""" +Main driver for LISA, the Large-selection Interface for Sampling Algorithms + +Functions +--------- +setup: initialize a sampler +run : initialize a sampler, execute it, and produce posterior plots +""" + +__all__ = ['wrappers'] + +import sys +import os +import numpy as np + +from . import wrappers +from ._version import __version__ + + +def setup(alg, **kwargs): + """ + Initializes the specified sampler. + + Inputs + ------ + alg : string. Sampling algorithm to use. + Options: demc, dnest4, dynesty, multinest, polychord, + snooker, ultranest + **kwargs: Parameters for the sampling algorithm. + For a list & description of parameters, see the user manual. + + Outputs + ------- + Sampler object, with the supplied **kwargs set. + """ + if alg == 'demc': + Sampler = wrappers.demc_wrapper.Sampler + elif alg == 'dnest4': + Sampler = wrappers.dnest4_wrapper.Sampler + elif alg == 'dream': + Sampler = wrappers.dream_wrapper.Sampler + elif alg == 'dynesty': + Sampler = wrappers.dynesty_wrapper.Sampler + elif alg == 'multinest': + Sampler = wrappers.multinest_wrapper.Sampler + elif alg == 'polychord': + Sampler = wrappers.polychord_wrapper.Sampler + elif alg == 'snooker': + Sampler = wrappers.snooker_wrapper.Sampler + elif alg == 'ultranest': + Sampler = wrappers.ultranest_wrapper.Sampler + else: + raise ValueError("The supplied algorithm does not exist in LISA.\n" +\ + "Options: demc, dnest4, dream, dynesty, multinest, " +\ + "polychord, snooker, ultranest\nReceived: " + alg) + return Sampler(**kwargs) + + +def run(alg, **kwargs): + """ + Initializes the specified sampler, runs it, and produces output plots. + + Inputs + ------ + alg : string. Sampling algorithm to use. + Options: demc, dynesty, multinest, snooker, ultranest + **kwargs: Parameters for the sampling algorithm. + For a list & description of parameters, see the user manual. + + Outputs + ------- + samp : Sampler object, with the supplied **kwargs set. + """ + samp = setup(alg, **kwargs) + samp.run() + samp.make_plots() + return samp + + diff --git a/lisa/_version.py b/lisa/_version.py new file mode 100644 index 0000000..5a6f84c --- /dev/null +++ b/lisa/_version.py @@ -0,0 +1 @@ +__version__ = '0.5' diff --git a/lisa/wrappers/__init__.py b/lisa/wrappers/__init__.py new file mode 100644 index 0000000..33e3424 --- /dev/null +++ b/lisa/wrappers/__init__.py @@ -0,0 +1,57 @@ +__all__ = ['demc_wrapper', 'dnest4_wrapper', 'dream_wrapper', 'dynesty_wrapper', + 'helper', 'multinest_wrapper', 'polychord_wrapper', + 'snooker_wrapper', 'ultranest_wrapper'] + +import warnings + +from . import helper + +try: + from . import demc_wrapper +except: + warnings.warn("DEMC wrapper unable to be imported, possible because it is installed.") + demc_wrapper = None + +try: + from . import dnest4_wrapper +except: + warnings.warn("DNest4 wrapper unable to be imported, possibly because it is not installed.") + dnest4_wrapper = None + +try: + from . import dream_wrapper +except: + warnings.warn("DREAM wrapper unable to be imported, possibly because it is not installed.") + dream_wrapper = None + +try: + from . import dynesty_wrapper +except: + warnings.warn("Dynesty wrapper unable to be imported, possibly because it is not installed.") + dynesty_wrapper = None + +try: + from . import multinest_wrapper +except: + warnings.warn("Multinest wrapper unable to be imported, possibly because it is not installed.") + multinest_wrapper = None + +try: + from . import polychord_wrapper +except: + warnings.warn("PolyChord wrapper unable to be imported, possibly because it is not installed.") + polychord_wrapper = None + +try: + from . import snooker_wrapper +except: + warnings.warn("DEMCzs (snooker) wrapper unable to be imported, possibly because it is not installed.") + snooker_wrapper = None + +try: + from . import ultranest_wrapper +except: + warnings.warn("Ultranest wrapper unable to be imported, possibly because it is not installed.") + ultranest_wrapper = None + + diff --git a/lisa/wrappers/demc_wrapper.py b/lisa/wrappers/demc_wrapper.py new file mode 100644 index 0000000..521ace8 --- /dev/null +++ b/lisa/wrappers/demc_wrapper.py @@ -0,0 +1,162 @@ +""" +Wrapper for DEMC algorithm of ter Braak (2006) + +Sampler: class to setup and run an inference +""" + +import sys, os +import numpy as np + +from .helper import BaseSampler + +mc3dir = os.path.join(os.path.dirname(__file__), '..', 'modules', 'MCcubed') +sys.path.append(mc3dir) +import MCcubed as mc3 + + +class Sampler(BaseSampler): + def __init__(self, burnin=None, data=None, fbestp='bestp.npy', + fext='.png', flog='MCMC.log', + fsavefile='output.npy', fsavemodel=None, + indparams=[], kll=None, model=None, + modelper=0, nchains=1, niter=None, + outputdir=None, pinit=None, pmax=None, + pmin=None, pnames=None, pstep=None, resume=False, + thinning=1, truepars=None, uncert=None, verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'demc' #name + self.reqpar = ['burnin', 'data', 'model', 'nchains', 'niter', + 'outputdir', 'pinit', 'pmax', 'pmin', 'pstep', + 'uncert'] #required parameters + self.optpar = ['fbestp', 'flog', 'fext', 'fsavefile', 'fsavemodel', + 'indparams', 'kll', 'modelper', 'pnames', 'resume', + 'thinning', 'truepars', 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.burnin = burnin + self.data = data + self.fbestp = fbestp + self.fext = fext + self.flog = flog + self.fsavefile = fsavefile + self.fsavemodel = fsavemodel + self.model = model + self.indparams = indparams + self.kll = kll + self.nchains = nchains + self.niter = niter + self.outputdir = outputdir + self.pinit = pinit + self.pmax = pmax + self.pmin = pmin + self.pnames = pnames + self.pstep = pstep + self.resume = resume + self.thinning = thinning + self.truepars = truepars + self.uncert = uncert + self.verb = verb + if self.verb: + print("DEMC sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('data') + self.prep_arr('pinit') + self.prep_arr('pmax') + self.prep_arr('pmin') + self.prep_arr('pstep') + self.prep_arr('uncert') + # Check positive integers + self.check_posint('nchains') + self.check_posint('niter') + self.check_posint('thinning') + # Check non-negative integers + self.check_nonnegint('burnin') + # Check that required arguments are not none + self.check_none('model') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('flog') + self.update_path('fsavefile') + self.update_path('fsavemodel') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Open the log file + if self.flog is not None: + if self.resume: + mode = 'a' + else: + mode = 'w' + logfile = open(self.flog, mode) + else: + logfile = None + # Run the MCMC + self.outp, self.bestp = mc3.mc.mcmc(self.data, + self.uncert, + func = self.model, + indparams = self.indparams, + parnames = self.pnames, + params = self.pinit, + pmin = self.pmin, + pmax = self.pmax, + stepsize = self.pstep, + numit = self.niter, + burnin = self.burnin, + thinning = self.thinning, + nchains = self.nchains, + walk = self.alg, + plots = False, + leastsq = False, + log = logfile, + savefile = self.fsavefile, + savemodel = self.fsavemodel, + resume = self.resume) + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + # Close the log + if self.flog is not None: + logfile.close() + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/dnest4_wrapper.py b/lisa/wrappers/dnest4_wrapper.py new file mode 100644 index 0000000..79806d6 --- /dev/null +++ b/lisa/wrappers/dnest4_wrapper.py @@ -0,0 +1,173 @@ +""" +Wrapper for DNest4 algorithm of Brewer & Foreman-Mackey (2018). + +DNest4_Model: class used as input for DNest4 + +Sampler: class to setup and run an inference +""" + +import sys, os +import numpy as np +import matplotlib.pyplot as plt +import dnest4 + +from .helper import BaseSampler + + +class DNest4_Model(object): + def __init__(self, loglike=None, perturb=None, prior=None): + self.log_likelihood = loglike + self.perturb = perturb + self.from_prior = prior + + +class Sampler(BaseSampler): + def __init__(self, beta=100, fbestp='bestp.npy', fext='.png', + fsavefile='output.npy', kll=None, lam=5, + loglike=None, model=None, niter=None, + nlevel=30, nlevelint=10000, nperstep=10000, + outputdir=None, perturb=None, pnames=None, + prior=None, pstep=None, resample=100, truepars=None, + verb=0): + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'dnest4' #name + self.reqpar = ['loglike', 'model', 'niter', 'nlevel', 'nlevelint', + 'nperstep', 'outputdir', 'perturb', + 'prior', 'pstep'] #required parameters + self.optpar = ['beta', 'fbestp', 'fext', 'fsavefile', + 'kll', 'lam', 'pnames', 'resample', + 'truepars', 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.beta = beta + self.fbestp = fbestp + self.fext = fext + self.fsavefile = fsavefile + self.kll = kll + self.lam = lam + self.loglike = loglike + self.model = model + self.niter = niter + self.nlevel = nlevel + self.nlevelint = nlevelint + self.nperstep = nperstep + self.outputdir = outputdir + self.perturb = perturb + self.pnames = pnames + self.prior = prior + self.pstep = pstep + self.resample = resample + self.truepars = truepars + self.verb = verb + if self.verb: + print("DNest4 sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('pstep') + # Check positive int inputs + self.check_posint('nlevel') + self.check_posint('nlevelint') + self.check_posint('nperstep') + # Check non-negative floats + self.check_nonnegfloat('beta') + self.check_nonnegfloat('lam') + self.check_nonnegfloat('resample') + # Check that required arguments are not none + self.check_none('loglike') + self.check_none('model') + self.check_none('niter') + self.check_none('perturb') + self.check_none('prior') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('fsavefile') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Set up the inference + backend = dnest4.backends.CSVBackend(basedir=self.outputdir, + sep=" ") + dns = dnest4.DNest4Sampler(DNest4_Model(loglike=self.loglike, + perturb=self.perturb, + prior=self.prior), + backend=backend) + # Run it + out = dns.sample(max_num_levels=self.nlevel, + num_steps=self.niter, + new_level_interval=self.nlevelint, + num_per_step=self.nperstep, lam=self.lam, + beta=self.beta) + for i, samp in enumerate(out): + if self.verb: + print(''.join(['Iteration: ', str(i+1), '/', + str(self.niter)]), end='\r') + print('') + # Best-fit parameters + ibest = np.argmax(backend.sample_info["log_likelihood"]) + self.bestp = backend.samples[ibest] + # Resample for posterior + stats = dns.postprocess(resample=self.resample) + self.outp = backend.posterior_samples.T + """ + stats = dns.postprocess() + # Load the weights to properly estimate the posterior + #weights = np.loadtxt(os.path.join(self.outputdir, 'weights.txt')) + weights = np.squeeze(backend.weights) + wsh = weights.shape[0] + # Remove cases w/ 0 weight + samps = backend.samples + samps = samps [weights!=0] + weights = weights[weights!=0] + # As in MultiNest, resample to equal weights by considering + # int(nsamples*weight) repetitions + self.outp = [] + for i in range(len(weights)): + self.outp.extend([samps[i] + for j in range(int(wsh * weights[i]))]) + self.outp = np.asarray(self.outp).T + """ + # Quantiles + if self.kll is not None: + for i in range(self.outp.shape[-1]): + self.kll.update(self.model(self.outp[:,i], fullout=True)) + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/dream_wrapper.py b/lisa/wrappers/dream_wrapper.py new file mode 100644 index 0000000..3153326 --- /dev/null +++ b/lisa/wrappers/dream_wrapper.py @@ -0,0 +1,166 @@ +""" +Wrapper for DREAM algorithm of ter Laloy & Vrugt (2012) +as implemented in PyDREAM (https://github.com/LoLab-VU/PyDREAM) + +Sampler: class to setup and run the inference +""" + +import sys, os +import numpy as np + +import scipy.stats as ss + +from .helper import BaseSampler +from pydream.parameters import SampledParam +from pydream.core import run_dream +#for Gelman et al convergence tests +mc3dir = os.path.join(os.path.dirname(__file__), '..', 'modules', 'MCcubed') +sys.path.append(mc3dir) +import MCcubed as mc3 + + + +class Sampler(BaseSampler): + def __init__(self, burnin=None, fbestp='output_bestp.npy', fext='.png', + fprefix='model', fsavefile='output_posterior.npy', + loglike=None, multitry=5, nchains=3, niter=None, + outputdir=None, pmax=None, pmin=None, pnames=None, + pstep=None, resume=False, thinning=1, truepars=None, verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'dream' #name + self.reqpar = ['loglike', 'nchains', 'niter', 'outputdir', + 'pmax', 'pmin'] # required parameters + self.optpar = ['burnin', 'fbestp', 'fext', 'fprefix', 'fsavefile', + 'multitry', 'pnames', 'pstep', 'resume', 'thinning', + 'truepars', 'verb'] #optional + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + if burnin is None: + self.burnin = niter // 2 + else: + self.burnin = burnin + self.fbestp = fbestp + self.fext = fext + self.fsavefile = fsavefile + self.loglike = loglike + self.fprefix = fprefix + self.multitry = multitry + self.nchains = nchains + self.niter = niter + self.outputdir = outputdir + self.pmax = pmax + self.pmin = pmin + self.pnames = pnames + if pstep is None: + self.pstep = np.ones(pmax.size) + else: + self.pstep = pstep + self.resume = resume + self.thinning = thinning + self.truepars = truepars + self.verb = verb + if self.verb: + print("DREAM sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('pmax') + self.prep_arr('pmin') + self.prep_arr('pstep') + # Check positive integers + self.check_posint('nchains') + self.check_posint('niter') + self.check_posint('thinning') + # Check non-negative integers + self.check_nonnegint('burnin') + # Check that required arguments are not none + self.check_none('loglike') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('fprefix') + self.update_path('fsavefile') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + if self.resume: + history_file = self.fprefix + '_DREAM_chain_history.npy' + else: + history_file = False + # Run the MCMC + history, log_ps = run_dream([SampledParam(ss.uniform, + loc=self.pmin, scale=self.pmax-self.pmin)], + self.loglike, niterations=self.niter, nchains=self.nchains, + start_random=True, save_history=True, + history_file=history_file, + multitry=self.multitry, model_name=self.fprefix, + verbose=self.verb) + history = np.asarray(history).swapaxes(1,2) + log_ps = np.asarray(log_ps) + ibest = np.where(log_ps == log_ps.max()) + self.bestp = history[ibest[0][0], :, ibest[1][0]] + # Convergence criteria + try: + convergence = mc3.mc.convergetest(history) + print("Rhat convergence metric:") + print(convergence) + except Exception as e: + print("Unable to determine Rhat convergence metric:") + print(e) + # Sample size + try: + speis, ess = mc3.mc.ess(history) + print("Steps per effective independent sample:") + print(speis) + print("Effective sample size:") + print(ess) + except Exception as e: + print("Unable to determine effective sample size:") + print(e) + # Stack the posterior + self.outp = history[0, :, self.burnin:] + for i in range(1, self.nchains): + self.outp = np.hstack((self.outp, history[i, :, self.burnin:])) + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/dynesty_wrapper.py b/lisa/wrappers/dynesty_wrapper.py new file mode 100644 index 0000000..cd08cd9 --- /dev/null +++ b/lisa/wrappers/dynesty_wrapper.py @@ -0,0 +1,171 @@ +""" +Wrapper for dynesty dynamic nested sampling algorithm of Speagle (2019). + +Sampler: class to setup and run an inference +""" + +import sys, os +import multiprocess as mp +import numpy as np +import matplotlib.pyplot as plt + +import dynesty + +from .helper import BaseSampler + + +class Sampler(BaseSampler): + def __init__(self, bound='multi', dlogz=0.1, fbestp='bestp.npy', + fext='.png', fsavefile='output.npy', kll=None, + loglike=None, min_ess=500, model=None, nchains=1, + niter=None, nlive=500, nlive_batch=500, outputdir=None, + pnames=None, prior=None, pstep=None, sample='auto', + truepars=None, verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'dynesty' #name + self.reqpar = ['loglike', 'model', 'nlive', 'nlive_batch', 'outputdir', + 'prior', 'pstep'] #required parameters + self.optpar = ['bound', 'dlogz', 'fbestp', 'fext', 'fsavefile', + 'kll', 'min_ess', 'niter', 'pnames', 'sample', + 'truepars', 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.bound = bound + self.dlogz = dlogz + self.fbestp = fbestp + self.fext = fext + self.fsavefile = fsavefile + self.kll = kll + self.loglike = loglike + self.min_ess = min_ess + self.model = model + self.nchains = nchains + self.niter = niter + self.nlive = nlive + self.nlive_batch = nlive_batch + self.outputdir = outputdir + self.pnames = pnames + self.prior = prior + self.pstep = pstep + self.sample = sample + self.truepars = truepars + self.verb = verb + if self.verb: + print("dynesty sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('pstep') + # Check non-negative float inputs + self.check_nonnegfloat('dlogz') + # Check positive int inputs + self.check_posint('min_ess') + self.check_posint('nchains') + self.check_posint('nlive') + self.check_posint('nlive_batch') + # Check that required arguments are not none + self.check_none('loglike') + self.check_none('model') + self.check_none('prior') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('fsavefile') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Setup the inference + ndim = np.sum(self.pstep > 0) + if self.nchains > 1: + p = mp.Pool(self.nchains) + dy = dynesty.DynamicNestedSampler(self.loglike, + self.prior, + ndim, + bound=self.bound, + sample=self.sample, + queue_size=self.nchains, + pool=p) + else: + dy = dynesty.DynamicNestedSampler(self.loglike, + self.prior, + ndim, + bound=self.bound, + sample=self.sample) + + # Run it + dy.run_nested(nlive_init=self.nlive, + nlive_batch=self.nlive_batch, + maxiter=self.niter, dlogz_init=self.dlogz, + n_effective=self.min_ess) + results = dy.results + + # Posterior and best parameters + self.bestp = results["samples"][np.argmax(results["logl"])] + samps = results["samples"] + nsamp = samps.shape[0] + # From cornerplot in dynesty/plotting.py + try: + weights = np.exp(results['logwt'] - results['logz'][-1]) + except: + weights = results['weights'] + # Remove cases w/ 0 weight + samps = samps [weights!=0] + weights = weights[weights!=0] + + # As in MultiNest, resample to equal weights by considering + # int(nsamples*weight) repetitions + self.outp = [] + for i in range(len(weights)): + self.outp.extend([samps[i] + for j in range(int(nsamp * weights[i]))]) + self.outp = np.asarray(self.outp) + + if self.kll is not None: + for i in range(self.outp.shape[0]): + self.kll.update(self.model(self.outp[i], fullout=True)) + self.outp = self.outp.T + + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + return self.outp, self.bestp + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/helper.py b/lisa/wrappers/helper.py new file mode 100644 index 0000000..789ad26 --- /dev/null +++ b/lisa/wrappers/helper.py @@ -0,0 +1,334 @@ +import sys, os +import six +import numpy as np + +mcpdir = os.path.join(os.path.dirname(__file__), '..', 'modules', 'MCcubed', + 'MCcubed', 'plots') +sys.path.append(mcpdir) +sys.path.append(os.path.join(mcpdir, '..', 'lib')) # so that mcplots finds binarray +import mcplots as mcp + + +class BaseSampler(object): + """ + Parent class for samplers in LISA. + + Contains the helpinfo attribute, which is a dictionary containing + descriptions of each parameter. The help(param) method returns the + dictionary entry for `param`. + + Contains helper methods common to samplers: make_dir, check_none, + check_nonnegfloat, check_nonnegint, check_pnames, check_posint, + make_abspath, prep_arr, and update_path. These are used when checking + that the user has supplied proper inputs before attempting to run the + sampler. + """ + def __init__(self): + # Default values + self.nchains = 1 # some samplers do not use these params, + self.thinning = 1 # but they are required for posterior plots + self.burnin = 0 # or when re-loading output posterior + # Dictionary of parameters and their descriptions + self.helpinfo = { + 'beta' : 'float. DNest 4 only. From their docs: strength of effect ' + \ + 'to force histogram to equal push. Default: 100.0', + 'bound' : 'str. Dynesty only. Option to bound the target ' + \ + 'distribution. Choices: none (sample from unit ' + \ + 'cube), single (one ellipsoid), multi (multiple ' + \ + 'possibly overlapping ellipsoids), balls ' + \ + '(overlapping balls centered on each live point), ' + \ + 'cubes (overlapping cubes centered on each live ' + \ + 'point). Default: multi', + 'burnin' : 'int. Number of initial iterations to be discarded.', + 'data' : 'array, Numpy binary. Measured data for inference. ' + \ + 'Must be Numpy array, list, or a path to a NPY file.', + 'dlogz' : 'float. Target evidence uncertainty (stops when below ' + \ + 'this value). Default: 0.1', + 'dumper' : 'object. Polychord only. Function to output info ' + \ + 'during the inference. Default: None', + 'fbestp' : 'str. Filename for array of best-fit parameters. ' + \ + 'Must be NPY file.', + 'fext' : 'str. File extension for saved plots. ' + \ + 'Options: .png, .pdf Default: .png', + 'flog' : 'str. DEMC and snooker only. /path/to/log file to save out. ' + \ + 'Default: MCMC.log, located in `outputdir`', + 'fprefix' : 'str. Prefix for output filenames. Recommended to be ' + \ + 'a directory (possibly with a prefix for all ' + \ + 'produced files), as this will create a ' + \ + 'subdirectory within `outputdir`. ' + \ + 'Default: pmn/ for multinest, ' + \ + ' run1 for polychord.', + 'fsavefile' : 'str. Filename to store parameters explored. ' + \ + 'If relative path, it is considered with ' + \ + 'respect to `outputdir`. ' + \ + 'Default: `outputdir`/output.npy', + 'fsavemodel' : 'str. Filename to store models, corresponding to ' + \ + 'the parameters. If relative path, it is ' + \ + 'considered with respect to `outputdir`. ' + \ + 'If None, file is not saved. ' + \ + 'Beware: the file may be extremely large ' + \ + 'if the model output has high dimensionality.' + \ + 'Default: None', + 'frac_remain' : 'float. UltraNest only. Sets the fraction ' + \ + 'remainder when integrating the posterior.', + 'hsize' : 'int. Snooker only. Number of samples per chain to seed ' + \ + 'the phase space. Default: nchains+1', + 'indparams' : 'list. Additional parameters needed by `func`.', + 'kll' : 'object. Datasketches KLL object, for model quantiles. ' + \ + 'Use None if not desired or if Datasketches is ' + \ + 'not installed. Default: None', + 'lam' : 'float. DNest 4 only. From their docs: backtracking scale ' + \ + 'length. Default: 5.0', + 'Lepsilon' : 'float. UltraNest only. From their docs: "Terminate ' + \ + 'when live point likelihoods are all the same, ' + \ + 'within Lepsilon tolerance."', + 'loglike' : 'object. Function defining the log likelihood.', + 'min_ess' : 'int. Minimum effective sample size (ESS). Default: 500', + 'model' : 'object. Function defining the forward model.', + 'modelper' : 'int. Sets how to split `fsavemodel` into subfiles. ' + \ + 'If 0, does not split. If >0, saves out every ' + \ + '`modelper` iterations. E.g., if nchains=10 and ' + \ + 'modelper=5, splits every 50 model evaluations. ' + \ + 'Default: 0', + 'multitry' : 'int. DREAM only. Determines whether to use multi-try ' + \ + 'sampling. Default: 5', + 'nchains' : 'int. Number of parallel samplers. Default: 1', + 'niter' : 'int. Maximum number of iterations. Nested samplers ' + \ + 'default to no limit.', + 'nlive' : 'int. (Minimum) number of live points to use. Default: 500', + 'nlive_batch': 'int. Dynesty only. From their docs: "The number of ' + \ + 'live points used when adding additional ' + \ + 'samples from a nested sampling run within ' + \ + 'each batch." Default: 500.', + 'nlevel' : 'int. DNest4 only. From their docs: Maximum number of ' + \ + 'levels to create. Default: 30', + 'nlevelint' : 'int. DNest4 only. Number of moves before creating ' + \ + 'new level. Default: 10000', + 'nperstep' : 'int. DNest4 only. Number of moves per MCMC ' + \ + 'iteration. Default: 10000', + 'nrepeat' : "int. Polychord only. From their docs: The number of " + \ + "slice slice-sampling steps to generate a new " + \ + "point. Increasing num_repeats increases the " + \ + "reliability of the algorithm. Default: None " + \ + "(uses polychord's default of 5*ndims)", + 'outputdir' : 'str. path/to/directory where output will be saved.', + 'perturb' : 'object. DNest4 only. Function that proposes changes ' + \ + 'to parameter values.', + 'pinit' : 'array, Numpy binary. For MCMCs, initial parameters for ' + \ + 'samplers. For nested sampling algorithms, ' + \ + 'values are used for parameters that are held ' + \ + 'constant, if any.' + \ + 'Must be Numpy array, list, or a path to a NPY file.', + 'pmax' : 'array, Numpy binary. Maximum value for each parameter.' + \ + 'Must be Numpy array, list, or a path to a NPY file.', + 'pmin' : 'array, Numpy binary. Minimum value for each parameter.' + \ + 'Must be Numpy array, list, or a path to a NPY file.', + 'pnames' : 'array. Name of each parameter (can use some LaTeX if ' + \ + 'desired).' + \ + 'Must be Numpy array or list.', + 'prior' : 'object. Function defining the prior.', + 'pstep' : 'array. Step size for each parameter. For MCMCs, only ' + \ + 'matters for the initial samples and determining ' + \ + 'constant parameters, as step size is ' + \ + 'automatically adjusted. For nested sampling ' + \ + 'algorithms, only used to determine constant ' + \ + 'parameters.', + 'resample' : 'float. DNest4 only. Must be non-negative. ' + \ + 'If >0, corresponds to a factor affecting the ' + \ + 'number of draws from the posterior. If 0, no ' + \ + 'resampling is performed. Default: 100', + 'resume' : 'bool. Determines whether to resume a previous run, if ' + \ + 'possible. Default: False', + 'sample' : 'str. Dynesty only. Sampling method. Choices ' + \ + '(descriptions from their docs): unif (uniform ' + \ + 'sampling), rwalk (random walks from current live ' + \ + 'point), rstagger (random "staggering" away from ' + \ + 'current live point), slice (multivariate slice ' + \ + 'sampling), rslice (random slice sampling), hslice ' + \ + '("Hamiltonian" slice sampling), auto ' + \ + '(automatically selected based on problem ' + \ + 'dimensionality). Default: auto', + 'thinning' : 'int. Thinning factor for the posterior ' + \ + '(keep every N iterations). ' + \ + 'Example: a thinning factor of 3 will keep every ' + \ + 'third iteration. Only recommended when the ' + \ + 'computed posterior is extremely large. ' + \ + 'Default: 1', + 'truepars' : 'array, Numpy binary. Known true values for the model ' + \ + 'parameters. If unknown, use None. Default: None', + 'uncert' : 'array, Numpy binary. Data uncertainties.' + \ + 'Must be Numpy array, list, or a path to a NPY file.', + 'verb' : 'int. Verbosity level. If 0, only essential messages are ' + \ + 'printed by LISA. If 1, prints additional messages ' + \ + '(e.g., loading data files). Default: 0' + } + + def help(self, par): + """ + Returns information about a parameter + + Inputs + ------ + par: string. Parameter of interest. + """ + if par in self.helpinfo.keys(): + print(par, ":", self.helpinfo[par]) + else: + print(par, "is not a parameter for this sampler.") + + def make_dir(self, some_dir): + """ + Handles creation of a directory. + + Inputs + ------ + some_dir: string. Directory to be created. + + Outputs + ------- + None. Creates `some_dir` if it does not already exist. + Raises an error if the directory cannt be created. + """ + try: + os.mkdir(some_dir) + except OSError as e: + if e.errno == 17: # Already exists + pass + else: + print("Cannot create folder '{:s}'. {:s}.".format(some_dir, + os.strerror(e.errno))) + sys.exit() + return + + def check_none(self, attr): + """ + Checks attributes that must be specified. + """ + if getattr(self, attr) is None: + print(attr, "must be specified.") + self.unprepared += 1 + + def check_nonnegfloat(self, attr): + """ + Checks attributes that must be non-negative floats. + """ + if type(getattr(self, attr)) == int: + setattr(self, attr, float(getattr(self, attr))) + if getattr(self, attr) is None or getattr(self, attr) < 0 or \ + type(getattr(self, attr)) != float: + print(attr, "must be a non-negative float.") + self.unprepared += 1 + + def check_nonnegint(self, attr): + """ + Checks attributes that must be non-negative integers. + """ + val = getattr(self, attr) + if val is None or val < 0 or \ + type(val) != int: + print(attr, "must be a non-negative integer. Given:", val) + self.unprepared += 1 + + def check_pnames(self): + """ + Creates an array of parameter names if the user does not provide them + ** MODIFIES THE OBJECT'S pnames ATTRIBUTE IF IT IS None ** + """ + # Set default parameter names: + if self.pnames is None and self.pstep is not None: + if self.verb: + print("Using default parameter names.") + npars = self.pstep.size + namelen = int(2+np.log10(np.amax([npars-1,1]))) + self.pnames = np.zeros(npars, "|S%d"%namelen if six.PY2 + else "0], + thinning=self.thinning, + sep=np.size(self.outp[0]//self.nchains), + savefile=os.path.join(self.outputdir, "trace"+self.fext), + truepars=self.truepars) + mcp.histogram(self.outp, parname=self.pnames[self.pstep>0], + thinning=self.thinning, + savefile=os.path.join(self.outputdir, + "posterior"+self.fext), + truepars=self.truepars, density=True) + mcp.pairwise(self.outp, parname=self.pnames[self.pstep>0], + thinning=self.thinning, + savefile=os.path.join(self.outputdir, + "pairwise"+self.fext), + truepars=self.truepars) + else: + print("Attempted to produce posterior plots, but the " + \ + "inference has not yet successfully executed.") + print("Execute the run() method and try again.") + + diff --git a/lisa/wrappers/multinest_wrapper.py b/lisa/wrappers/multinest_wrapper.py new file mode 100644 index 0000000..4da9632 --- /dev/null +++ b/lisa/wrappers/multinest_wrapper.py @@ -0,0 +1,181 @@ +""" +Wrapper for PyMultiNest algorithm of Buchner (2014). + +Sampler: class to setup and run an inference +""" + +import sys, os +import numpy as np +import matplotlib.pyplot as plt +import pymultinest + +from .helper import BaseSampler + + +class Sampler(BaseSampler): + def __init__(self, dlogz=0.1, fbestp='bestp.npy', fext='.png', fprefix='pmn/', + fsavefile='output.npy', kll=None, + loglike=None, model=None, niter=0, nlive=500, + outputdir=None, pnames=None, prior=None, pstep=None, + resume=False, truepars=None, verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'multinest' #name + self.reqpar = ['loglike', 'model', 'nlive', 'outputdir', + 'prior', 'pstep'] #required parameters + self.optpar = ['dlogz', 'fbestp', 'fext', 'fprefix', 'fsavefile', + 'kll', 'niter', 'pnames', 'resume', 'truepars', + 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.dlogz = dlogz + self.fbestp = fbestp + self.fext = fext + self.fprefix = fprefix + self.fsavefile = fsavefile + self.kll = kll + self.loglike = loglike + self.model = model + self.niter = niter + self.nlive = nlive + self.outputdir = outputdir + self.pnames = pnames + self.prior = prior + self.pstep = pstep + self.resume = resume + self.truepars = truepars + self.verb = verb + if self.verb: + print("PyMultiNest sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('pstep') + # Check non-negative float inputs + self.check_nonnegfloat('dlogz') + # Check non-negative int inputs + self.check_nonnegint('niter') + # Check positive int inputs + self.check_posint('nlive') + # Check arguments that cannot be none + self.check_none('fprefix') + self.check_none('loglike') + self.check_none('model') + self.check_none('prior') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + if os.sep in self.fprefix: + self.make_dir(os.path.join(self.outputdir, self.fprefix)) + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('fsavefile') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Run the inference + pmn = pymultinest.run(self.loglike, self.prior, + n_dims=sum(self.pstep > 0), + outputfiles_basename=os.path.join(self.outputdir, + self.fprefix), + n_live_points=self.nlive, max_iter=self.niter, + evidence_tolerance=self.dlogz, + resume=self.resume) + # Analyze the output + a = pymultinest.Analyzer(n_params=len(self.pstep), + outputfiles_basename=os.path.join(self.outputdir, + self.fprefix)) + s = a.get_stats() + self.bestp = a.get_best_fit()['parameters'] + self.outp = a.get_equal_weighted_posterior()[:, :-1].T + # Update quantiles + if self.kll is not None: + for i in range(self.outp.shape[-1]): + self.kll.update(self.model(self.outp[:,i], fullout=True)) + + if self.verb: + print("Global Evidence:\n\t%.15e +- %.15e" % \ + (s['nested sampling global log-evidence'], + s['nested sampling global log-evidence error'])) + + # PyMultiNest plots + n_params = self.outp.shape[0] + if self.pnames is not None: + parameters = self.pnames[self.pstep>0] + p = pymultinest.PlotMarginalModes(a) + plt.figure(figsize=(5*n_params, 5*n_params)) + for i in range(n_params): + plt.subplot(n_params, n_params, n_params * i + i + 1) + p.plot_marginal(i, with_ellipses = True, with_points = False, + grid_points=50) + plt.ylabel("Probability") + plt.xlabel(parameters[i]) + + for j in range(i): + plt.subplot(n_params, n_params, n_params * j + i + 1) + p.plot_conditional(i, j, with_ellipses = False, + with_points = True, grid_points=30) + plt.xlabel(parameters[i]) + plt.ylabel(parameters[j]) + + plt.savefig(os.path.join(self.outputdir, ''.join(['marginals_multinest', + self.fext])), bbox_inches='tight') + plt.close() + + # These are optional since the above contains the same info + for i in range(n_params): + p.plot_modes_marginal(i, with_ellipses = True, with_points = False) + plt.ylabel("Probability") + plt.xlabel(parameters[i]) + plt.savefig(''.join([a.outputfiles_basename, 'mode-marginal-', + str(i), self.fext]), bbox_inches='tight') + plt.close() + + p.plot_modes_marginal(i, cumulative = True, with_ellipses = True, with_points = False) + plt.ylabel("Cumulative probability") + plt.xlabel(parameters[i]) + plt.savefig(''.join([a.outputfiles_basename, 'mode-marginal-cumulative-', + str(i), self.fext]), bbox_inches='tight') + plt.close() + + + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/polychord_wrapper.py b/lisa/wrappers/polychord_wrapper.py new file mode 100644 index 0000000..0789499 --- /dev/null +++ b/lisa/wrappers/polychord_wrapper.py @@ -0,0 +1,143 @@ +""" +Wrapper for the polychord algorithm of Handley et al. (2015a, 2015b). + +Sampler: class to setup and run an inference +""" + +import sys, os +import numpy as np +import matplotlib.pyplot as plt +import pypolychord +from pypolychord.settings import PolyChordSettings + +from .helper import BaseSampler + + +class Sampler(BaseSampler): + def __init__(self, dlogz=0.1, dumper=None, fbestp='bestp.npy', + fext='.png', fprefix='run1', fsavefile='output.npy', + kll=None, loglike=None, model=None, nlive=500, + nrepeat=None, outputdir=None, pnames=None, prior=None, + pstep=None, resume=False, truepars=None, verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'polychord' #name + self.reqpar = ['loglike', 'model', 'nlive', 'outputdir', + 'prior', 'pstep'] #required parameters + self.optpar = ['dlogz', 'dumper', 'fbestp', 'fext', 'fprefix', + 'fsavefile', 'kll', 'nrepeat', 'pnames', 'resume', + 'truepars', 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.dlogz = dlogz + self.dumper = dumper + self.fbestp = fbestp + self.fext = fext + self.fprefix = fprefix + self.fsavefile = fsavefile + self.kll = kll + self.loglike = loglike + self.model = model + self.nlive = nlive + self.nrepeat = nrepeat + self.outputdir = outputdir + self.pnames = pnames + self.prior = prior + self.pstep = pstep + self.resume = resume + self.truepars = truepars + self.verb = verb + if self.verb: + print("polychord sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('pstep') + # Check non-negative float inputs + self.check_nonnegfloat('dlogz') + # Check positive int inputs + self.check_posint('nlive') + # Check that required arguments are not none + self.check_none('loglike') + self.check_none('model') + self.check_none('prior') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + if os.sep in self.fprefix: + self.make_dir(os.path.join(self.outputdir, + self.fprefix.rsplit(os.sep, 1)[0])) + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('fsavefile') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Setup the inference + ndim = np.sum(self.pstep > 0) + settings = PolyChordSettings(ndim, 0) + settings.base_dir = self.outputdir + settings.file_root = self.fprefix + settings.nlive = self.nlive + settings.read_resume = self.resume + if self.nrepeat is not None: + settings.num_repeat = self.nrepeat + settings.precision_criterion = self.dlogz + settings.grade_dims = [int(ndim)] + settings.read_resume = False + settings.feedback = self.verb + # Run it + if self.dumper is not None: + out = pypolychord.run_polychord(self.loglike, ndim, 0, + settings, self.prior, + self.dumper) + else: + out = pypolychord.run_polychord(self.loglike, ndim, 0, + settings, self.prior) + + outp = np.loadtxt(os.path.join(self.outputdir, self.fprefix) +\ + '_equal_weights.txt') + self.outp = outp[:, 2:].T + ibest = np.argmin(outp[:,1]) + self.bestp = self.outp[:,ibest] + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + return self.outp, self.bestp + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/snooker_wrapper.py b/lisa/wrappers/snooker_wrapper.py new file mode 100644 index 0000000..0828dfb --- /dev/null +++ b/lisa/wrappers/snooker_wrapper.py @@ -0,0 +1,167 @@ +""" +Wrapper for DEMC with snooker updating algorithm of ter Braak & Vrugt (2008) + +Sampler: class to setup and run the inference +""" + +import sys, os +import numpy as np + +from .helper import BaseSampler + +mc3dir = os.path.join(os.path.dirname(__file__), '..', 'modules', 'MCcubed') +sys.path.append(mc3dir) +import MCcubed as mc3 + + +class Sampler(BaseSampler): + def __init__(self, burnin=None, data=None, fbestp='bestp.npy', + fext='.png', flog='MCMC.log', + fsavefile='output.npy', fsavemodel=None, + hsize=0, indparams=[], kll=None, model=None, + modelper=0, nchains=1, niter=None, + outputdir=None, + pinit=None, pmax=None, pmin=None, pnames=None, + pstep=None, resume=False, thinning=1, truepars=None, + uncert=None, verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'snooker' #name + self.reqpar = ['burnin', 'data', 'model', 'nchains', 'niter', + 'outputdir', 'pinit', 'pmax', 'pmin', 'pstep', + 'uncert'] #required parameters + self.optpar = ['fbestp', 'fext', 'flog', 'fsavefile', 'fsavemodel', + 'hsize', 'indparams', 'kll', 'modelper', 'pnames', + 'resume', 'thinning', 'truepars', + 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.burnin = burnin + self.data = data + self.fbestp = fbestp + self.fext = fext + self.flog = flog + self.fsavefile = fsavefile + self.fsavemodel = fsavemodel + self.model = model + self.hsize = hsize + self.indparams = indparams + self.kll = kll + self.nchains = nchains + self.niter = niter + self.outputdir = outputdir + self.pinit = pinit + self.pmax = pmax + self.pmin = pmin + self.pnames = pnames + self.pstep = pstep + self.resume = resume + self.thinning = thinning + self.truepars = truepars + self.uncert = uncert + self.verb = verb + if self.verb: + print("Snooker (DEMCzs) sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('data') + self.prep_arr('pinit') + self.prep_arr('pmax') + self.prep_arr('pmin') + self.prep_arr('pstep') + self.prep_arr('uncert') + # Check positive integers + self.check_posint('hsize') + self.check_posint('nchains') + self.check_posint('niter') + self.check_posint('thinning') + # Check non-negative integers + self.check_nonnegint('burnin') + # Check that required arguments are not none + self.check_none('model') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('flog') + self.update_path('fsavefile') + self.update_path('fsavemodel') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Open the log file + if self.flog is not None: + if self.resume: + mode = 'a' + else: + mode = 'w' + logfile = open(self.flog, mode) + else: + logfile = None + # Run the MCMC + self.outp, self.bestp = mc3.mc.mcmc(self.data, + self.uncert, + func = self.model, + indparams = self.indparams, + parnames = self.pnames, + params = self.pinit, + pmin = self.pmin, + pmax = self.pmax, + stepsize = self.pstep, + numit = self.niter, + burnin = self.burnin, + thinning = self.thinning, + nchains = self.nchains, + walk = self.alg, + hsize = self.hsize, + plots = False, + leastsq = False, + log = logfile, + savefile = self.fsavefile, + savemodel = self.fsavemodel, + resume = self.resume) + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + # Close the log + if self.flog is not None: + logfile.close() + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/lisa/wrappers/ultranest_wrapper.py b/lisa/wrappers/ultranest_wrapper.py new file mode 100644 index 0000000..eefea00 --- /dev/null +++ b/lisa/wrappers/ultranest_wrapper.py @@ -0,0 +1,146 @@ +""" +Wrapper for UltraNest algorithm of Buchner (2014, 2016, 2019). + +Sampler: class to setup and run an inference +""" + +import sys, os +import numpy as np +import matplotlib.pyplot as plt +import ultranest + +from .helper import BaseSampler + + +class Sampler(BaseSampler): + def __init__(self, dlogz=0.1, fbestp='bestp.npy', fext='.png', + frac_remain=0.01, fsavefile='output.npy', kll=None, + Lepsilon=0.001, loglike=None, min_ess=500, model=None, + niter=None, nlive=500, outputdir=None, pnames=None, + prior=None, pstep=None, resume=False, truepars=None, + verb=0): + """ + For details on the inputs, instantiate an object `obj` and call + obj.help('parameter'), or see the description in the user manual. + """ + # Instantiate attributes from BaseSampler + super(Sampler, self).__init__() + # General info about the algorithm + self.alg = 'ultranest' #name + self.reqpar = ['loglike', 'model', 'nlive', 'outputdir', + 'prior', 'pstep'] #required parameters + self.optpar = ['dlogz', 'fbestp', 'fext', 'frac_remain', 'fsavefile', + 'kll', 'Lepsilon', 'min_ess', 'niter', 'pnames', + 'resume', 'truepars', 'verb'] #optional parameters + # Only keep help entries relevant to this algorithm + self.helpinfo = {key : self.helpinfo[key] + for key in self.reqpar+self.optpar} + # Load supplied parameters + self.dlogz = dlogz + self.fbestp = fbestp + self.fext = fext + self.frac_remain = frac_remain + self.fsavefile = fsavefile + self.kll = kll + self.Lepsilon = Lepsilon + self.loglike = loglike + self.min_ess = min_ess + self.model = model + self.niter = niter + self.nlive = nlive + self.outputdir = outputdir + self.pnames = pnames + self.prior = prior + self.pstep = pstep + if resume: + self.resume = 'resume' + else: + self.resume = 'overwrite' + self.truepars = truepars + self.verb = verb + if self.verb: + print("UltraNest sampler initialized") + print("To view a list of required parameters, print obj.reqpar") + print("To view a list of optional parameters, print obj.optpar") + print("For details on any parameter, call " + \ + "obj.help('parameter') or print obj.helpinfo['parameter']") + + def prepare(self): + """ + Checks that all required parameters are supplied, and loads any + supplied binary files + """ + self.unprepared = 0 + # Prepare inputs that may be arrays + self.prep_arr('pstep') + # Check non-negative float inputs + self.check_nonnegfloat('dlogz') + self.check_nonnegfloat('frac_remain') + self.check_nonnegfloat('Lepsilon') + # Check positive int inputs + self.check_posint('min_ess') + self.check_posint('nlive') + # Check that required arguments are not none + self.check_none('loglike') + self.check_none('model') + self.check_none('prior') + # Make sure outputdir is an absolute path & exists + if self.make_abspath('outputdir'): + # Now update paths based on that, if needed + self.update_path('fbestp') + self.update_path('fsavefile') + # Ensure proper pnames exist as numpy array + self.check_pnames() + # Ready to run? + if self.unprepared: + print("Correct the", self.unprepared, + "issues above, and try again.") + return False + else: + if self.verb: + print("Sampler successfully prepared to run.") + return True + + def run(self): + """ + Executes the inference + """ + if self.prepare(): + # Set up the inference + un = ultranest.ReactiveNestedSampler(list(self.pnames), + self.loglike, + self.prior, + log_dir=self.outputdir, + vectorized=True, + resume=self.resume) + # Run it + out = un.run(min_ess=self.min_ess, max_iters=self.niter, + min_num_live_points=self.nlive, + frac_remain=self.frac_remain, + Lepsilon=self.Lepsilon, dlogz=self.dlogz) + if self.verb: + un.print_results() + + # Posterior and best parameters + self.bestp = np.array(un.results['maximum_likelihood']['point']) + self.outp = un.results['samples'].T + if self.kll is not None: + for i in range(self.outp.shape[-1]): + self.kll.update(self.model(self.outp[:,i], fullout=True)) + + # UltraNest Plotting + un.plot_corner() + un.plot_run() + un.plot_trace() + + # Save posterior and bestfit params + if self.fsavefile is not None: + np.save(self.fsavefile, self.outp) + if self.fbestp is not None: + np.save(self.fbestp, self.bestp) + else: + if self.verb: + print("Sampler is not fully prepared to run. " + \ + "Correct the above errors and try again.") + + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..d65f775 --- /dev/null +++ b/setup.py @@ -0,0 +1,51 @@ +import sys +import os +import subprocess +from glob import glob +import setuptools +from setuptools.command.build_py import build_py + + +class lisa_build(build_py): + """ + Customized setuptools build command + From https://stackoverflow.com/a/45349660 + """ + def run(self): + if subprocess.call(["make", "-ik", "all"]) != 0: + sys.exit(-1) + build_py.run(self) + +# Read in version info +with open('./lisa/_version.py') as foo: + VER = str(foo.read().split('=')[-1].strip().strip("'")) + +# Read in the README +with open('README', 'r') as foo: + long_description = foo.read() + +docdir = os.path.join(os.path.dirname(__file__), 'doc') +moddir = os.path.join(os.path.dirname(__file__), 'lisa', 'modules') + +setuptools.setup( + name='lisa', + version=VER, + scripts=[], + author='Michael Himes', + author_email='mhimes@knights.ucf.edu', + description='Large-selection Interface for Sampling Algorithms', + long_description=long_description, + long_description_content_type='text/markdown', + url='https://github.com/exosports/lisa', + packages=setuptools.find_packages(), + include_package_data=True, + classifiers=[ + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", + ], + python_requires='>=3.6', + install_requires=['numpy>=1.16', 'matplotlib>=3.0', + 'pymultinest==2.9', 'ultranest>=2.2.1', 'dynesty>=1.0.1', + 'dnest4>=0.2.4', 'mpi4py>=3.0.3'], + cmdclass={'build_py': lisa_build} + )