From 706ecfdcdb4e61f6f8d18b5f82af656955250ad6 Mon Sep 17 00:00:00 2001 From: ClaasRostock Date: Wed, 5 Feb 2025 05:38:14 +0000 Subject: [PATCH] deploy: b4931b5081d72a6721dc9abe197f4940f2b9bad9 --- .buildinfo | 4 + .nojekyll | 0 CHANGELOG.html | 610 +++++++ LICENSE.html | 479 ++++++ README.html | 789 +++++++++ STYLEGUIDE.html | 942 +++++++++++ _autosummary/axtreme.acquisition.html | 480 ++++++ ...quisition.qoi_look_ahead.QoILookAhead.html | 782 +++++++++ .../axtreme.acquisition.qoi_look_ahead.html | 709 ++++++++ ...riant_sampler.BatchInvariantSampler2d.html | 582 +++++++ .../axtreme.data.batch_invariant_sampler.html | 516 ++++++ .../axtreme.data.dataset.MinimalDataset.html | 552 ++++++ _autosummary/axtreme.data.dataset.html | 481 ++++++ ...ixed_random_sample.FixedRandomSampler.html | 562 +++++++ .../axtreme.data.fixed_random_sample.html | 483 ++++++ _autosummary/axtreme.data.html | 498 ++++++ ...rtance_dataset.ImportanceAddedWrapper.html | 525 ++++++ ...rtance_dataset.ImportanceIndexWrapper.html | 530 ++++++ .../axtreme.data.importance_dataset.html | 502 ++++++ ...i_dim_batch_sampler.MultiBatchSampler.html | 564 +++++++ .../axtreme.data.multi_dim_batch_sampler.html | 481 ++++++ ...a.numpy_file_dataset.NumpyFileDataset.html | 587 +++++++ .../axtreme.data.numpy_file_dataset.html | 515 ++++++ ...ntial_sample.SizableSequentialSampler.html | 550 ++++++ ...xtreme.data.sizable_sequential_sample.html | 481 ++++++ .../axtreme.distributions.helpers.html | 580 +++++++ _autosummary/axtreme.distributions.html | 491 ++++++ _autosummary/axtreme.distributions.icdf.html | 570 +++++++ ...tributions.mixture.ApproximateMixture.html | 750 +++++++++ .../axtreme.distributions.mixture.html | 548 ++++++ _autosummary/axtreme.distributions.utils.html | 573 +++++++ _autosummary/axtreme.eval.html | 489 ++++++ _autosummary/axtreme.eval.object_logging.html | 646 ++++++++ _autosummary/axtreme.eval.qoi_helpers.html | 579 +++++++ _autosummary/axtreme.eval.qoi_job.QoIJob.html | 566 +++++++ .../axtreme.eval.qoi_job.QoIJobResult.html | 625 +++++++ _autosummary/axtreme.eval.qoi_job.html | 484 ++++++ _autosummary/axtreme.eval.utils.html | 508 ++++++ ...axtreme.evaluation.EvaluationFunction.html | 581 +++++++ ...eme.evaluation.SimulationPointResults.html | 616 +++++++ _autosummary/axtreme.evaluation.html | 484 ++++++ _autosummary/axtreme.experiment.html | 691 ++++++++ .../axtreme.metrics.LocalMetadataMetric.html | 604 +++++++ _autosummary/axtreme.metrics.html | 481 ++++++ _autosummary/axtreme.plotting.doe.html | 530 ++++++ _autosummary/axtreme.plotting.gp_fit.html | 586 +++++++ .../axtreme.plotting.histogram3d.html | 559 +++++++ _autosummary/axtreme.plotting.html | 486 ++++++ ...xtreme.qoi.gp_bruteforce.GPBruteForce.html | 669 ++++++++ _autosummary/axtreme.qoi.gp_bruteforce.html | 481 ++++++ _autosummary/axtreme.qoi.html | 488 ++++++ ...xtrapolation.MarginalCDFExtrapolation.html | 624 +++++++ ...xtreme.qoi.marginal_cdf_extrapolation.html | 561 +++++++ ...xtreme.qoi.qoi_estimator.QoIEstimator.html | 564 +++++++ _autosummary/axtreme.qoi.qoi_estimator.html | 481 ++++++ .../axtreme.runner.LocalMetadataRunner.html | 603 +++++++ _autosummary/axtreme.runner.html | 481 ++++++ ...base.MeanVarPosteriorSampledEstimates.html | 629 +++++++ ...xtreme.sampling.base.PosteriorSampler.html | 563 +++++++ _autosummary/axtreme.sampling.base.html | 484 ++++++ _autosummary/axtreme.sampling.html | 493 ++++++ ...ependent_sampler.IndependentMCSampler.html | 749 +++++++++ .../axtreme.sampling.independent_sampler.html | 529 ++++++ ...eme.sampling.mean_sampler.MeanSampler.html | 515 ++++++ .../axtreme.sampling.mean_sampler.html | 481 ++++++ ...dent_sampler.NormalIndependentSampler.html | 682 ++++++++ ...e.sampling.normal_independent_sampler.html | 484 ++++++ ...axtreme.sampling.ut_sampler.UTSampler.html | 779 +++++++++ _autosummary/axtreme.sampling.ut_sampler.html | 545 ++++++ .../axtreme.simulator.base.Simulator.html | 514 ++++++ _autosummary/axtreme.simulator.base.html | 481 ++++++ _autosummary/axtreme.simulator.html | 483 ++++++ _autosummary/axtreme.simulator.utils.html | 553 +++++++ .../axtreme.utils.distibution_helpers.html | 566 +++++++ .../axtreme.utils.experiment_utils.html | 506 ++++++ _autosummary/axtreme.utils.gradient.html | 566 +++++++ _autosummary/axtreme.utils.html | 505 ++++++ _autosummary/axtreme.utils.logging.html | 521 ++++++ _autosummary/axtreme.utils.model_helpers.html | 554 +++++++ .../axtreme.utils.modelbridge_utils.html | 544 ++++++ .../axtreme.utils.numerical_precision.html | 558 +++++++ .../axtreme.utils.population_estimators.html | 626 +++++++ _autosummary/axtreme.utils.transforms.html | 711 ++++++++ _images/ax_component_diagram.png | Bin 0 -> 65861 bytes _images/doe_point.png | Bin 0 -> 60536 bytes _images/erd_smoothness.png | Bin 0 -> 39257 bytes _images/long_term_response_distribution.png | Bin 0 -> 111056 bytes _images/noise_simulator.png | Bin 0 -> 22721 bytes _images/qoi_smoothness.png | Bin 0 -> 38383 bytes _images/simulator_non_gaus_noise.png | Bin 0 -> 31593 bytes _images/simulator_normal_noise.png | Bin 0 -> 23709 bytes _images/surrogate_model_no_uncertainty.png | Bin 0 -> 67774 bytes _images/surrogate_model_uncertainty_aware.png | Bin 0 -> 56961 bytes _sources/CHANGELOG.md.txt | 2 + _sources/LICENSE.md.txt | 3 + _sources/README.md.txt | 2 + _sources/STYLEGUIDE.md.txt | 2 + ...sition.qoi_look_ahead.QoILookAhead.rst.txt | 80 + ...axtreme.acquisition.qoi_look_ahead.rst.txt | 26 + .../_autosummary/axtreme.acquisition.rst.txt | 15 + ...nt_sampler.BatchInvariantSampler2d.rst.txt | 24 + ...treme.data.batch_invariant_sampler.rst.txt | 17 + ...xtreme.data.dataset.MinimalDataset.rst.txt | 24 + .../_autosummary/axtreme.data.dataset.rst.txt | 17 + ...d_random_sample.FixedRandomSampler.rst.txt | 31 + .../axtreme.data.fixed_random_sample.rst.txt | 17 + ...nce_dataset.ImportanceAddedWrapper.rst.txt | 29 + ...nce_dataset.ImportanceIndexWrapper.rst.txt | 24 + .../axtreme.data.importance_dataset.rst.txt | 18 + ...im_batch_sampler.MultiBatchSampler.rst.txt | 24 + ...treme.data.multi_dim_batch_sampler.rst.txt | 17 + ...umpy_file_dataset.NumpyFileDataset.rst.txt | 24 + .../axtreme.data.numpy_file_dataset.rst.txt | 22 + _sources/_autosummary/axtreme.data.rst.txt | 21 + ...al_sample.SizableSequentialSampler.rst.txt | 30 + ...eme.data.sizable_sequential_sample.rst.txt | 17 + .../axtreme.distributions.helpers.rst.txt | 15 + .../axtreme.distributions.icdf.rst.txt | 14 + ...butions.mixture.ApproximateMixture.rst.txt | 51 + .../axtreme.distributions.mixture.rst.txt | 22 + .../axtreme.distributions.rst.txt | 18 + .../axtreme.distributions.utils.rst.txt | 15 + .../axtreme.eval.object_logging.rst.txt | 18 + .../axtreme.eval.qoi_helpers.rst.txt | 16 + .../axtreme.eval.qoi_job.QoIJob.rst.txt | 33 + .../axtreme.eval.qoi_job.QoIJobResult.rst.txt | 38 + .../_autosummary/axtreme.eval.qoi_job.rst.txt | 18 + _sources/_autosummary/axtreme.eval.rst.txt | 18 + .../_autosummary/axtreme.eval.utils.rst.txt | 13 + ...reme.evaluation.EvaluationFunction.rst.txt | 26 + ....evaluation.SimulationPointResults.rst.txt | 32 + .../_autosummary/axtreme.evaluation.rst.txt | 18 + .../_autosummary/axtreme.experiment.rst.txt | 18 + ...xtreme.metrics.LocalMetadataMetric.rst.txt | 44 + _sources/_autosummary/axtreme.metrics.rst.txt | 17 + .../_autosummary/axtreme.plotting.doe.rst.txt | 13 + .../axtreme.plotting.gp_fit.rst.txt | 16 + .../axtreme.plotting.histogram3d.rst.txt | 14 + .../_autosummary/axtreme.plotting.rst.txt | 17 + ...eme.qoi.gp_bruteforce.GPBruteForce.rst.txt | 33 + .../axtreme.qoi.gp_bruteforce.rst.txt | 17 + ...apolation.MarginalCDFExtrapolation.rst.txt | 31 + ...eme.qoi.marginal_cdf_extrapolation.rst.txt | 23 + ...eme.qoi.qoi_estimator.QoIEstimator.rst.txt | 26 + .../axtreme.qoi.qoi_estimator.rst.txt | 17 + _sources/_autosummary/axtreme.qoi.rst.txt | 17 + ...axtreme.runner.LocalMetadataRunner.rst.txt | 40 + _sources/_autosummary/axtreme.runner.rst.txt | 17 + ...e.MeanVarPosteriorSampledEstimates.rst.txt | 31 + ...eme.sampling.base.PosteriorSampler.rst.txt | 24 + .../axtreme.sampling.base.rst.txt | 18 + ...ndent_sampler.IndependentMCSampler.rst.txt | 78 + ...treme.sampling.independent_sampler.rst.txt | 22 + ....sampling.mean_sampler.MeanSampler.rst.txt | 24 + .../axtreme.sampling.mean_sampler.rst.txt | 17 + ...t_sampler.NormalIndependentSampler.rst.txt | 78 + ...ampling.normal_independent_sampler.rst.txt | 17 + .../_autosummary/axtreme.sampling.rst.txt | 19 + ...reme.sampling.ut_sampler.UTSampler.rst.txt | 83 + .../axtreme.sampling.ut_sampler.rst.txt | 22 + .../axtreme.simulator.base.Simulator.rst.txt | 24 + .../axtreme.simulator.base.rst.txt | 17 + .../_autosummary/axtreme.simulator.rst.txt | 16 + .../axtreme.simulator.utils.rst.txt | 14 + .../axtreme.utils.distibution_helpers.rst.txt | 14 + .../axtreme.utils.experiment_utils.rst.txt | 13 + .../axtreme.utils.gradient.rst.txt | 13 + .../axtreme.utils.logging.rst.txt | 13 + .../axtreme.utils.model_helpers.rst.txt | 14 + .../axtreme.utils.modelbridge_utils.rst.txt | 13 + .../axtreme.utils.numerical_precision.rst.txt | 13 + ...xtreme.utils.population_estimators.rst.txt | 16 + _sources/_autosummary/axtreme.utils.rst.txt | 23 + .../axtreme.utils.transforms.rst.txt | 19 + _sources/api.rst.txt | 7 + _sources/axtreme.rst.txt | 34 + .../basic_concepts/basic_concepts.rst.txt | 11 + _sources/basic_concepts/doe.md.txt | 11 + _sources/basic_concepts/qoi_estimate.md.txt | 10 + .../basic_concepts/surrogate_model.md.txt | 24 + _sources/getting_started.rst.txt | 16 + _sources/glossary.md.txt | 36 + _sources/index.rst.txt | 32 + _sources/introduction.md.txt | 14 + .../technical_details/ax_integration.md.txt | 9 + .../technical_details/gpbruteforce.md.txt | 22 + .../technical_details.rst.txt | 11 + _sources/usecase_offshorewind.md.txt | 48 + _static/DNV_logo_RGB.jpg | Bin 0 -> 202826 bytes _static/axtreme.svg | 1 + _static/basic.css | 914 ++++++++++ _static/debug.css | 69 + _static/doctools.js | 149 ++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 192 +++ _static/minus.png | Bin 0 -> 90 bytes _static/plot_directive.css | 16 + _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 258 +++ _static/scripts/furo-extensions.js | 0 _static/scripts/furo.js | 3 + _static/scripts/furo.js.LICENSE.txt | 7 + _static/scripts/furo.js.map | 1 + _static/searchtools.js | 632 +++++++ _static/skeleton.css | 296 ++++ _static/sphinx_highlight.js | 154 ++ _static/styles/furo-extensions.css | 2 + _static/styles/furo-extensions.css.map | 1 + _static/styles/furo.css | 2 + _static/styles/furo.css.map | 1 + api.html | 572 +++++++ axtreme.html | 549 ++++++ basic_concepts/basic_concepts.html | 485 ++++++ basic_concepts/doe.html | 475 ++++++ basic_concepts/qoi_estimate.html | 475 ++++++ basic_concepts/surrogate_model.html | 518 ++++++ branch/main/.buildinfo | 4 + branch/main/CHANGELOG.html | 643 +++++++ branch/main/LICENSE.html | 478 ++++++ branch/main/README.html | 788 +++++++++ branch/main/STYLEGUIDE.html | 941 +++++++++++ .../_autosummary/axtreme.acquisition.html | 479 ++++++ ...quisition.qoi_look_ahead.QoILookAhead.html | 781 +++++++++ .../axtreme.acquisition.qoi_look_ahead.html | 708 ++++++++ ...riant_sampler.BatchInvariantSampler2d.html | 581 +++++++ .../axtreme.data.batch_invariant_sampler.html | 515 ++++++ .../axtreme.data.dataset.MinimalDataset.html | 551 ++++++ .../_autosummary/axtreme.data.dataset.html | 480 ++++++ ...ixed_random_sample.FixedRandomSampler.html | 561 +++++++ .../axtreme.data.fixed_random_sample.html | 482 ++++++ branch/main/_autosummary/axtreme.data.html | 497 ++++++ ...rtance_dataset.ImportanceAddedWrapper.html | 524 ++++++ ...rtance_dataset.ImportanceIndexWrapper.html | 529 ++++++ .../axtreme.data.importance_dataset.html | 501 ++++++ ...i_dim_batch_sampler.MultiBatchSampler.html | 563 +++++++ .../axtreme.data.multi_dim_batch_sampler.html | 480 ++++++ ...a.numpy_file_dataset.NumpyFileDataset.html | 586 +++++++ .../axtreme.data.numpy_file_dataset.html | 514 ++++++ ...ntial_sample.SizableSequentialSampler.html | 549 ++++++ ...xtreme.data.sizable_sequential_sample.html | 480 ++++++ .../axtreme.distributions.helpers.html | 579 +++++++ .../_autosummary/axtreme.distributions.html | 490 ++++++ .../axtreme.distributions.icdf.html | 569 +++++++ ...tributions.mixture.ApproximateMixture.html | 749 +++++++++ .../axtreme.distributions.mixture.html | 547 ++++++ .../axtreme.distributions.utils.html | 572 +++++++ branch/main/_autosummary/axtreme.eval.html | 488 ++++++ .../axtreme.eval.object_logging.html | 645 ++++++++ .../axtreme.eval.qoi_helpers.html | 578 +++++++ .../axtreme.eval.qoi_job.QoIJob.html | 565 +++++++ .../axtreme.eval.qoi_job.QoIJobResult.html | 624 +++++++ .../_autosummary/axtreme.eval.qoi_job.html | 483 ++++++ .../main/_autosummary/axtreme.eval.utils.html | 507 ++++++ ...axtreme.evaluation.EvaluationFunction.html | 580 +++++++ ...eme.evaluation.SimulationPointResults.html | 615 +++++++ .../main/_autosummary/axtreme.evaluation.html | 483 ++++++ .../main/_autosummary/axtreme.experiment.html | 690 ++++++++ .../axtreme.metrics.LocalMetadataMetric.html | 603 +++++++ branch/main/_autosummary/axtreme.metrics.html | 480 ++++++ .../_autosummary/axtreme.plotting.doe.html | 529 ++++++ .../_autosummary/axtreme.plotting.gp_fit.html | 585 +++++++ .../axtreme.plotting.histogram3d.html | 558 +++++++ .../main/_autosummary/axtreme.plotting.html | 485 ++++++ ...xtreme.qoi.gp_bruteforce.GPBruteForce.html | 668 ++++++++ .../axtreme.qoi.gp_bruteforce.html | 480 ++++++ branch/main/_autosummary/axtreme.qoi.html | 487 ++++++ ...xtrapolation.MarginalCDFExtrapolation.html | 623 +++++++ ...xtreme.qoi.marginal_cdf_extrapolation.html | 560 +++++++ ...xtreme.qoi.qoi_estimator.QoIEstimator.html | 563 +++++++ .../axtreme.qoi.qoi_estimator.html | 480 ++++++ .../axtreme.runner.LocalMetadataRunner.html | 602 +++++++ branch/main/_autosummary/axtreme.runner.html | 480 ++++++ ...base.MeanVarPosteriorSampledEstimates.html | 628 +++++++ ...xtreme.sampling.base.PosteriorSampler.html | 562 +++++++ .../_autosummary/axtreme.sampling.base.html | 483 ++++++ .../main/_autosummary/axtreme.sampling.html | 492 ++++++ ...ependent_sampler.IndependentMCSampler.html | 748 +++++++++ .../axtreme.sampling.independent_sampler.html | 528 ++++++ ...eme.sampling.mean_sampler.MeanSampler.html | 514 ++++++ .../axtreme.sampling.mean_sampler.html | 480 ++++++ ...dent_sampler.NormalIndependentSampler.html | 681 ++++++++ ...e.sampling.normal_independent_sampler.html | 483 ++++++ ...axtreme.sampling.ut_sampler.UTSampler.html | 778 +++++++++ .../axtreme.sampling.ut_sampler.html | 544 ++++++ .../axtreme.simulator.base.Simulator.html | 513 ++++++ .../_autosummary/axtreme.simulator.base.html | 480 ++++++ .../main/_autosummary/axtreme.simulator.html | 482 ++++++ .../_autosummary/axtreme.simulator.utils.html | 552 ++++++ .../axtreme.utils.distibution_helpers.html | 565 +++++++ .../axtreme.utils.experiment_utils.html | 505 ++++++ .../_autosummary/axtreme.utils.gradient.html | 565 +++++++ branch/main/_autosummary/axtreme.utils.html | 504 ++++++ .../_autosummary/axtreme.utils.logging.html | 520 ++++++ .../axtreme.utils.model_helpers.html | 553 +++++++ .../axtreme.utils.modelbridge_utils.html | 545 ++++++ .../axtreme.utils.numerical_precision.html | 557 +++++++ .../axtreme.utils.population_estimators.html | 625 +++++++ .../axtreme.utils.transforms.html | 710 ++++++++ branch/main/_images/ax_component_diagram.png | Bin 0 -> 65861 bytes branch/main/_images/doe_point.png | Bin 0 -> 60536 bytes branch/main/_images/erd_smoothness.png | Bin 0 -> 39257 bytes .../long_term_response_distribution.png | Bin 0 -> 111056 bytes branch/main/_images/noise_simulator.png | Bin 0 -> 22721 bytes branch/main/_images/qoi_smoothness.png | Bin 0 -> 38383 bytes .../main/_images/simulator_non_gaus_noise.png | Bin 0 -> 31593 bytes .../main/_images/simulator_normal_noise.png | Bin 0 -> 23709 bytes .../surrogate_model_no_uncertainty.png | Bin 0 -> 67774 bytes .../surrogate_model_uncertainty_aware.png | Bin 0 -> 56961 bytes branch/main/_sources/CHANGELOG.md.txt | 2 + branch/main/_sources/LICENSE.md.txt | 3 + branch/main/_sources/README.md.txt | 2 + branch/main/_sources/STYLEGUIDE.md.txt | 2 + ...sition.qoi_look_ahead.QoILookAhead.rst.txt | 80 + ...axtreme.acquisition.qoi_look_ahead.rst.txt | 26 + .../_autosummary/axtreme.acquisition.rst.txt | 15 + ...nt_sampler.BatchInvariantSampler2d.rst.txt | 24 + ...treme.data.batch_invariant_sampler.rst.txt | 17 + ...xtreme.data.dataset.MinimalDataset.rst.txt | 24 + .../_autosummary/axtreme.data.dataset.rst.txt | 17 + ...d_random_sample.FixedRandomSampler.rst.txt | 31 + .../axtreme.data.fixed_random_sample.rst.txt | 17 + ...nce_dataset.ImportanceAddedWrapper.rst.txt | 29 + ...nce_dataset.ImportanceIndexWrapper.rst.txt | 24 + .../axtreme.data.importance_dataset.rst.txt | 18 + ...im_batch_sampler.MultiBatchSampler.rst.txt | 24 + ...treme.data.multi_dim_batch_sampler.rst.txt | 17 + ...umpy_file_dataset.NumpyFileDataset.rst.txt | 24 + .../axtreme.data.numpy_file_dataset.rst.txt | 22 + .../_autosummary/axtreme.data.rst.txt | 21 + ...al_sample.SizableSequentialSampler.rst.txt | 30 + ...eme.data.sizable_sequential_sample.rst.txt | 17 + .../axtreme.distributions.helpers.rst.txt | 15 + .../axtreme.distributions.icdf.rst.txt | 14 + ...butions.mixture.ApproximateMixture.rst.txt | 51 + .../axtreme.distributions.mixture.rst.txt | 22 + .../axtreme.distributions.rst.txt | 18 + .../axtreme.distributions.utils.rst.txt | 15 + .../axtreme.eval.object_logging.rst.txt | 18 + .../axtreme.eval.qoi_helpers.rst.txt | 16 + .../axtreme.eval.qoi_job.QoIJob.rst.txt | 33 + .../axtreme.eval.qoi_job.QoIJobResult.rst.txt | 38 + .../_autosummary/axtreme.eval.qoi_job.rst.txt | 18 + .../_autosummary/axtreme.eval.rst.txt | 18 + .../_autosummary/axtreme.eval.utils.rst.txt | 13 + ...reme.evaluation.EvaluationFunction.rst.txt | 26 + ....evaluation.SimulationPointResults.rst.txt | 32 + .../_autosummary/axtreme.evaluation.rst.txt | 18 + .../_autosummary/axtreme.experiment.rst.txt | 18 + ...xtreme.metrics.LocalMetadataMetric.rst.txt | 44 + .../_autosummary/axtreme.metrics.rst.txt | 17 + .../_autosummary/axtreme.plotting.doe.rst.txt | 13 + .../axtreme.plotting.gp_fit.rst.txt | 16 + .../axtreme.plotting.histogram3d.rst.txt | 14 + .../_autosummary/axtreme.plotting.rst.txt | 17 + ...eme.qoi.gp_bruteforce.GPBruteForce.rst.txt | 33 + .../axtreme.qoi.gp_bruteforce.rst.txt | 17 + ...apolation.MarginalCDFExtrapolation.rst.txt | 31 + ...eme.qoi.marginal_cdf_extrapolation.rst.txt | 23 + ...eme.qoi.qoi_estimator.QoIEstimator.rst.txt | 26 + .../axtreme.qoi.qoi_estimator.rst.txt | 17 + .../_sources/_autosummary/axtreme.qoi.rst.txt | 17 + ...axtreme.runner.LocalMetadataRunner.rst.txt | 40 + .../_autosummary/axtreme.runner.rst.txt | 17 + ...e.MeanVarPosteriorSampledEstimates.rst.txt | 31 + ...eme.sampling.base.PosteriorSampler.rst.txt | 24 + .../axtreme.sampling.base.rst.txt | 18 + ...ndent_sampler.IndependentMCSampler.rst.txt | 78 + ...treme.sampling.independent_sampler.rst.txt | 22 + ....sampling.mean_sampler.MeanSampler.rst.txt | 24 + .../axtreme.sampling.mean_sampler.rst.txt | 17 + ...t_sampler.NormalIndependentSampler.rst.txt | 78 + ...ampling.normal_independent_sampler.rst.txt | 17 + .../_autosummary/axtreme.sampling.rst.txt | 19 + ...reme.sampling.ut_sampler.UTSampler.rst.txt | 83 + .../axtreme.sampling.ut_sampler.rst.txt | 22 + .../axtreme.simulator.base.Simulator.rst.txt | 24 + .../axtreme.simulator.base.rst.txt | 17 + .../_autosummary/axtreme.simulator.rst.txt | 16 + .../axtreme.simulator.utils.rst.txt | 14 + .../axtreme.utils.distibution_helpers.rst.txt | 14 + .../axtreme.utils.experiment_utils.rst.txt | 13 + .../axtreme.utils.gradient.rst.txt | 13 + .../axtreme.utils.logging.rst.txt | 13 + .../axtreme.utils.model_helpers.rst.txt | 14 + .../axtreme.utils.modelbridge_utils.rst.txt | 13 + .../axtreme.utils.numerical_precision.rst.txt | 13 + ...xtreme.utils.population_estimators.rst.txt | 16 + .../_autosummary/axtreme.utils.rst.txt | 23 + .../axtreme.utils.transforms.rst.txt | 19 + branch/main/_sources/api.rst.txt | 7 + branch/main/_sources/axtreme.rst.txt | 34 + .../basic_concepts/basic_concepts.rst.txt | 11 + .../main/_sources/basic_concepts/doe.md.txt | 11 + .../basic_concepts/qoi_estimate.md.txt | 10 + .../basic_concepts/surrogate_model.md.txt | 24 + branch/main/_sources/getting_started.rst.txt | 16 + branch/main/_sources/glossary.md.txt | 36 + branch/main/_sources/index.rst.txt | 31 + branch/main/_sources/introduction.md.txt | 14 + .../technical_details/ax_integration.md.txt | 9 + .../technical_details/gpbruteforce.md.txt | 22 + .../technical_details.rst.txt | 11 + .../main/_sources/usecase_offshorewind.md.txt | 48 + branch/main/_static/DNV_logo_RGB.jpg | Bin 0 -> 202826 bytes branch/main/_static/axtreme.svg | 1 + branch/main/_static/basic.css | 914 ++++++++++ branch/main/_static/debug.css | 69 + branch/main/_static/doctools.js | 149 ++ branch/main/_static/documentation_options.js | 13 + branch/main/_static/file.png | Bin 0 -> 286 bytes branch/main/_static/language_data.js | 192 +++ branch/main/_static/minus.png | Bin 0 -> 90 bytes branch/main/_static/plus.png | Bin 0 -> 90 bytes branch/main/_static/pygments.css | 258 +++ .../main/_static/scripts/furo-extensions.js | 0 branch/main/_static/scripts/furo.js | 3 + .../main/_static/scripts/furo.js.LICENSE.txt | 7 + branch/main/_static/scripts/furo.js.map | 1 + branch/main/_static/searchtools.js | 632 +++++++ branch/main/_static/skeleton.css | 296 ++++ branch/main/_static/sphinx_highlight.js | 154 ++ .../main/_static/styles/furo-extensions.css | 2 + .../_static/styles/furo-extensions.css.map | 1 + branch/main/_static/styles/furo.css | 2 + branch/main/_static/styles/furo.css.map | 1 + branch/main/api.html | 571 +++++++ branch/main/axtreme.html | 548 ++++++ .../main/basic_concepts/basic_concepts.html | 484 ++++++ branch/main/basic_concepts/doe.html | 474 ++++++ branch/main/basic_concepts/qoi_estimate.html | 474 ++++++ .../main/basic_concepts/surrogate_model.html | 517 ++++++ branch/main/genindex.html | 1473 ++++++++++++++++ branch/main/getting_started.html | 499 ++++++ branch/main/glossary.html | 557 +++++++ branch/main/index.html | 643 +++++++ branch/main/introduction.html | 508 ++++++ branch/main/objects.inv | Bin 0 -> 3969 bytes branch/main/py-modindex.html | 774 +++++++++ branch/main/search.html | 464 ++++++ branch/main/searchindex.js | 1 + .../technical_details/ax_integration.html | 477 ++++++ .../main/technical_details/gpbruteforce.html | 512 ++++++ .../technical_details/technical_details.html | 479 ++++++ branch/main/usecase_offshorewind.html | 561 +++++++ genindex.html | 1474 +++++++++++++++++ getting_started.html | 500 ++++++ glossary.html | 558 +++++++ index.html | 638 +++++++ introduction.html | 509 ++++++ objects.inv | Bin 0 -> 3969 bytes py-modindex.html | 775 +++++++++ search.html | 465 ++++++ searchindex.js | 1 + technical_details/ax_integration.html | 478 ++++++ technical_details/gpbruteforce.html | 513 ++++++ technical_details/technical_details.html | 480 ++++++ usecase_offshorewind.html | 562 +++++++ 458 files changed, 121313 insertions(+) create mode 100644 .buildinfo create mode 100644 .nojekyll create mode 100644 CHANGELOG.html create mode 100644 LICENSE.html create mode 100644 README.html create mode 100644 STYLEGUIDE.html create mode 100644 _autosummary/axtreme.acquisition.html create mode 100644 _autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.html create mode 100644 _autosummary/axtreme.acquisition.qoi_look_ahead.html create mode 100644 _autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.html create mode 100644 _autosummary/axtreme.data.batch_invariant_sampler.html create mode 100644 _autosummary/axtreme.data.dataset.MinimalDataset.html create mode 100644 _autosummary/axtreme.data.dataset.html create mode 100644 _autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.html create mode 100644 _autosummary/axtreme.data.fixed_random_sample.html create mode 100644 _autosummary/axtreme.data.html create mode 100644 _autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.html create mode 100644 _autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.html create mode 100644 _autosummary/axtreme.data.importance_dataset.html create mode 100644 _autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.html create mode 100644 _autosummary/axtreme.data.multi_dim_batch_sampler.html create mode 100644 _autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.html create mode 100644 _autosummary/axtreme.data.numpy_file_dataset.html create mode 100644 _autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.html create mode 100644 _autosummary/axtreme.data.sizable_sequential_sample.html create mode 100644 _autosummary/axtreme.distributions.helpers.html create mode 100644 _autosummary/axtreme.distributions.html create mode 100644 _autosummary/axtreme.distributions.icdf.html create mode 100644 _autosummary/axtreme.distributions.mixture.ApproximateMixture.html create mode 100644 _autosummary/axtreme.distributions.mixture.html create mode 100644 _autosummary/axtreme.distributions.utils.html create mode 100644 _autosummary/axtreme.eval.html create mode 100644 _autosummary/axtreme.eval.object_logging.html create mode 100644 _autosummary/axtreme.eval.qoi_helpers.html create mode 100644 _autosummary/axtreme.eval.qoi_job.QoIJob.html create mode 100644 _autosummary/axtreme.eval.qoi_job.QoIJobResult.html create mode 100644 _autosummary/axtreme.eval.qoi_job.html create mode 100644 _autosummary/axtreme.eval.utils.html create mode 100644 _autosummary/axtreme.evaluation.EvaluationFunction.html create mode 100644 _autosummary/axtreme.evaluation.SimulationPointResults.html create mode 100644 _autosummary/axtreme.evaluation.html create mode 100644 _autosummary/axtreme.experiment.html create mode 100644 _autosummary/axtreme.metrics.LocalMetadataMetric.html create mode 100644 _autosummary/axtreme.metrics.html create mode 100644 _autosummary/axtreme.plotting.doe.html create mode 100644 _autosummary/axtreme.plotting.gp_fit.html create mode 100644 _autosummary/axtreme.plotting.histogram3d.html create mode 100644 _autosummary/axtreme.plotting.html create mode 100644 _autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.html create mode 100644 _autosummary/axtreme.qoi.gp_bruteforce.html create mode 100644 _autosummary/axtreme.qoi.html create mode 100644 _autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.html create mode 100644 _autosummary/axtreme.qoi.marginal_cdf_extrapolation.html create mode 100644 _autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.html create mode 100644 _autosummary/axtreme.qoi.qoi_estimator.html create mode 100644 _autosummary/axtreme.runner.LocalMetadataRunner.html create mode 100644 _autosummary/axtreme.runner.html create mode 100644 _autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.html create mode 100644 _autosummary/axtreme.sampling.base.PosteriorSampler.html create mode 100644 _autosummary/axtreme.sampling.base.html create mode 100644 _autosummary/axtreme.sampling.html create mode 100644 _autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.html create mode 100644 _autosummary/axtreme.sampling.independent_sampler.html create mode 100644 _autosummary/axtreme.sampling.mean_sampler.MeanSampler.html create mode 100644 _autosummary/axtreme.sampling.mean_sampler.html create mode 100644 _autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.html create mode 100644 _autosummary/axtreme.sampling.normal_independent_sampler.html create mode 100644 _autosummary/axtreme.sampling.ut_sampler.UTSampler.html create mode 100644 _autosummary/axtreme.sampling.ut_sampler.html create mode 100644 _autosummary/axtreme.simulator.base.Simulator.html create mode 100644 _autosummary/axtreme.simulator.base.html create mode 100644 _autosummary/axtreme.simulator.html create mode 100644 _autosummary/axtreme.simulator.utils.html create mode 100644 _autosummary/axtreme.utils.distibution_helpers.html create mode 100644 _autosummary/axtreme.utils.experiment_utils.html create mode 100644 _autosummary/axtreme.utils.gradient.html create mode 100644 _autosummary/axtreme.utils.html create mode 100644 _autosummary/axtreme.utils.logging.html create mode 100644 _autosummary/axtreme.utils.model_helpers.html create mode 100644 _autosummary/axtreme.utils.modelbridge_utils.html create mode 100644 _autosummary/axtreme.utils.numerical_precision.html create mode 100644 _autosummary/axtreme.utils.population_estimators.html create mode 100644 _autosummary/axtreme.utils.transforms.html create mode 100644 _images/ax_component_diagram.png create mode 100644 _images/doe_point.png create mode 100644 _images/erd_smoothness.png create mode 100644 _images/long_term_response_distribution.png create mode 100644 _images/noise_simulator.png create mode 100644 _images/qoi_smoothness.png create mode 100644 _images/simulator_non_gaus_noise.png create mode 100644 _images/simulator_normal_noise.png create mode 100644 _images/surrogate_model_no_uncertainty.png create mode 100644 _images/surrogate_model_uncertainty_aware.png create mode 100644 _sources/CHANGELOG.md.txt create mode 100644 _sources/LICENSE.md.txt create mode 100644 _sources/README.md.txt create mode 100644 _sources/STYLEGUIDE.md.txt create mode 100644 _sources/_autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.rst.txt create mode 100644 _sources/_autosummary/axtreme.acquisition.qoi_look_ahead.rst.txt create mode 100644 _sources/_autosummary/axtreme.acquisition.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.batch_invariant_sampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.dataset.MinimalDataset.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.dataset.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.fixed_random_sample.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.importance_dataset.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.multi_dim_batch_sampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.numpy_file_dataset.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.data.sizable_sequential_sample.rst.txt create mode 100644 _sources/_autosummary/axtreme.distributions.helpers.rst.txt create mode 100644 _sources/_autosummary/axtreme.distributions.icdf.rst.txt create mode 100644 _sources/_autosummary/axtreme.distributions.mixture.ApproximateMixture.rst.txt create mode 100644 _sources/_autosummary/axtreme.distributions.mixture.rst.txt create mode 100644 _sources/_autosummary/axtreme.distributions.rst.txt create mode 100644 _sources/_autosummary/axtreme.distributions.utils.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.object_logging.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.qoi_helpers.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.qoi_job.QoIJob.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.qoi_job.QoIJobResult.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.qoi_job.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.rst.txt create mode 100644 _sources/_autosummary/axtreme.eval.utils.rst.txt create mode 100644 _sources/_autosummary/axtreme.evaluation.EvaluationFunction.rst.txt create mode 100644 _sources/_autosummary/axtreme.evaluation.SimulationPointResults.rst.txt create mode 100644 _sources/_autosummary/axtreme.evaluation.rst.txt create mode 100644 _sources/_autosummary/axtreme.experiment.rst.txt create mode 100644 _sources/_autosummary/axtreme.metrics.LocalMetadataMetric.rst.txt create mode 100644 _sources/_autosummary/axtreme.metrics.rst.txt create mode 100644 _sources/_autosummary/axtreme.plotting.doe.rst.txt create mode 100644 _sources/_autosummary/axtreme.plotting.gp_fit.rst.txt create mode 100644 _sources/_autosummary/axtreme.plotting.histogram3d.rst.txt create mode 100644 _sources/_autosummary/axtreme.plotting.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.gp_bruteforce.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.qoi_estimator.rst.txt create mode 100644 _sources/_autosummary/axtreme.qoi.rst.txt create mode 100644 _sources/_autosummary/axtreme.runner.LocalMetadataRunner.rst.txt create mode 100644 _sources/_autosummary/axtreme.runner.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.base.PosteriorSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.base.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.independent_sampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.mean_sampler.MeanSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.mean_sampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.normal_independent_sampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.ut_sampler.UTSampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.sampling.ut_sampler.rst.txt create mode 100644 _sources/_autosummary/axtreme.simulator.base.Simulator.rst.txt create mode 100644 _sources/_autosummary/axtreme.simulator.base.rst.txt create mode 100644 _sources/_autosummary/axtreme.simulator.rst.txt create mode 100644 _sources/_autosummary/axtreme.simulator.utils.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.distibution_helpers.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.experiment_utils.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.gradient.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.logging.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.model_helpers.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.modelbridge_utils.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.numerical_precision.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.population_estimators.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.rst.txt create mode 100644 _sources/_autosummary/axtreme.utils.transforms.rst.txt create mode 100644 _sources/api.rst.txt create mode 100644 _sources/axtreme.rst.txt create mode 100644 _sources/basic_concepts/basic_concepts.rst.txt create mode 100644 _sources/basic_concepts/doe.md.txt create mode 100644 _sources/basic_concepts/qoi_estimate.md.txt create mode 100644 _sources/basic_concepts/surrogate_model.md.txt create mode 100644 _sources/getting_started.rst.txt create mode 100644 _sources/glossary.md.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/introduction.md.txt create mode 100644 _sources/technical_details/ax_integration.md.txt create mode 100644 _sources/technical_details/gpbruteforce.md.txt create mode 100644 _sources/technical_details/technical_details.rst.txt create mode 100644 _sources/usecase_offshorewind.md.txt create mode 100644 _static/DNV_logo_RGB.jpg create mode 100644 _static/axtreme.svg create mode 100644 _static/basic.css create mode 100644 _static/debug.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plot_directive.css create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/scripts/furo-extensions.js create mode 100644 _static/scripts/furo.js create mode 100644 _static/scripts/furo.js.LICENSE.txt create mode 100644 _static/scripts/furo.js.map create mode 100644 _static/searchtools.js create mode 100644 _static/skeleton.css create mode 100644 _static/sphinx_highlight.js create mode 100644 _static/styles/furo-extensions.css create mode 100644 _static/styles/furo-extensions.css.map create mode 100644 _static/styles/furo.css create mode 100644 _static/styles/furo.css.map create mode 100644 api.html create mode 100644 axtreme.html create mode 100644 basic_concepts/basic_concepts.html create mode 100644 basic_concepts/doe.html create mode 100644 basic_concepts/qoi_estimate.html create mode 100644 basic_concepts/surrogate_model.html create mode 100644 branch/main/.buildinfo create mode 100644 branch/main/CHANGELOG.html create mode 100644 branch/main/LICENSE.html create mode 100644 branch/main/README.html create mode 100644 branch/main/STYLEGUIDE.html create mode 100644 branch/main/_autosummary/axtreme.acquisition.html create mode 100644 branch/main/_autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.html create mode 100644 branch/main/_autosummary/axtreme.acquisition.qoi_look_ahead.html create mode 100644 branch/main/_autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.html create mode 100644 branch/main/_autosummary/axtreme.data.batch_invariant_sampler.html create mode 100644 branch/main/_autosummary/axtreme.data.dataset.MinimalDataset.html create mode 100644 branch/main/_autosummary/axtreme.data.dataset.html create mode 100644 branch/main/_autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.html create mode 100644 branch/main/_autosummary/axtreme.data.fixed_random_sample.html create mode 100644 branch/main/_autosummary/axtreme.data.html create mode 100644 branch/main/_autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.html create mode 100644 branch/main/_autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.html create mode 100644 branch/main/_autosummary/axtreme.data.importance_dataset.html create mode 100644 branch/main/_autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.html create mode 100644 branch/main/_autosummary/axtreme.data.multi_dim_batch_sampler.html create mode 100644 branch/main/_autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.html create mode 100644 branch/main/_autosummary/axtreme.data.numpy_file_dataset.html create mode 100644 branch/main/_autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.html create mode 100644 branch/main/_autosummary/axtreme.data.sizable_sequential_sample.html create mode 100644 branch/main/_autosummary/axtreme.distributions.helpers.html create mode 100644 branch/main/_autosummary/axtreme.distributions.html create mode 100644 branch/main/_autosummary/axtreme.distributions.icdf.html create mode 100644 branch/main/_autosummary/axtreme.distributions.mixture.ApproximateMixture.html create mode 100644 branch/main/_autosummary/axtreme.distributions.mixture.html create mode 100644 branch/main/_autosummary/axtreme.distributions.utils.html create mode 100644 branch/main/_autosummary/axtreme.eval.html create mode 100644 branch/main/_autosummary/axtreme.eval.object_logging.html create mode 100644 branch/main/_autosummary/axtreme.eval.qoi_helpers.html create mode 100644 branch/main/_autosummary/axtreme.eval.qoi_job.QoIJob.html create mode 100644 branch/main/_autosummary/axtreme.eval.qoi_job.QoIJobResult.html create mode 100644 branch/main/_autosummary/axtreme.eval.qoi_job.html create mode 100644 branch/main/_autosummary/axtreme.eval.utils.html create mode 100644 branch/main/_autosummary/axtreme.evaluation.EvaluationFunction.html create mode 100644 branch/main/_autosummary/axtreme.evaluation.SimulationPointResults.html create mode 100644 branch/main/_autosummary/axtreme.evaluation.html create mode 100644 branch/main/_autosummary/axtreme.experiment.html create mode 100644 branch/main/_autosummary/axtreme.metrics.LocalMetadataMetric.html create mode 100644 branch/main/_autosummary/axtreme.metrics.html create mode 100644 branch/main/_autosummary/axtreme.plotting.doe.html create mode 100644 branch/main/_autosummary/axtreme.plotting.gp_fit.html create mode 100644 branch/main/_autosummary/axtreme.plotting.histogram3d.html create mode 100644 branch/main/_autosummary/axtreme.plotting.html create mode 100644 branch/main/_autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.html create mode 100644 branch/main/_autosummary/axtreme.qoi.gp_bruteforce.html create mode 100644 branch/main/_autosummary/axtreme.qoi.html create mode 100644 branch/main/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.html create mode 100644 branch/main/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.html create mode 100644 branch/main/_autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.html create mode 100644 branch/main/_autosummary/axtreme.qoi.qoi_estimator.html create mode 100644 branch/main/_autosummary/axtreme.runner.LocalMetadataRunner.html create mode 100644 branch/main/_autosummary/axtreme.runner.html create mode 100644 branch/main/_autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.html create mode 100644 branch/main/_autosummary/axtreme.sampling.base.PosteriorSampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.base.html create mode 100644 branch/main/_autosummary/axtreme.sampling.html create mode 100644 branch/main/_autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.independent_sampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.mean_sampler.MeanSampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.mean_sampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.normal_independent_sampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.ut_sampler.UTSampler.html create mode 100644 branch/main/_autosummary/axtreme.sampling.ut_sampler.html create mode 100644 branch/main/_autosummary/axtreme.simulator.base.Simulator.html create mode 100644 branch/main/_autosummary/axtreme.simulator.base.html create mode 100644 branch/main/_autosummary/axtreme.simulator.html create mode 100644 branch/main/_autosummary/axtreme.simulator.utils.html create mode 100644 branch/main/_autosummary/axtreme.utils.distibution_helpers.html create mode 100644 branch/main/_autosummary/axtreme.utils.experiment_utils.html create mode 100644 branch/main/_autosummary/axtreme.utils.gradient.html create mode 100644 branch/main/_autosummary/axtreme.utils.html create mode 100644 branch/main/_autosummary/axtreme.utils.logging.html create mode 100644 branch/main/_autosummary/axtreme.utils.model_helpers.html create mode 100644 branch/main/_autosummary/axtreme.utils.modelbridge_utils.html create mode 100644 branch/main/_autosummary/axtreme.utils.numerical_precision.html create mode 100644 branch/main/_autosummary/axtreme.utils.population_estimators.html create mode 100644 branch/main/_autosummary/axtreme.utils.transforms.html create mode 100644 branch/main/_images/ax_component_diagram.png create mode 100644 branch/main/_images/doe_point.png create mode 100644 branch/main/_images/erd_smoothness.png create mode 100644 branch/main/_images/long_term_response_distribution.png create mode 100644 branch/main/_images/noise_simulator.png create mode 100644 branch/main/_images/qoi_smoothness.png create mode 100644 branch/main/_images/simulator_non_gaus_noise.png create mode 100644 branch/main/_images/simulator_normal_noise.png create mode 100644 branch/main/_images/surrogate_model_no_uncertainty.png create mode 100644 branch/main/_images/surrogate_model_uncertainty_aware.png create mode 100644 branch/main/_sources/CHANGELOG.md.txt create mode 100644 branch/main/_sources/LICENSE.md.txt create mode 100644 branch/main/_sources/README.md.txt create mode 100644 branch/main/_sources/STYLEGUIDE.md.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.acquisition.qoi_look_ahead.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.acquisition.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.batch_invariant_sampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.dataset.MinimalDataset.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.dataset.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.fixed_random_sample.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.importance_dataset.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.multi_dim_batch_sampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.numpy_file_dataset.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.data.sizable_sequential_sample.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.distributions.helpers.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.distributions.icdf.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.distributions.mixture.ApproximateMixture.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.distributions.mixture.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.distributions.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.distributions.utils.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.object_logging.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.qoi_helpers.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.qoi_job.QoIJob.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.qoi_job.QoIJobResult.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.qoi_job.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.eval.utils.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.evaluation.EvaluationFunction.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.evaluation.SimulationPointResults.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.evaluation.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.experiment.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.metrics.LocalMetadataMetric.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.metrics.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.plotting.doe.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.plotting.gp_fit.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.plotting.histogram3d.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.plotting.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.gp_bruteforce.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.qoi_estimator.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.qoi.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.runner.LocalMetadataRunner.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.runner.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.base.PosteriorSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.base.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.independent_sampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.mean_sampler.MeanSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.mean_sampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.normal_independent_sampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.ut_sampler.UTSampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.sampling.ut_sampler.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.simulator.base.Simulator.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.simulator.base.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.simulator.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.simulator.utils.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.distibution_helpers.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.experiment_utils.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.gradient.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.logging.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.model_helpers.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.modelbridge_utils.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.numerical_precision.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.population_estimators.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.rst.txt create mode 100644 branch/main/_sources/_autosummary/axtreme.utils.transforms.rst.txt create mode 100644 branch/main/_sources/api.rst.txt create mode 100644 branch/main/_sources/axtreme.rst.txt create mode 100644 branch/main/_sources/basic_concepts/basic_concepts.rst.txt create mode 100644 branch/main/_sources/basic_concepts/doe.md.txt create mode 100644 branch/main/_sources/basic_concepts/qoi_estimate.md.txt create mode 100644 branch/main/_sources/basic_concepts/surrogate_model.md.txt create mode 100644 branch/main/_sources/getting_started.rst.txt create mode 100644 branch/main/_sources/glossary.md.txt create mode 100644 branch/main/_sources/index.rst.txt create mode 100644 branch/main/_sources/introduction.md.txt create mode 100644 branch/main/_sources/technical_details/ax_integration.md.txt create mode 100644 branch/main/_sources/technical_details/gpbruteforce.md.txt create mode 100644 branch/main/_sources/technical_details/technical_details.rst.txt create mode 100644 branch/main/_sources/usecase_offshorewind.md.txt create mode 100644 branch/main/_static/DNV_logo_RGB.jpg create mode 100644 branch/main/_static/axtreme.svg create mode 100644 branch/main/_static/basic.css create mode 100644 branch/main/_static/debug.css create mode 100644 branch/main/_static/doctools.js create mode 100644 branch/main/_static/documentation_options.js create mode 100644 branch/main/_static/file.png create mode 100644 branch/main/_static/language_data.js create mode 100644 branch/main/_static/minus.png create mode 100644 branch/main/_static/plus.png create mode 100644 branch/main/_static/pygments.css create mode 100644 branch/main/_static/scripts/furo-extensions.js create mode 100644 branch/main/_static/scripts/furo.js create mode 100644 branch/main/_static/scripts/furo.js.LICENSE.txt create mode 100644 branch/main/_static/scripts/furo.js.map create mode 100644 branch/main/_static/searchtools.js create mode 100644 branch/main/_static/skeleton.css create mode 100644 branch/main/_static/sphinx_highlight.js create mode 100644 branch/main/_static/styles/furo-extensions.css create mode 100644 branch/main/_static/styles/furo-extensions.css.map create mode 100644 branch/main/_static/styles/furo.css create mode 100644 branch/main/_static/styles/furo.css.map create mode 100644 branch/main/api.html create mode 100644 branch/main/axtreme.html create mode 100644 branch/main/basic_concepts/basic_concepts.html create mode 100644 branch/main/basic_concepts/doe.html create mode 100644 branch/main/basic_concepts/qoi_estimate.html create mode 100644 branch/main/basic_concepts/surrogate_model.html create mode 100644 branch/main/genindex.html create mode 100644 branch/main/getting_started.html create mode 100644 branch/main/glossary.html create mode 100644 branch/main/index.html create mode 100644 branch/main/introduction.html create mode 100644 branch/main/objects.inv create mode 100644 branch/main/py-modindex.html create mode 100644 branch/main/search.html create mode 100644 branch/main/searchindex.js create mode 100644 branch/main/technical_details/ax_integration.html create mode 100644 branch/main/technical_details/gpbruteforce.html create mode 100644 branch/main/technical_details/technical_details.html create mode 100644 branch/main/usecase_offshorewind.html create mode 100644 genindex.html create mode 100644 getting_started.html create mode 100644 glossary.html create mode 100644 index.html create mode 100644 introduction.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 technical_details/ax_integration.html create mode 100644 technical_details/gpbruteforce.html create mode 100644 technical_details/technical_details.html create mode 100644 usecase_offshorewind.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..366b813d --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 508ad71576e30cdeb1f2af9ce7bf5fc4 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/CHANGELOG.html b/CHANGELOG.html new file mode 100644 index 00000000..cded8891 --- /dev/null +++ b/CHANGELOG.html @@ -0,0 +1,610 @@ + + + + + + + + + Changelog - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Changelog

+

All notable changes to the axtreme project will be documented in this file.
+The changelog format is based on Keep a Changelog.

+
+

Unreleased

+
+
+

0.1.1 - 2024-12-27

+
+

Added:

+

Major addition of new qoi method MarginalCDFExtrapolation. The following helpers are alse added.

+
    +
  • utils/numerical_precision: quantify the precision possible with different datatypes

  • +
  • distributions/mixture: The contains mixture distributions required for marginalisation

  • +
  • distributions/icdf: optimisation methods for finding icdfs where not availab.

  • +
  • Associated test for these pieces of functionality.

  • +
+
+
+

Changed

+
    +
  • tests/qoi/test_gp_brute_force_system.py : Improved type-checking

  • +
  • pyproject.toml:

    +
      +
    • cleaned up and reorganized dependencies

    • +
    • removed orphaned dependency pytest-django

    • +
    +
  • +
  • .pre-commit-config.yaml : updated with latest changes in python_project_template

  • +
  • README.md : updated with latest changes from python_project_template

  • +
  • GitHub workflows _test.yml and _test_future.yml : rewrote how pytest gets called in a cleaner way

  • +
  • eval/object_logging: unpack_object: minor update to support type attributes.

  • +
  • eval/qoi_helpers.py: minor updates to prevent divide by 0 warnings

  • +
  • tutorials/end_to_end_v2.py -> tutorials/basic_example.py. Updated to use MarginalCDFExtrapolation.

  • +
  • data/importance_dataset.py: Updated typing and used torch’s StackedDataset.

  • +
+
+
+

Fixed

+
    +
  • Minor updates to docs.

  • +
+
+
+

Dependencies

+
    +
  • Updated to pyarrow>=18.1 (from pyarrow>=17.0)

  • +
  • Updated to statsmodels>=0.14.4 (from statsmodels>=0.14.2)

  • +
+
+
+
+

0.1.0 - 2024-12-10

+
    +
  • Initial release.

  • +
+
+
+

0.0.1 - 2023-02-21

+
+

Added

+
    +
  • added this

  • +
+
+
+

Changed

+
    +
  • changed that

  • +
+
+
+

Dependencies

+
    +
  • updated to some_package_on_pypi>=0.1.0

  • +
+
+
+

Fixed

+
    +
  • fixed issue #12345

  • +
+
+
+

Deprecated

+
    +
  • following features will soon be removed and have been marked as deprecated:

    +
      +
    • function x in module z

    • +
    +
  • +
+
+
+

Removed

+
    +
  • following features have been removed:

    +
      +
    • function y in module z

    • +
    +
  • +
+ +
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/LICENSE.html b/LICENSE.html new file mode 100644 index 00000000..176d771b --- /dev/null +++ b/LICENSE.html @@ -0,0 +1,479 @@ + + + + + + + + + LICENSE - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

LICENSE

+

MIT License

+

Copyright (c) 2024 DNV open source

+

Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/README.html b/README.html new file mode 100644 index 00000000..0d8d05cc --- /dev/null +++ b/README.html @@ -0,0 +1,789 @@ + + + + + + + + + axtreme - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+

pypi +versions +license +ci +docs

+
+

axtreme

+

Development repo for the RaPiD project with extensions for Ax and BoTorch.

+
+

Repo Structure

+
    +
  • src/: Main package directory

  • +
  • tests/: Test directory

  • +
  • examples/: Examples and demos

  • +
  • tutorials/: Tutorial notebooks

  • +
+
+
+

Development Setup

+
+

1. Install uv

+

This project uses uv as package manager. +If you haven’t already, install uv, preferably using it’s “Standalone installer” method:
+..on Windows:

+
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
+
+
+

..on MacOS and Linux:

+
curl -LsSf https://astral.sh/uv/install.sh | sh
+
+
+

(see docs.astral.sh/uv for all / alternative installation methods.)

+

Once installed, you can update uv to its latest version, anytime, by running:

+
uv self update
+
+
+
+
+

2. Install Python

+

This project requires Python 3.11 or later.
+If you don’t already have a compatible version installed on your machine, the probably most comfortable way to install Python is through uv:

+
uv python install
+
+
+

This will install the latest stable version of Python into the uv Python directory, i.e. as a uv-managed version of Python.

+

Alternatively, and if you want a standalone version of Python on your machine, you can install Python either via winget:

+
winget install --id Python.Python
+
+
+

or you can download and install Python from the python.org website.

+
+
+

3. Clone the repository

+

Clone the axtreme repository into your local development directory:

+
git clone https://github.com/dnv-opensource/axtreme path/to/your/dev/axtreme
+
+
+

Change into the project directory after cloning:

+
cd axtreme
+
+
+
+
+

4. Install dependencies

+

Run uv sync to create a virtual environment and install all project dependencies into it:

+
uv sync
+
+
+
+

Note: Using --no-dev will omit installing development dependencies.

+
+
+

Note: uv will create a new virtual environment called .venv in the project root directory when running +uv sync for the first time. Optionally, you can create your own using e.g. uv venv, before running +uv sync.

+
+
+
+

5. (Optional) Install CUDA support

+

Run uv sync with option --extra cuda to in addition install torch with CUDA support:

+
uv sync --extra cuda
+
+
+
+

Note: The exact version of torch that is installed by default depends on the system you are using. E.g., Linux +will install the CUDA version by default, while Windows and macOS will install the CPU version.

+
+

Alternatively, you can manually install torch with CUDA support. +Note 1: Do this preferably after running uv sync. That way you ensure a virtual environment exists, which is a prerequisite before you install torch with CUDA support using below uv pip install command.

+

To manually install torch with CUDA support, generate a uv pip install command matching your local machine’s operating system using the wizard on the official PyTorch website. +Note: As we use uv as package manager, remember to replace pip in the command generated by the wizard with uv pip.

+

If you are on Windows, the resulting uv pip install command will most likely look something like this:

+
uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
+
+
+

Hint: If you are unsure which cuda version to indicate in above uv pip install .. /cuXXX command, you can use the shell command nvidia-smi on your local system to find out the cuda version supported by the current graphics driver installed on your system. When then generating the uv pip install command with the wizard from the PyTorch website, select the cuda version that matches the major version of what your graphics driver supports (major version must match, minor version may deviate).

+
+
+

6. (Optional) Activate the virtual environment

+

When using uv, there is in almost all cases no longer a need to manually activate the virtual environment.
+uv will find the .venv virtual environment in the working directory or any parent directory, and activate it on the fly whenever you run a command via uv inside your project folder structure:

+
uv run <command>
+
+
+

However, you still can manually activate the virtual environment if needed. +When developing in an IDE, for instance, this can in some cases be necessary depending on your IDE settings. +To manually activate the virtual environment, run one of the “known” legacy commands:
+..on Windows:

+
.venv\Scripts\activate.bat
+
+
+

..on Linux:

+
source .venv/bin/activate
+
+
+
+
+

7. Install pre-commit hooks

+

The .pre-commit-config.yaml file in the project root directory contains a configuration for pre-commit hooks. +To install the pre-commit hooks defined therein in your local git repository, run:

+
uv run pre-commit install
+
+
+

All pre-commit hooks configured in .pre-commit-config.yaml will now run each time you commit changes.

+

pre-commit can also manually be invoked, at anytime, using:

+
uv run pre-commit run --all-files
+
+
+

To skip the pre-commit validation on commits (e.g. when intentionally committing broken code), run:

+
uv run git commit -m <MSG> --no-verify
+
+
+

To update the hooks configured in .pre-commit-config.yaml to their newest versions, run:

+
uv run pre-commit autoupdate
+
+
+
+
+

8. Test that the installation works

+

To test that the installation works, run pytest in the project root folder:

+
uv run pytest
+
+
+

You should now be ready to start developing!

+
+
+
+

Development Tools

+

You should familiarize yourself with the following tools used in this project. The tools can be configured in the pyproject.toml file;

+
    +
  • ruff (linting + formatting)

  • +
  • mypy (static type checking)

  • +
  • pytest (unit testing)

  • +
  • pre-commit (code quality checks and fixes on commit)

  • +
+

A brief overview of the tools is provided below:

+
+

ruff Formatter

+

Format the code according to the formatting rules in the pyproject.toml file:

+
uv run ruff format
+
+
+
+
+

ruff Linter

+

Check the code for issues according to the linting rules in the pyproject.toml file:

+
uv run ruff check
+
+
+

Fix any issues that can be fixed automatically:

+
uv run ruff check --fix
+
+
+
+
+

mypy

+

Perform static type checking on source code:

+
uv run mypy
+
+
+
+
+

pytest

+

Run all tests (with coverage) using:

+
uv run pytest
+
+
+

Generate a coverage report in addition to running the tests:

+
uv run pytest --cov=rapid --cov-branch --cov-report=json --cov-report=term-missing
+
+
+
+
+
+

Documentation

+

See axtreme’s documentation on GitHub pages.

+
+
+

Notes on Design Decisions

+
+

Imports

+

We are breaking this rule, and often import classes etc. This follows the approach taken in packages such as pytorch botorch etc.

+
+

Definition

+

Google code standard suggests:

+
+

“Use import statements for packages and modules only, not for individual types, classes, or functions”

+
+
+
+

pros

+
    +
  • often package with similar names (e.g utils), but the actual method required is clear diferentiated.

  • +
  • Less verbose

  • +
+
+
+

cons

+
    +
  • Breaking some recommended practice, not sure what they impact will be.

  • +
+
+
+
+

Numpy vs. Tensors

+
    +
  • Numpy: Working with ax/in general

  • +
  • Torch: working inside or touching “Botorch Layer”, or anywhere need gpu or grad

  • +
+
+

pros

+
    +
  • If work mostly with tensor need to constantly convert them to numpy when winteracting with ax, plot etc.

  • +
+
+
+

cons

+
    +
  • numpy and tensors have slightly different interfaces

  • +
  • Means we don’t have one default way of working

  • +
+
+
+
+
+

Meta

+

Copyright (c) 2024 DNV AS. All rights reserved.

+

Sebastian Winter - sebastian.winter@dnv.com

+

Kristoffer Skare - kristoffer.skare@dnv.com

+

Magnus Kristiansen - magnus.kristiansen@dnv.com

+

Distributed under the MIT license. See LICENSE for more information.

+

https://github.com/dnv-opensource/axtreme

+
+
+

Contributing

+
    +
  1. Fork it (https://github.com/dnv-opensource/axtreme/fork) (Note: this is currently disabled for this repo. For DNV internal development, continue with the next step.)

  2. +
  3. Create an issue in your GitHub repo

  4. +
  5. Create your branch based on the issue number and type (git checkout -b issue-name)

  6. +
  7. Evaluate and stage the changes you want to commit (git add -i)

  8. +
  9. Commit your changes (git commit -am 'place a descriptive commit message here')

  10. +
  11. Push to the branch (git push origin issue-name)

  12. +
  13. Create a new Pull Request in GitHub

  14. +
+

For your contribution, please make sure you follow the STYLEGUIDE before creating the Pull Request.

+ +
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/STYLEGUIDE.html b/STYLEGUIDE.html new file mode 100644 index 00000000..16da0b77 --- /dev/null +++ b/STYLEGUIDE.html @@ -0,0 +1,942 @@ + + + + + + + + + Style Guide - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Style Guide

+

All code shall be Ruff formatted.

+

References, details as well as examples of bad/good styles and their respective reasoning can be found below.

+
+

References

+ +
+
+

Code Layout

+
    +
  • Use 4 spaces instead of tabs

  • +
  • Maximum line length is 120 characters (not 79 as proposed in PEP-8)

  • +
  • 2 blank lines between classes and functions

  • +
  • 1 blank line within class, between class methods

  • +
  • Use blank lines for logic separation of functionality within functions/methods wherever it is justified

  • +
  • No whitespace adjacent to parentheses, brackets, or braces

  • +
+
    # Bad
+    spam( items[ 1 ], { key1 : arg1, key2 : arg2 }, )
+
+    # Good
+    spam(items[1], {key1: arg1, key2: arg2}, [])
+
+
+
    +
  • Surround operators with single whitespace on either side.

  • +
+
    # Bad
+    x<1
+
+    # Good
+    x == 1
+
+
+
    +
  • Never end your lines with a semicolon, and do not use a semicolon to put two statements on the same line

  • +
  • When branching, always start a new block on a new line

  • +
+
    # Bad
+    if flag: return None
+
+    # Good
+    if flag:
+        return None
+
+
+
    +
  • Similarly to branching, do not write methods on one line in any case:

  • +
+
    # Bad
+    def do_something(self): print("Something")
+
+    # Good
+    def do_something(self):
+        print("Something")
+
+
+
    +
  • Place a class’s __init__ function (the constructor) always at the beginning of the class

  • +
+
+
+

Line Breaks

+
    +
  • If function arguments do not fit into the specified line length, move them to a new line with indentation

  • +
+
    # Bad
+    def long_function_name(var_one, var_two, var_three,
+        var_four):
+        print(var_one)
+
+    # Bad
+    def long_function_name(var_one, var_two, var_three,
+            var_four):
+        print(var_one)
+
+    # Better (but not preferred)
+    def long_function_name(var_one,
+                           var_two,
+                           var_three,
+                           var_four):
+        print(var_one)
+
+    # Good (and preferred)
+    def long_function_name(
+        var_one,
+        var_two,
+        var_three,
+        var_four,
+    ):
+        print(var_one)
+
+
+
    +
  • Move concatenated logical conditions to new lines if the line does not fit the maximum line size. This will help you understand the condition by looking from top to bottom. Poor formatting makes it difficult to read and understand complex predicates.

  • +
+
    # Good
+    if (
+        this_is_one_thing
+        and that_is_another_thing
+        or that_is_third_thing
+        or that_is_yet_another_thing
+        and one_more_thing
+    ):
+        do_something()
+
+
+
    +
  • Where binary operations stretch multiple lines, break lines before the binary operators, not thereafter

  • +
+
    # Bad
+    GDP = (
+        private_consumption +
+        gross_investment +
+        government_investment +
+        government_spending +
+        (exports - imports)
+    )
+
+    # Good
+    GDP = (
+        private_consumption
+        + gross_investment
+        + government_investment
+        + government_spending
+        + (exports - imports)
+    )
+
+
+
    +
  • Chaining methods should be broken up on multiple lines for better readability

  • +
+
    (
+        df.write.format("jdbc")
+        .option("url", "jdbc:postgresql:dbserver")
+        .option("dbtable", "schema.tablename")
+        .option("user", "username")
+        .option("password", "password")
+        .save()
+    )
+
+
+
    +
  • Add a trailing comma to sequences of items when the closing container token ], ), or } does not appear on the same line as the final element

  • +
+
    # Bad
+    y = [
+        0,
+        1,
+        4,
+        6
+    ]
+    z = {
+        'a': 1,
+        'b': 2
+    }
+
+    # Good
+    x = [1, 2, 3]
+
+    # Good
+    y = [
+        0,
+        1,
+        4,
+        6,         <- note the trailing comma
+    ]
+    z = {
+        'a': 1,
+        'b': 2,    <- note the trailing comma
+    }
+
+
+
+
+

String Formatting

+
    +
  • When quoting string literals, use double-quoted strings. When the string itself contains single or double quote characters, however, use the respective other one to avoid backslashes in the string. It improves readability.

  • +
  • Use f-strings to format strings:

  • +
+
    # Bad
+    print("Hello, %s. You are %s years old. You are a %s." % (name, age, profession))
+
+    # Good
+    print(f"Hello, {name}. You are {age} years old. You are a {profession}.")
+
+
+
    +
  • Use multiline strings, not \ , since it gets much more readable.

  • +
+
    raise AttributeError(
+        "Here is a multiline error message with a very long first line "
+        "and a shorter second line."
+    )
+
+
+
+
+

Naming Conventions

+
    +
  • For module names: lowercase . +Long module names can have words separated by underscores (really_long_module_name.py), but this is not required. Try to use the convention of nearby files.

  • +
  • For class names: CamelCase

  • +
  • For methods, functions, variables and attributes: lowercase_with_underscores

  • +
  • For constants: UPPERCASE or UPPERCASE_WITH_UNDERSCORES +(Python does not differentiate between variables and constants. Using UPPERCASE for constants is just a convention, but helps a lot to quickly identify variables meant to serve as constants.)

  • +
  • Implementation-specific private methods and variables will use _single_underscore_prefix

  • +
  • Don’t include the type of a variable in its name. +E.g. use senders instead of sender_list

  • +
  • Names shall be clear about what a variable, class, or function contains or does. If you struggle to come up with a clear name, rethink your architecture: Often, the difficulty in finding a crisp name for something is a hint that separation of responsibilities can be improved. The solution then is less to agree on a name, but to start a round of refactoring: The name you’re seeking often comes naturally then with refactoring to an improved architecture with clear responsibilities. +(see SRP, Single-Responsibilty Principle by Robert C. Martin)

  • +
+
+
+

Named Arguments

+
    +
  • Use named arguments to improve readability and avoid mistakes introduced with future code maintenance

  • +
+
    # Bad
+    urlget("[http://google.com](http://google.com/)", 20)
+
+    # Good
+    urlget("[http://google.com](http://google.com/)", timeout=20)
+
+
+
    +
  • Never use mutable objects as default arguments in Python. If an attribute in a class or a named parameter in a function is of a mutable data type (e.g. a list or dict), never set its default value in the declaration of an object but always set it to None first, and then only later assign the default value in the class’s constructor, or the functions body, respectively. Sounds complicated? If you prefer the shortcut, the examples below are your friend. +If you are interested in the long story including the why‘s, read these discussions on Reddit and Twitter.

  • +
+
    # Bad
+    class Foo:
+        items = []
+
+    # Good
+    class Foo:
+        items = None
+        def __init__(self):
+            self.items = []
+
+
+    # Bad
+    class Foo:
+        def __init__(self, items=[]):
+            self.items = items
+
+    # Good
+    class Foo:
+        def __init__(self, items=None):
+            self.items = items or []
+
+
+    # Bad
+    def some_function(x, y, items=[]):
+        ...
+
+    # Good
+    def some_function(x, y, items=None):
+        items = items or []
+        ...
+
+
+
+
+

Commenting

+
    +
  • First of all, if the code needs comments to clarify its work, you should think about refactoring it. The best comment to code is the code itself.

  • +
  • Describe complex, possibly incomprehensible points and side effects in the comments

  • +
  • Separate # and the comment with one whitespace

  • +
+
    #bad comment
+    # good comment
+
+
+
    +
  • Use inline comments sparsely

  • +
  • Where used, inline comments shall have 2 whitespaces before the # and one whitespace thereafter

  • +
+
    x = y + z  # inline comment
+    str1 = str2 + str3  # another inline comment
+
+
+
    +
  • If a piece of code is poorly understood, mark the piece with a @TODO: tag and your name to support future refactoring:

  • +
+
    def get_ancestors_ids(self):
+        # @TODO: Do a cache reset while saving the category tree. CLAROS, YYYY-MM-DD
+        cache_name = f"{self._meta.model_name}_ancestors_{self.pk}"
+        cached_ids = cache.get(cache_name)
+        if cached_ids:
+            return cached_ids
+
+        ids = [c.pk for c in self.get_ancestors(include_self=True)]
+        cache.set(cache_name, ids, timeout=3600)
+
+        return ids
+
+
+
+
+

Type hints

+
    +
  • Use type hints in function signatures and module-scope variables. This is good documentation and can be used with linters for type checking and error checking. Use them whenever possible.

  • +
  • Use pyi files to type annotate third-party or extension modules.

  • +
+
+
+

Docstrings

+
    +
  • All Docstrings should be written in Numpy format. For a good tutorial on Docstrings, see Documenting Python Code: A Complete Guide

  • +
  • In a Docstring, summarize function/method behavior and document its arguments, return value(s), side effects, exceptions raised, and restrictions

  • +
  • Wrap Docstrings with triple double quotes (“””)

  • +
  • The description of the arguments must be indented

  • +
+
    def some_method(name, print=False):
+        """This function does something
+
+        Parameters
+        ----------
+        name : str
+            The name to use
+        print: bool, optional
+            A flag used to print the name to the console, by default False
+
+        Raises
+        ------
+        KeyError
+            If name is not found
+
+        Returns
+        -------
+        int
+            The return code
+        """
+        ...
+        return 0
+
+
+
+
+

Exceptions

+
    +
  • Raise specific exceptions and catch specific exceptions, such as KeyError, ValueError, etc.

  • +
  • Do not raise or catch just Exception, except in rare cases where this is unavoidable, such as a try/except block on the top-level loop of some long-running process. For a good tutorial on why this matters, see The Most Diabolical Python Antipattern.

  • +
  • Minimize the amount of code in a try/except block. The larger the body of the try, +the more likely that an exception will be raised by a line of code that you didn’t expect to raise an exception.

  • +
+
+
+

Imports

+
    +
  • Avoid creating circular imports by importing modules more specialized than the one you are editing

  • +
  • Relative imports are forbidden (PEP-8 only “highly discourages” them). Where absolutely needed, the from future import absolute_import syntax should be used (see PEP-328)

  • +
  • Never use wildcard imports (from <module> import *). Always be explicit about what you’re importing. Namespaces make code easier to read, so use them.

  • +
  • Break long imports using parentheses and indent by 4 spaces. Include the trailing comma after the last import and place the closing bracket on a separate line

  • +
+
    from my_pkg.utils import (
+        some_utility_method_1,
+        some_utility_method_2,
+        some_utility_method_3,
+        some_utility_method_4,
+        some_utility_method_5,
+    )
+
+
+
    +
  • Imports should be written in the following order, separated by a blank line:

    +
      +
    1. build-in modules

    2. +
    3. third-party modules

    4. +
    5. local application/library specific imports

    6. +
    +
  • +
+
    import logging
+    import os
+    import typing as T
+
+    import pandas as pd
+    import numpy as np
+
+    import axtreme
+    import axtreme.my_module
+    from axtreme.my_module import my_function, MyClass
+
+
+
    +
  • Even if a Python file is intended to be used as executable / script file only, it shall still be importable as a module, and its import should not have any side effects. Its main functionality shall hence be in a main() function, so that the code can be imported as a module for testing or being reused in the future:

  • +
+
    def main():
+        ...
+
+    if __name__ == "__main__":
+        main()
+
+
+
+
+

Unit-tests

+
    +
  • Use pytest as the preferred testing framework.

  • +
  • The name of a test shall clearly express what is being tested.

  • +
  • Each test should preferably check only one specific aspect.

  • +
+
    # Bad
+    def test_smth():
+        result = f()
+        assert isinstance(result, list)
+        assert result[0] == 1
+        assert result[1] == 2
+        assert result[2] == 3
+        assert result[3] == 4
+
+    # Good
+    def test_smth_type():
+        result = f()
+        assert isinstance(result, list), "Result should be list"
+
+    def test_smth_values():
+        result = f()
+        assert set(result) == set(expected), f"Result should be {set(expected)}"
+
+
+
+
+

And finally: It is a bad idea to use

+
    +
  • global variables.

  • +
  • iterators where they can be replaced by vectorized operations.

  • +
  • lambda where it is not required.

  • +
  • map and lambda where it can be replaced by a simple list comprehension.

  • +
  • multiple nested maps and lambdas.

  • +
  • nested functions. They are hard to test and debug.

  • +
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.acquisition.html b/_autosummary/axtreme.acquisition.html new file mode 100644 index 00000000..5c1a742c --- /dev/null +++ b/_autosummary/axtreme.acquisition.html @@ -0,0 +1,480 @@ + + + + + + + + + axtreme.acquisition - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.acquisition

+

Modules

+
+ + + + + + +

qoi_look_ahead

QoILookAhead acquisition function that looks ahead at possible models and optimize according to a quantity of interest.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.html b/_autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.html new file mode 100644 index 00000000..aa8ea8ab --- /dev/null +++ b/_autosummary/axtreme.acquisition.qoi_look_ahead.QoILookAhead.html @@ -0,0 +1,782 @@ + + + + + + + + + QoILookAhead - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

QoILookAhead

+
+
+class axtreme.acquisition.qoi_look_ahead.QoILookAhead(model: SingleTaskGP, qoi_estimator: QoIEstimator, sampler: PosteriorSampler | None = None)
+

Bases: AcquisitionFunction

+

QoILookAhead is a generic acquisition function that estimates the usefulness of a design point.

+

It estimates the usefulness of a design point by:

+
    +
  • Creating a new model(s) (e.g the looking ahead) by including the design point in the training data.

    +
    +

    Note

    +

    The new model condition on the design point, it does not update hyperparameters.

    +
    +
  • +
  • Calculate the QoI with the new model, and find the variance of this distribution.

  • +
+

The design point that results in the lowest variance QoI is considered the most desireable.

+
+
Note on Optimisation:

Optimising the AcquisitionFunction is an important part of the DoE process. The stochasticity and smoothness of +the acquisition function determine what optimisers can be used. This acquisition function has the following +properties with the default setup:

+
+
Smoothness:

QoILookAhead is smooth (twice differentiable) if:

+
    +
  • The model used for instantiation produces smooth outputs.

  • +
  • A sampler produces smooth y values.

  • +
  • The method used to produce y_var estimates is smooth.

  • +
  • The QoIEstimator is smooth with respect to the model (e.g small changes in the model produce smooth +change in the QoIEstimator result.)

  • +
+

The default optimiser assume the QoI may not be smooth, and uses a gradient free optimiser. If your QoI is +smooth these setting should be overridden.

+
+
Stochasticity:

QoILookAhead is deterministic if all the above components are deterministic. +With default settings it is deterministic.

+
+
+
+
+__init__(model: SingleTaskGP, qoi_estimator: QoIEstimator, sampler: PosteriorSampler | None = None) None
+

QoILookAhead acquisition function.

+
+
Parameters:
+
    +
  • model

    A fitted model. Only SingleTaskGP models are currently supported.

    +
      +
    • General GpytorchModel may eventually be supported.

    • +
    +

  • +
  • qoi_estimator – A callable conforming to QoIEstimator protocol.

  • +
  • sampler

    A sampler that is used to sample fantasy observations for each candidate point. +If None, a MeanSampler is used. This then uses the mean of the posterior as the fantasy observation.

    +
    +

    Note

    +

    Sampler choice can effect the stochasticty and smoothness of the acquisition function. See class +docs for details.

    +
    +

  • +
+
+
+
+ +

Methods

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

__init__(model, qoi_estimator[, sampler])

QoILookAhead acquisition function.

add_module(name, module)

Add a child module to the current module.

apply(fn)

Apply fn recursively to every submodule (as returned by .children()) as well as self.

bfloat16()

Casts all floating point parameters and buffers to bfloat16 datatype.

buffers([recurse])

Return an iterator over module buffers.

children()

Return an iterator over immediate children modules.

compile(*args, **kwargs)

Compile this Module's forward using torch.compile().

cpu()

Move all model parameters and buffers to the CPU.

cuda([device])

Move all model parameters and buffers to the GPU.

double()

Casts all floating point parameters and buffers to double datatype.

eval()

Set the module in evaluation mode.

extra_repr()

Set the extra representation of the module.

float()

Casts all floating point parameters and buffers to float datatype.

forward(X)

Forward method for the QoI acquisition function.

get_buffer(target)

Return the buffer given by target if it exists, otherwise throw an error.

get_extra_state()

Return any extra state to include in the module's state_dict.

get_parameter(target)

Return the parameter given by target if it exists, otherwise throw an error.

get_submodule(target)

Return the submodule given by target if it exists, otherwise throw an error.

half()

Casts all floating point parameters and buffers to half datatype.

ipu([device])

Move all model parameters and buffers to the IPU.

load_state_dict(state_dict[, strict, assign])

Copy parameters and buffers from state_dict into this module and its descendants.

lookahead(x_point, y_point, yvar_point)

Performs a single lookahead calculation.

modules()

Return an iterator over all modules in the network.

named_buffers([prefix, recurse, ...])

Return an iterator over module buffers, yielding both the name of the buffer as well as the buffer itself.

named_children()

Return an iterator over immediate children modules, yielding both the name of the module as well as the module itself.

named_modules([memo, prefix, remove_duplicate])

Return an iterator over all modules in the network, yielding both the name of the module as well as the module itself.

named_parameters([prefix, recurse, ...])

Return an iterator over module parameters, yielding both the name of the parameter as well as the parameter itself.

parameters([recurse])

Return an iterator over module parameters.

register_backward_hook(hook)

Register a backward hook on the module.

register_buffer(name, tensor[, persistent])

Add a buffer to the module.

register_forward_hook(hook, *[, prepend, ...])

Register a forward hook on the module.

register_forward_pre_hook(hook, *[, ...])

Register a forward pre-hook on the module.

register_full_backward_hook(hook[, prepend])

Register a backward hook on the module.

register_full_backward_pre_hook(hook[, prepend])

Register a backward pre-hook on the module.

register_load_state_dict_post_hook(hook)

Register a post hook to be run after module's load_state_dict is called.

register_module(name, module)

Alias for add_module().

register_parameter(name, param)

Add a parameter to the module.

register_state_dict_pre_hook(hook)

Register a pre-hook for the state_dict() method.

requires_grad_([requires_grad])

Change if autograd should record operations on parameters in this module.

set_X_pending([X_pending])

Informs the acquisition function about pending design points.

set_extra_state(state)

Set extra state contained in the loaded state_dict.

share_memory()

See torch.Tensor.share_memory_().

state_dict(*args[, destination, prefix, ...])

Return a dictionary containing references to the whole state of the module.

to(*args, **kwargs)

Move and/or cast the parameters and buffers.

to_empty(*, device[, recurse])

Move the parameters and buffers to the specified device without copying storage.

train([mode])

Set the module in training mode.

type(dst_type)

Casts all parameters and buffers to dst_type.

xpu([device])

Move all model parameters and buffers to the XPU.

zero_grad([set_to_none])

Reset gradients of all model parameters.

+
+

Attributes

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

T_destination

call_super_init

dump_patches

training

+
+
+
+forward(X: Tensor) Tensor
+

Forward method for the QoI acquisition function.

+

For each candidate point in x this acquisition function does the following:

+
    +
  • Fantasizes (via the chosen sampler) possible new observations (y) at this candidate point.

  • +
  • Trains a new GP with the additional (x,y_i) pair for each fantasy observation y_i.

  • +
  • Evaluates the qoi_estimator on these new GPs, and reports the variance in the resulting estimates.

  • +
+

This optimization will pick the point that resulted in the lowest mean variance in the QoI estimates.

+
+
Parameters:
+

X – (t_batch, 1, d) input points to evaluate the acquisiton function at.

+
+
Returns:
+

The output of the QoI acquisition function that will be optimized with shape (num_points,).

+
+
+
+

Todo

+
    +
  • This should be updated to use the FantasizeMixin. This is the botorch interface indicating +model.fantasize(X) is supported, which does a large chunk of the functionality below. The challenge is +model.fantasize(X) adds an additonal dimension at the start of all posteriors calculated e.g. +(num_fantasies, batch_shape, n, m). Unclear if our QoI methods can handle/respect the num_fantasies +dimension, of if the different fantasy models can easily be extracted. Revisit at a future date.

  • +
  • Consider making the jobs batchable or multiprocessed.

  • +
+
+
+ +
+
+lookahead(x_point: Tensor, y_point: Tensor, yvar_point: Tensor | None) Tensor
+

Performs a single lookahead calculation.

+

Adds a single additional datapoint to the GP, and determines the QoI with the new GP.

+
+
Parameters:
+
    +
  • x_point – (d,) The x location of the new point

  • +
  • y_point – (m,) The y (target) of the new point

  • +
  • yvar_point – (m,) The y_var of the new point

  • +
+
+
Returns:
+

(,) Variance of the QoI with the lookahead GP

+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.acquisition.qoi_look_ahead.html b/_autosummary/axtreme.acquisition.qoi_look_ahead.html new file mode 100644 index 00000000..509757d1 --- /dev/null +++ b/_autosummary/axtreme.acquisition.qoi_look_ahead.html @@ -0,0 +1,709 @@ + + + + + + + + + axtreme.acquisition.qoi_look_ahead - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.acquisition.qoi_look_ahead

+

QoILookAhead acquisition function that looks ahead at possible models and optimize according to a quantity of interest.

+

Functions

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

average_observational_noise(new_points, ...)

Return the average observational noise.

closest_observational_noise(new_points, ...)

Find the closest point in a training dataset, and collect its observational noise.

conditional_update(model, X, Y, ...)

A wrapper around BatchedMultiOutputGPyTorchModel.condition_on_observations with a number of safety checks.

construct_inputs_qoi_look_ahead(model, ...)

This is how default arguments for acquisition functions are handled in Ax/Botorch.

reject_if_batched_model(model)

Helper function to reject batched model in code where they are not yet supported.

+
+

Classes

+
+ + + + + + +

QoILookAhead(model, qoi_estimator[, sampler])

QoILookAhead is a generic acquisition function that estimates the usefulness of a design point.

+
+
+
+axtreme.acquisition.qoi_look_ahead.average_observational_noise(new_points: Tensor, train_x: Tensor | None, train_yvar: Tensor) Tensor
+

Return the average observational noise.

+
+
Parameters:
+
    +
  • new_points – (n, d) The points to produce observational_noise.

  • +
  • train_x – (n’,d). This is not used, but is kept to keep a consistent function signature

  • +
  • train_yvar – (n’,m) The observational variance associated with each point.

  • +
+
+
Returns:
+

(n,m) Tensor with the variance for each of the new_points.

+
+
+

Details: +This function is useful for Non-Batched SingleTaskGPs because they will always have arguments of these dimension.

+
+

Warning

+

Certain pattern of homoskedasticity cause this method to perform poorly, causing the acquisition function to +recommend suboptimal points (as compared to closest_observational_noise). The trade off is derivative based +optimisation techniques can be used. See Issue #213 for details.

+
+
+ +
+
+axtreme.acquisition.qoi_look_ahead.closest_observational_noise(new_points: Tensor, train_x: Tensor, train_yvar: Tensor) Tensor
+

Find the closest point in a training dataset, and collect its observational noise.

+
+
Parameters:
+
    +
  • new_points – (n, d) The points to produce observational_noise. Features should be normalise to [0,1] square.

  • +
  • train_x – (n’,d) The points to compare similarity to. Features should be normalise to [0,1] square.

  • +
  • train_yvar – (n’,m) The observational variance associated with each point.

  • +
+
+
Returns:
+

(n,m) Tensor with the variance for each of the new_points.

+
+
+

Details: +This function is useful for Non-Batched SingleTaskGPs because they will always have arguments of these dimension.

+
+

Warning

+

This function is not smooth, meaning optimizers that use gradient (1st or 2nd order derivatives) such as +L-BFGS-B will not work. The trade off is it is more robust to the effect of patterns in yvar than +average_observational_noise . See Issue #213 for details.

+
+
+ +
+
+axtreme.acquisition.qoi_look_ahead.conditional_update(model: Model, X: Tensor, Y: Tensor, observation_noise: Tensor | None) Model
+

A wrapper around BatchedMultiOutputGPyTorchModel.condition_on_observations with a number of safety checks.

+

This function adds an additional datapoint to the model, preserving the dimension of the original model. Does not +changing any of the models hyperparameters. This is like training a new SingleTaskGP with all the datapoints +(Hyperparameters are not fit in SingleTaskGP).

+
+
Parameters:
+
    +
  • model (Model) – The model to update.

  • +
  • X

    As per condition_on_observations. Shape (*b, n’, d).

    +
    +

    Note

    +

    condition_on_observations expects this to be in the “model” space. It will not be +transformed by the input_transform on the model.

    +
    +

  • +
  • Y

    As per condition_on_observations. Shape (*b, n’, m).

    +
    +

    Note

    +

    condition_on_observations expects this to be in the “output/problem” space (not model space). +It will be transformed by the output_transform on the model.

    +
    +

  • +
  • observation_noise (torch.Tensor | None) –

    Used as the noise argument in condition_on_observations. Shape +should match Y (*b, n’, m).

    +
    +

    Note

    +

    condition_on_observations expects this to be in the “model” space. It will not be +transformed by the output_transform on the model.

    +
    +

  • +
+
+
Returns:
+

    +
  • GP with the same underlying structure, including the new points, and the same original number of dimensions.

  • +
+

+
+
+
+
Developer Note:

There are different ways to create a fantasy model. The following were considered:

+
    +
  • BatchedMultiOutputGPyTorchModel.condition_on_observations: well documented interface producing a GP of +the same format.

  • +
  • model.get_fantasy_model: This is a Gpytorch implementation. Interface uses different notation, and +input shape need to be manually adjusted depending on the model.

  • +
  • model.fantasize: This method would be very convient for our wider purpose, but its posteriors is of shape +(num_fantasies, batch_shape, n, m). Unclear if our QoI methods can handle/respect the num_fantasies dim.

  • +
+

Revisit this at a later date.

+
+
+
+ +
+
+axtreme.acquisition.qoi_look_ahead.construct_inputs_qoi_look_ahead(model: SingleTaskGP, qoi_estimator: QoIEstimator, sampler: PosteriorSampler, **_: dict[str, Any]) dict[str, Any]
+

This is how default arguments for acquisition functions are handled in Ax/Botorch.

+
+
Context

When Ax.BOTORCH gets instantiated, construction arguments for the acquisition function can be provided. +These are passed through Ax as a set of Kwargs

+
+
+
+
Parameters:
+

defaults. (This function takes a subset of the acquisition functions __init__() args and can add)

+
+
Returns:
+

Args for the Botorch acquisition function __init__() (output).

+
+
+
+

Note

+

This functionality allows Ax to pass generic arguments without needing to know which acquisition function they +will be passed to. Interestingly, this functionality is provided by the BoTorch package, even though it seems +like it should be the responsibility of Ax. This issue is discussed in detail here: GitHub discussion.

+
+
+ +
+
+axtreme.acquisition.qoi_look_ahead.reject_if_batched_model(model: SingleTaskGP) None
+

Helper function to reject batched model in code where they are not yet supported.

+
+
Parameters:
+

model – The model to check

+
+
Returns:
+

Raise not yet implements in model is batched. Otherwise None.

+
+
+
+
Details:

botorch models can have batched training data, and or batched.

+
    +
  • gp batch prediction (non-batched model):

    +
      +
    • train_x = (n,d) # This is a single GP

    • +
    • train_y = (n,m)

    • +
    • predicting_x = (b,n’,d)

    • +
    • result will be: (b, n’,m).

      +
        +
      • There are b seperate joint distribution (each with n points, a t targets)

      • +
      +
    • +
    +
  • +
  • batched gps model:

    +
      +
    • train_x = (b_gp,n,d)

    • +
    • train_y = (b_gp,n,m)

      +
        +
      • b_gp seperate GPs, where each GP gets all its own hyperparams etc trained on (n,d) point.

      • +
      +
    • +
    • prediciton_x = (n’,d)

    • +
    • result will be: (b_gp, n’,m).

      +
        +
      • Each of the seperate b_gp gps makes its own estimate of the joint distribution.

      • +
      +
    • +
    +
  • +
+

More details: BoTorch batching

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.html b/_autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.html new file mode 100644 index 00000000..d158fdaa --- /dev/null +++ b/_autosummary/axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d.html @@ -0,0 +1,582 @@ + + + + + + + + + BatchInvariantSampler2d - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

BatchInvariantSampler2d

+
+
+class axtreme.data.batch_invariant_sampler.BatchInvariantSampler2d(sampler: Sampler[int] | Iterable[int], batch_shape: Size)
+

Bases: Sampler[list[list[int]]]

+

Returns 2d batchs where the final dataset in invariant to changes in the last batch dimension.

+
+
The standard BatchSampler
    +
  • has 1 row that it batches in sizes b.

  • +
  • returns items of shape (1) * b

  • +
+
+
This BatchSampler has:
    +
  • n rows that are batched in size b.

  • +
  • returns batches of n * b

  • +
+
+
+

Importantly, the concatenated batches (along the last dimension) will alway the same 2d matrix, +regardless of the bach size.

+

Examples

+
>>> Conceptually the full dataset might have the following indexs
+[[ 1, 3, 5]
+ [ 2, 4, 6]]
+
+
+
>>> If batched along index = -1, with batch size 2 will return results as follows
+b1= [[1,3],   b2= [[5],
+     [2,4]]]       [6]]
+
+
+
>>> concat([b1, b2], axis=-1)
+[[ 1, 3, 5]
+ [ 2, 4, 6]]
+
+
+

This is important when the final dataset produced should be invariate to changes in b.

+
+

Note

+
    +
  • The final batch can return a partial batch (n rows, less than b columns)

  • +
  • Related to issue #76

  • +
+
+
+

Todo

+
+
This is a very specific case because its cater to general case.
    +
  • Can we make a more general 2d case? The batched dim needs to be filled last. +Any aggregation is then expected on the batch dim

  • +
  • Can we make a general higher dim case?

  • +
  • +
    Should we just take multiple samplers and batch them in parallel?
      +
    • Pro: Might be cleaner conceptually

    • +
    • Con: When we treat as a dataset we want to get through all data before we start repeating data

    • +
    +
    +
    +
  • +
+
+
+
+
+
+__init__(sampler: Sampler[int] | Iterable[int], batch_shape: Size) None
+

Will produce batch (along the rows) of a 2d batch.

+
+
Parameters:
+
    +
  • sampler (Sampler[int] | Iterable[int]) – Sampler (e.g RandomSampler or SerquentialSampler) to be batched. +- Must be Sized (e.g have __len__) +- See torch DataLoader implmentation for an examples

  • +
  • batch_shape (torch.Size) – The batch shape created of the underlieing sample.

  • +
+
+
+
+ +

Methods

+
+ + + + + + +

__init__(sampler, batch_shape)

Will produce batch (along the rows) of a 2d batch.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.batch_invariant_sampler.html b/_autosummary/axtreme.data.batch_invariant_sampler.html new file mode 100644 index 00000000..0c0bb492 --- /dev/null +++ b/_autosummary/axtreme.data.batch_invariant_sampler.html @@ -0,0 +1,516 @@ + + + + + + + + + axtreme.data.batch_invariant_sampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.batch_invariant_sampler

+

Contains samplers where the total dataset procuded is not effect by the size of the batch dimension used.

+

Batch invariance in 1d. +This can be achieved using the standard BatchSampler, for example:

+
>>> from torch.utils.data import BatchSampler
+>>> data = [1, 2, 3, 4, 5]
+>>> list(BatchSampler(data, batch_size=3, drop_last=False))
+[1, 2, 3], [4, 5, 6]]
+>>> list(BatchSampler(data, batch_size=2, drop_last=False))
+[[1, 2], [3, 4], [5]]
+
+
+

Regardless of batch size, these results can be concatenated along the batch dimension to prodcude the same result.

+

Batch invariance in 2d:

+
>>> data = [1, 2, 3, 4, 5, 6]
+We want to turn things into a 2d dataset, where the dimension being batched along (e.g rows) does not effect the
+final data produced. This will not be the case with MultiBatchSampler:
+
+
+
>>> list(MultiBatchSampler(data, batch_shape=torch.Size([2, 3])))
+[[
+    [1, 2, 3],
+    [4, 5, 6]
+]]
+>>> b1, b2, b3 = list(MultiBatchSampler(data, batch_shape=torch.Size([2, 1])))
+>>> print(f"{b1=},{b2=},{b3=})
+b1= [[1], b2= [[3], b3= [[5],
+     [2]]      [4]]      [6]]
+>>>  concat([b1,b2,b3], axis = -1)
+[[ 1, 3, 5]
+ [ 2, 4, 6]]
+
+
+

The datasets produced will put data in different location based on the batch shape. +This is aproblem if you will be aggrgating (e.g over rows), and were expecting the batches to be invariant over that +dimension.

+

Provide invariante batching in a specific dimension.

+

Classes

+
+ + + + + + +

BatchInvariantSampler2d(sampler, batch_shape)

Returns 2d batchs where the final dataset in invariant to changes in the last batch dimension.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.dataset.MinimalDataset.html b/_autosummary/axtreme.data.dataset.MinimalDataset.html new file mode 100644 index 00000000..dc66bf8a --- /dev/null +++ b/_autosummary/axtreme.data.dataset.MinimalDataset.html @@ -0,0 +1,552 @@ + + + + + + + + + MinimalDataset - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

MinimalDataset

+
+
+class axtreme.data.dataset.MinimalDataset(data: Sequence[T] | T)
+

Bases: Dataset[T]

+

Creates a Dataset over a list-like data source.

+
+

Note

+

list, np.array or tensor forfill the __getitem__ and __len__ requirement directly - but this makes +them conform with the __add__ behaviour defined for datasets.

+
+
+
+__init__(data: Sequence[T] | T) None
+

Creates a Dataset over a list-like data source.

+
+
Parameters:
+
    +
  • data – Supports being indexed (supports __getitem__) and len, where index values are considered datapoints.

  • +
  • e.g (-)

  • +
  • DataLoader. (- Datapoints should be compatible with) –

      +
    • General work with numerics and matrixes

    • +
    • Specifics of what DataLoader consume from datasets see torch._utils.collate.default_collate

    • +
    +

  • +
+
+
+

Examples

+
>>> data = [1, 2, 3]
+>>> ds = MinimalDataset(data)
+>>> ds[0]
+1
+
+
+
>>> data = np.array([[1, 2, 3], [4, 5, 6]])
+>>> ds = MinimalDataset(data)
+>>> ds[0]
+1p.array([1,2,3])
+
+
+
>>> data = torch.tensor([[1], [2]])
+>>> ds = MinimalDataset(data)
+>>> ds[0]
+torch.tensor([1])
+
+
+
+ +

Methods

+
+ + + + + + +

__init__(data)

Creates a Dataset over a list-like data source.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.dataset.html b/_autosummary/axtreme.data.dataset.html new file mode 100644 index 00000000..6a44f212 --- /dev/null +++ b/_autosummary/axtreme.data.dataset.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.data.dataset - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.dataset

+

Contains objects and helpers for creating data unit testing.

+

Classes

+
+ + + + + + +

MinimalDataset(data)

Creates a Dataset over a list-like data source.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.html b/_autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.html new file mode 100644 index 00000000..e0261ef2 --- /dev/null +++ b/_autosummary/axtreme.data.fixed_random_sample.FixedRandomSampler.html @@ -0,0 +1,562 @@ + + + + + + + + + FixedRandomSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

FixedRandomSampler

+
+
+class axtreme.data.fixed_random_sample.FixedRandomSampler(data_source: Sized, num_samples: int | None = None, seed: int | None = None, *, replacement: bool = False)
+

Bases: Sampler[int]

+

Samples elements randomly.

+

This sampler differs from torch’s RandomSampler as it will return the same random sample each time it is +iterated in full. If without replacement, then sample from a shuffled dataset. If with replacement, then user can +specify num_samples to draw.

+
+
+__init__(data_source: Sized, num_samples: int | None = None, seed: int | None = None, *, replacement: bool = False) None
+

Initalise the sampler.

+
+
Parameters:
+
    +
  • data_source – dataset to sample from

  • +
  • replacement – samples are drawn on-demand with replacement if True, default=``False``

  • +
  • num_samples – number of samples to draw, default=`len(dataset)`.

  • +
  • seed – seed for the random number generator, if None one will be allocated randomly.

  • +
+
+
+
+ +

Methods

+
+ + + + + + +

__init__(data_source[, num_samples, seed, ...])

Initalise the sampler.

+
+

Attributes

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

num_samples

data_source

replacement

+
+
+
+data_source: Sized
+
+ +
+
+property num_samples: int
+
+ +
+
+replacement: bool
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.fixed_random_sample.html b/_autosummary/axtreme.data.fixed_random_sample.html new file mode 100644 index 00000000..dafb2eb3 --- /dev/null +++ b/_autosummary/axtreme.data.fixed_random_sample.html @@ -0,0 +1,483 @@ + + + + + + + + + axtreme.data.fixed_random_sample - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.fixed_random_sample

+

A copy of pytorch’s RandomSampler that uses the same random sample for each iteration.

+

This is basically an identical copy, except the Generator has been swapped for a seed, which creates the same generator +each time the samples are iterated through (e.g the DataLoader is run to completion).

+

Classes

+
+ + + + + + +

FixedRandomSampler(data_source[, ...])

Samples elements randomly.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.html b/_autosummary/axtreme.data.html new file mode 100644 index 00000000..6cc17984 --- /dev/null +++ b/_autosummary/axtreme.data.html @@ -0,0 +1,498 @@ + + + + + + + + + axtreme.data - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data

+

Modules

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

batch_invariant_sampler

Contains samplers where the total dataset procuded is not effect by the size of the batch dimension used.

dataset

Contains objects and helpers for creating data unit testing.

fixed_random_sample

A copy of pytorch's RandomSampler that uses the same random sample for each iteration.

importance_dataset

Dataset that return importance sample information in the form (data, importance_weight).

multi_dim_batch_sampler

Allows retuning batches of data of an arbitrary dimension.

numpy_file_dataset

Datasets to help work with numpy files (.npy).

sizable_sequential_sample

Sequential sampling.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.html b/_autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.html new file mode 100644 index 00000000..8daf6af8 --- /dev/null +++ b/_autosummary/axtreme.data.importance_dataset.ImportanceAddedWrapper.html @@ -0,0 +1,525 @@ + + + + + + + + + ImportanceAddedWrapper - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

ImportanceAddedWrapper

+
+
+class axtreme.data.importance_dataset.ImportanceAddedWrapper(data_dataset: Dataset[T_co], importance_dataset: Dataset[T_co])
+

Bases: StackDataset[Tuple[T_co, …]]

+

Thin wrapper makes the method for creating the dataset more explicit, and ensure order and type of output.

+
+
+__init__(data_dataset: Dataset[T_co], importance_dataset: Dataset[T_co]) None
+

Ensures the StackDataset is created as a tuple regardless of the way args are passed.

+
+ +

Methods

+
+ + + + + + +

__init__(data_dataset, importance_dataset)

Ensures the StackDataset is created as a tuple regardless of the way args are passed.

+
+

Attributes

+
+ + + + + + +

datasets

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.html b/_autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.html new file mode 100644 index 00000000..4a2cd55c --- /dev/null +++ b/_autosummary/axtreme.data.importance_dataset.ImportanceIndexWrapper.html @@ -0,0 +1,530 @@ + + + + + + + + + ImportanceIndexWrapper - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

ImportanceIndexWrapper

+
+
+class axtreme.data.importance_dataset.ImportanceIndexWrapper(dataset: Dataset[T_np_interface], importance_idx: int)
+

Bases: Dataset[tuple[T_np_interface, float]]

+

Wraps an existing dataset, returning a column/index of the item as the importance weight.

+
+
+__init__(dataset: Dataset[T_np_interface], importance_idx: int) None
+

Wrap an existing dataset, returning part of the item as the importance weight.

+
+
Parameters:
+
    +
  • dataset – A dataset, where one of the columns should be used as an importance weight. +- Note: Currently only datasets that return numpy or torch tensors are supported

  • +
  • importance_idx – the column index containing the importance weights.

  • +
+
+
+
+

Todo

+
    +
  • Generalise this to deal with other types of dataset output (list, numpy etc).

  • +
+
+
+ +

Methods

+
+ + + + + + +

__init__(dataset, importance_idx)

Wrap an existing dataset, returning part of the item as the importance weight.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.importance_dataset.html b/_autosummary/axtreme.data.importance_dataset.html new file mode 100644 index 00000000..ee54baf8 --- /dev/null +++ b/_autosummary/axtreme.data.importance_dataset.html @@ -0,0 +1,502 @@ + + + + + + + + + axtreme.data.importance_dataset - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.importance_dataset

+

Dataset that return importance sample information in the form (data, importance_weight).

+
+
Dev details:

Datasets can return a variety of things when __get_item__ is called, for example: +- Tuples +- Dicts

+

The dataloader will respect objects like dict and tuple, and will convert float/int/list/numpy content into +tensors as it is assumed to be data. +- By default done by collate_fn arg of Dataloader. +- For defaults see torch.utils.data._utils.collate.default_collate

+

While this is straight forward to implement, typing can be a challenge (torch.utils.data.Dataset provides some +guidances, but appears they found it challenging too).

+
+
+
+

Todo

+
    +
  • Revisit the typing and the implications of covariate/contravariant etc.

  • +
+
+

Classes

+
+ + + + + + + + + +

ImportanceAddedWrapper(data_dataset, ...)

Thin wrapper makes the method for creating the dataset more explicit, and ensure order and type of output.

ImportanceIndexWrapper(dataset, importance_idx)

Wraps an existing dataset, returning a column/index of the item as the importance weight.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.html b/_autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.html new file mode 100644 index 00000000..d546957d --- /dev/null +++ b/_autosummary/axtreme.data.multi_dim_batch_sampler.MultiBatchSampler.html @@ -0,0 +1,564 @@ + + + + + + + + + MultiBatchSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

MultiBatchSampler

+
+
+class axtreme.data.multi_dim_batch_sampler.MultiBatchSampler(sampler: Sampler[int] | Iterable[int], batch_shape: Size, partial_batch_dim: None | int = -1)
+

Bases: Sampler[list[int]]

+

Reads the entire sampler into batches of shape batch_shape.

+

The final batch may not have enough samples to completely fill the batch shape. Behaviour is then as follows:

+
    +
  • +
    If partial_batch_dim is not None, attempt to batch samples allowing this dim to be variable in size. E.g:
    >>> batch_shape = torch.Size([3, 5])
    +>>> partial_batch_index = -1
    +try: remaining_samples.view([3,-1])
    +
    +
    +
    +
    +
  • +
+

This check is performed up front and the sampler will throw and error.

+
+

Warning

+
    +
  • If the batch shape changes, even in the partial_batch_index dimension, data will be returned in a different +order.

  • +
  • See BatchSampler2d for details.

  • +
+
+
+

Todo

+
    +
  • Determing the right approach for handling partial batch that requires more than one parital index. +e.g fit 5 items into batch_shape = torch.Size([3,2])

  • +
  • Perhaps return a new batch that is no bigger than the original in any dimension. This batcher is likely +for gp throughput, so then the batches only have performance not logical meaning.

  • +
+
+
+
+__init__(sampler: Sampler[int] | Iterable[int], batch_shape: Size, partial_batch_dim: None | int = -1) None
+

Allows you to produces batchs of arbitrary shape.

+
+
Parameters:
+
    +
  • sampler (Sampler[int] | Iterable[int]) –

    Sampler (e.g RandomSampler or SerquentialSampler).

    +
      +
    • See torch DataLoader implementation for an examples

    • +
    +

  • +
  • batch_shape (torch.Size) – The batch shape created of the underling sample.

  • +
  • partial_batch_dim

    Dimension of the batch that can be partially filled if there is not enough samples in +sampler.

    +
      +
    • Currently only one dimension can be partially filled

    • +
    • if None, no dimension is allowed to be partially filled

    • +
    +

  • +
+
+
+
+ +

Methods

+
+ + + + + + +

__init__(sampler, batch_shape[, ...])

Allows you to produces batchs of arbitrary shape.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.multi_dim_batch_sampler.html b/_autosummary/axtreme.data.multi_dim_batch_sampler.html new file mode 100644 index 00000000..577216f2 --- /dev/null +++ b/_autosummary/axtreme.data.multi_dim_batch_sampler.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.data.multi_dim_batch_sampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.multi_dim_batch_sampler

+

Allows retuning batches of data of an arbitrary dimension.

+

Classes

+
+ + + + + + +

MultiBatchSampler(sampler, batch_shape[, ...])

Reads the entire sampler into batches of shape batch_shape.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.html b/_autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.html new file mode 100644 index 00000000..2a8f6601 --- /dev/null +++ b/_autosummary/axtreme.data.numpy_file_dataset.NumpyFileDataset.html @@ -0,0 +1,587 @@ + + + + + + + + + NumpyFileDataset - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

NumpyFileDataset

+
+
+class axtreme.data.numpy_file_dataset.NumpyFileDataset(root_dir: str | Path)
+

Bases: Dataset[Tensor]

+

Helper to work with directories of .npy data.

+
+

Note

+
    +
  • Highly recommened to use an in memory dataset if possible. This is typically a bottleneck.

  • +
  • +
    Using with a sequential sampler will be significantly faster because this performs rudimental cacheing.
      +
    • Random sampling will require from disk read for EVERY datapoint. Suggest randomise the save files.

    • +
    +
    +
    +
  • +
+
+
+
Assumes:
    +
  • Each row is a data point

  • +
  • Each file has the same number of datapoints within it.

  • +
+
+
Dev:
+
+
+
+

Todo

+
    +
  • +
    This is slow compared to reading from memory. 100k dataset (3ms for memory, 20s with this dataloader)
      +
    • This is because EVERY SINGLE datapoint requireds a new read from disk.

    • +
    • +
      TODO: Consider different file types that might be more appropriate (row specfic access)
        +
      • HDF5?

      • +
      +
      +
      +
    • +
    • +
      TODO: consider intergration with an imporance weight
        +
      • Look at the example with images, can return many things

      • +
      • npz allows you to combine multiple arrays, could have soem logic if other array none, no imporance.

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+
+
+
Answered:
    +
  • +
    Is Sampler a more approapriate way of framing this?
      +
    • No. The samples class just take an existing dataset and shuffles it. Like shuffle in dataloader.

    • +
    +
    +
    +
  • +
+
+
+
+
+__init__(root_dir: str | Path) None
+

Initialise the Dataset.

+
+

Note

+

Data should be loaded lazily (in __getitem__, not here)

+
+
+
Parameters:
+

root_dir (string) – Directory with .npy files

+
+
+
+ +

Methods

+
+ + + + + + +

__init__(root_dir)

Initialise the Dataset.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.numpy_file_dataset.html b/_autosummary/axtreme.data.numpy_file_dataset.html new file mode 100644 index 00000000..7cf6abf2 --- /dev/null +++ b/_autosummary/axtreme.data.numpy_file_dataset.html @@ -0,0 +1,515 @@ + + + + + + + + + axtreme.data.numpy_file_dataset - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.numpy_file_dataset

+

Datasets to help work with numpy files (.npy).

+

Functions

+
+ + + + + + +

collect_np_file(file_path)

+
+

Classes

+
+ + + + + + +

NumpyFileDataset(root_dir)

Helper to work with directories of .npy data.

+
+
+
+axtreme.data.numpy_file_dataset.collect_np_file(file_path: str | Path) ndarray[Any, dtype[float64]]
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.html b/_autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.html new file mode 100644 index 00000000..157c6f4e --- /dev/null +++ b/_autosummary/axtreme.data.sizable_sequential_sample.SizableSequentialSampler.html @@ -0,0 +1,550 @@ + + + + + + + + + SizableSequentialSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

SizableSequentialSampler

+
+
+class axtreme.data.sizable_sequential_sample.SizableSequentialSampler(data_source: Sized, num_samples: None | int = None)
+

Bases: Sampler[int]

+

Samples elements sequentially, always in the same order.

+

Follows the pattern in RandomSampler to allow for sampling a specific number of samplers. +This can be smaller or larger than the amount in the dataset.

+
+
+__init__(data_source: Sized, num_samples: None | int = None) None
+

Create the sampler.

+
+
Parameters:
+
    +
  • data_source (Dataset) – dataset to sample from

  • +
  • num_samples (int) – number of samples to draw, default=`len(dataset)`.

  • +
+
+
+
+ +

Methods

+
+ + + + + + +

__init__(data_source[, num_samples])

Create the sampler.

+
+

Attributes

+
+ + + + + + + + + +

num_samples

data_source

+
+
+
+data_source: Sized
+
+ +
+
+property num_samples: int
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.data.sizable_sequential_sample.html b/_autosummary/axtreme.data.sizable_sequential_sample.html new file mode 100644 index 00000000..342feafc --- /dev/null +++ b/_autosummary/axtreme.data.sizable_sequential_sample.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.data.sizable_sequential_sample - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.data.sizable_sequential_sample

+

Sequential sampling.

+

Classes

+
+ + + + + + +

SizableSequentialSampler(data_source[, ...])

Samples elements sequentially, always in the same order.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.distributions.helpers.html b/_autosummary/axtreme.distributions.helpers.html new file mode 100644 index 00000000..a03ebcc9 --- /dev/null +++ b/_autosummary/axtreme.distributions.helpers.html @@ -0,0 +1,580 @@ + + + + + + + + + axtreme.distributions.helpers - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.distributions.helpers

+

Helpers built ontop of the distributions module.

+
+

Todo

+

These are seperate from utils becuase of circular import caused by ApproximateMixture. Potentially there is a +more elegant solution.

+
+

Functions

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

approx_mixture_cdf_resolution(dist)

To what resolution (number of decimal places) is cdf output accurate to.

dist_cdf_resolution(dist)

To what resolution (number of decimal places) is cdf output accurate to.

mixture_cdf_resolution(dist)

To what resolution (number of decimal places) is cdf output accurate to.

+
+
+
+axtreme.distributions.helpers.approx_mixture_cdf_resolution(dist: ApproximateMixture) float
+

To what resolution (number of decimal places) is cdf output accurate to.

+

This is identical to mixture_cdf_resolution except for the conservatism introduced by the approximation. +See ApproximateMixture “Impact of Approximation:” for details

+
+ +
+
+axtreme.distributions.helpers.dist_cdf_resolution(dist: Distribution) float
+

To what resolution (number of decimal places) is cdf output accurate to.

+

This is effected by:

+
+
    +
  • The numeric precision of the datatype q is stored with (e.g float32)

  • +
  • The internal calculation and numerical error incurrred by them.

  • +
+
+
+
Returns:
+

10**precision, where precision is the decimal position. E.g if accurate to 3 decimal places, return 0.001

+
+
+
+

Note

+
    +
  • We are interested in the cdf(x) -> q accuracy, as this is used heavily.

  • +
  • icdf(q) -> x does not have the same resolution as detailed here. The difference in results increases with x.

  • +
  • +
    This number/method is determined emprically. Tests show it is a good bound for float16 and float32.

    Assumed to hold for float64

    +
    +
    +
  • +
+
+
+ +
+
+axtreme.distributions.helpers.mixture_cdf_resolution(dist: MixtureSameFamily) float
+

To what resolution (number of decimal places) is cdf output accurate to.

+

This compared to dist_cdf_resolution this is also impacted by weights*components.

+

This is effected by:

+
+
    +
  • The numeric precision of the datatype q is stored with (e.g float32)

  • +
  • The internal calculation and numerical error incurred by them.

  • +
  • Combination of weight*components

  • +
+
+
+
Returns:
+

10**precision, where precision is the decimal position. E.g if accurate to 3 decimal places, return 0.001

+
+
+
+

Note

+
    +
  • We are interested in the cdf(x) -> q accuracy, as this is used heavily.

  • +
  • icdf(q) -> x does not have the same resolution as this. The difference in results increases with x.

  • +
  • This number/method is determined emprically. Tests show it is a good bound for float16 and float32. +Assumed to hold for float64

  • +
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.distributions.html b/_autosummary/axtreme.distributions.html new file mode 100644 index 00000000..ca7983fa --- /dev/null +++ b/_autosummary/axtreme.distributions.html @@ -0,0 +1,491 @@ + + + + + + + + + axtreme.distributions - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.distributions

+

Modules

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

helpers

Helpers built ontop of the distributions module.

icdf

Helper for finding inverse cdf for function that do not have an icdf method.

mixture

Mixture model variants.

utils

helpers for working with distribution.

+
+
+ +
+
+ +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.distributions.icdf.html b/_autosummary/axtreme.distributions.icdf.html new file mode 100644 index 00000000..abb91491 --- /dev/null +++ b/_autosummary/axtreme.distributions.icdf.html @@ -0,0 +1,570 @@ + + + + + + + + + axtreme.distributions.icdf - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.distributions.icdf

+

Helper for finding inverse cdf for function that do not have an icdf method.

+

Functions

+
+ + + + + + + + + +

icdf(dist, q, max_acceptable_error, opt_bounds)

Calculated the inverse CDF for each distribution in a batch.

icdf_1d(dist, quantile, ...)

Calculates inverse CDF values for distributions which do not have a icdf function.

+
+
+
+axtreme.distributions.icdf.icdf(dist: Distribution, q: Tensor, max_acceptable_error: float, opt_bounds: Tensor) Tensor
+

Calculated the inverse CDF for each distribution in a batch.

+

This method is useful when the distrbution does not have an icdf method. In this case the CDF can be run repeatidly +until we find the x where cdf(`x) == quantile`. We use optimisation to make this search effecient.

+
+
Parameters:
+
    +
  • dist – (*batch_shape,) mixture distribution producing events of event_shape samples

  • +
  • q – quantile to find the inverse cdf of. Must be boardcastable up to (*batch_shape,). Must not have more +dimensions than *batch_shape (only 1 q can be passed to each of the distributions in the batch.)

  • +
  • opt_bounds – (2,`*batch`). The lower and lower x bounds withing which the q can be found. If unknown, set to +a very large range. opt_bounds.shape[1:] must be broadcastable to dist.batch_shape.

  • +
  • max_acceptable_error – return values must be within icdf(q +/- max_acceptable_error)

  • +
+
+
Returns:
+

Tensor of shape (dist.batch_shape) of the icdf(x) results.

+
+
+
+ +
+
+axtreme.distributions.icdf.icdf_1d(dist: Distribution, quantile: float, max_acceptable_error: float, bounds: tuple[float, float]) Tensor
+

Calculates inverse CDF values for distributions which do not have a icdf function.

+

Some distributions do not have an inverse CDF function. In this case the CDF can be run repeatidly until we find the +x where cdf(`x) == quantile`. We use optimisation to make this search effecient. This function only supports +distribution with 1d input and output.

+
+
Parameters:
+
    +
  • dist

    This expects a Distribution like object. The specific methods and attributes required are:

    +
      +
    • methods: cdf(), and potentially log_prob() depending on the optimiser used.

    • +
    • Attributes: None.

    • +
    +

  • +
  • quantile – The quantile for which to find the corresponding x value.

  • +
  • max_acceptable_error – return values must be within icdf(q +/- max_acceptable_error)

  • +
  • bounds – The bounds to serach for the root in

  • +
+
+
Returns:
+

A tensor of shape (1,) of the x value corresponding to the quantile.

+
+
+
+
Details:
+
There are a number of way numerical issues can effect this results:
    +
  • Case 1: Function output (dist.cdf) is not precise enough to support max_acceptable_error.

  • +
  • Case 2: Function internals are not precise enough to support max_acceptable_error (e.g they introduce +numeric error).

  • +
  • Case 3: Optimiation input (x), is not accurate enough to support step sizes need to achieve +max_acceptable_error.

  • +
  • Case 4: The optimisation process does not find a suitable result.

  • +
  • Case 5: The output datatype truncation is not precise enough, failing max_acceptable_error after +truncation.

  • +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.distributions.mixture.ApproximateMixture.html b/_autosummary/axtreme.distributions.mixture.ApproximateMixture.html new file mode 100644 index 00000000..665d38d8 --- /dev/null +++ b/_autosummary/axtreme.distributions.mixture.ApproximateMixture.html @@ -0,0 +1,750 @@ + + + + + + + + + ApproximateMixture - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

ApproximateMixture

+
+
+class axtreme.distributions.mixture.ApproximateMixture(mixture_distribution: Categorical, component_distribution: Distribution, *, validate_args: bool | None = None, check_dtype: bool = True)
+

Bases: MixtureSameFamily

+

Mixture distributions where extreme caclulations are approximated.

+

Some distribution only support a limited range of quantiles (e.g \([.01, 99]\)) due to numerical issues (see +“Details”). When calculation such as \(q=cdf(x)\) or \(x=icdf(q)\) fail outside this range the function then +error. ApproximateMixture allows all x values ,and approximates the results for x values outside the supported +range (see “Details” for approximation method).

+

Details:

+
+

Distribution Quantiles Bounds:

+
+

Some distributions (e.g TransformedDistribution) have bounds on the quantiles they can support. +Calculations such as \(q=cdf(x)\) or \(x=icdf(q)\) will fail when q is outside of these bounds. +Bounds exist because for sum distributions \(icdf(1)=inf\) or \(icdf(0)=-inf\). Eventually there +comes a point for q value close to 0 or 1 where they lack the numerical precision to capture very small +changes in q, and the very large values of x.

+
+

Approximation principles:

+
+

It is assumed we want to conservatively estimate (\(1-cdf(x)\)), the chance the a value will exceed some +level \(x\). For example, x could represent the strength a structure is designed to withstand, and +(\(1-cdf(x)\)) represents the chance of experiencing a force that will break the structure (e.g the +risk). It is better to overestimate the risk (conservative), rather than underestimate it. In other words, +if the \(cdf_est(x)\) over estimates the \(cdf_true(x)\), then the true risk of exceeding x is. e.g:

+

TLDR:

+
+
    +
  • \(cdf_est(x) < cdf_true(x)\): produces conservative design (okay)

  • +
  • \(cdf_est(x) > cdf_true(x)\): BAD

  • +
+
+

Worked example:

+
+
    +
  • \(cdf_est(x) = .5\) and \(cdf_true(x) = .4\)

  • +
  • If structure is designed to be \(x\) strong, then estimated number of failure is .5, true number +of failures is .6.

  • +
  • Have underestimated the risk and designed a structure more likely to fail than we expect.

  • +
+
+
+

Approximate results.

+
+

ApproximateMixture provides exact results within the quantile bounds [finfo.eps, 1 - finfo.eps] (where +finfo = torch.finfo(component_distribution.dtype)) For details regarding why this range is selected see +_lower_bound_x and _upper_bound_x. Values smaller than finfo.eps are approximated +according to _lower_bound_x. Values larger than 1 - finfo.eps are approximated according to +_upper_bound_x. Note the range [finfo.eps, 1 - finfo.eps] is still used even if the component +distribution supports a greater range.

+
+

Impact of Approximation:

+
+

As a result of the approximation, the cdf method can underestimate the analytical cdf value by up to +finfo.eps. This values come from the following calculation, Similar behaviour occurs at the lower bound.

+
+
    +
  • Consider one of the underlying distributions in the marginal: once x hits the upper bound

    +
    +
      +
    • it will give q = 1.0-finfo.eps

    • +
    • in reality it could be as high as 1.0

    • +
    • so the q give is finfo.eps too small (at worst)

    • +
    +
    +
  • +
  • The marginal cdf is calcualted from the underlying distributions:

    +
    +
      +
    • e.g \(q_marginal = w_1 * q_1 + ... + w_n * q_n\)

    • +
    • \(sum(w_i) = 1\)

    • +
    +
    +
  • +
  • In the worst case:

    +
    +
      +
    • Underling distribution: q give is finfo.eps too small (at worst)

    • +
    • weight = 1

    • +
    +
    +
  • +
+
+
+
+
+

Note

+

It is worth ensuring that the ApproximateMixture distribution has suitable numeric precision for its intended +use. See axtreme.distributions.utils.mixture_dtype for more details.

+
+
+
+__init__(mixture_distribution: Categorical, component_distribution: Distribution, *, validate_args: bool | None = None, check_dtype: bool = True) None
+

Initialise the ApproximateMixture.

+
+
Parameters:
+
    +
  • mixture_distributiontorch.distributions.Categorical-like instance. Manages the probability of +selecting component. The number of categories must match the rightmost batch dimension of the +component_distribution. Must have either scalar batch_shape or batch_shape matching +component_distribution.batch_shape[:-1]

  • +
  • component_distributiontorch.distributions.Distribution-likeinstance. Right-most batch dimension +indexes component.

  • +
  • validate_args – Runs the default validation defined by torch

  • +
  • check_dtype – Check datatype of distributions match and inpput are at least as precise as the distribution.

  • +
+
+
+
+ +

Methods

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

__init__(mixture_distribution, ...[, ...])

Initialise the ApproximateMixture.

cdf(x)

Return the CDF.

entropy()

Returns entropy of distribution, batched over batch_shape.

enumerate_support([expand])

Returns tensor containing all values supported by a discrete distribution.

expand(batch_shape[, _instance])

Returns a new distribution instance (or populates an existing instance provided by a derived class) with batch dimensions expanded to batch_shape.

icdf(value)

Returns the inverse cumulative density/mass function evaluated at value.

log_prob(x)

Calculate the log prob (e.g log(pdf)).

perplexity()

Returns perplexity of distribution, batched over batch_shape.

rsample([sample_shape])

Generates a sample_shape shaped reparameterized sample or sample_shape shaped batch of reparameterized samples if the distribution parameters are batched.

sample([sample_shape])

Generates a sample_shape shaped sample or sample_shape shaped batch of samples if the distribution parameters are batched.

sample_n(n)

Generates n samples or n batches of samples if the distribution parameters are batched.

set_default_validate_args(value)

Sets whether validation is enabled or disabled.

+
+

Attributes

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

arg_constraints

batch_shape

Returns the shape over which parameters are batched.

component_distribution

event_shape

Returns the shape of a single sample (without batching).

has_enumerate_support

has_rsample

mean

Returns the mean of the distribution.

mixture_distribution

mode

Returns the mode of the distribution.

stddev

Returns the standard deviation of the distribution.

support

Returns a Constraint object representing this distribution's support.

variance

Returns the variance of the distribution.

+
+
+
+cdf(x: Tensor) Tensor
+

Return the CDF.

+

Identical to MixtureSameFamily implementation except for clamping.

+
+
Parameters:
+

x

Values to calcuate the CDF for. Must be broadcastable with the ApproximateMixture.batch_shape. E.g

+
    +
  • self.component_distribution.batch_shape = (2,5) (last dimension is the components that are +combined to make a single Mixture distribution)

  • +
  • self.batch_shape = (2,)

  • +
  • x.shape = (10) This will fail as it is not broadcastable

  • +
  • x.shape = (10,1) This will pass as it is broadcastable

  • +
+

+
+
Returns:
+

-1], self.batch_shape)

+
+
Return type:
+

Tensor of shape (x.shape[

+
+
+
+ +
+
+log_prob(x: Tensor) Tensor
+

Calculate the log prob (e.g log(pdf)).

+
+
Parameters:
+

x

Values to calcuate the log prob for. Must be broadcastable with the ApproximateMixture.batch_shape. +E.g

+
+
    +
  • self.component_distribution.batch_shape = (2,5) (last dimension is the components that are +combined to make a single Mixture distribution)

  • +
  • self.batch_shape = (2,)

  • +
  • x.shape = (10) This will fail as it is not broadcastable

  • +
  • x.shape = (10,1) This will pass as it is broadcastable

  • +
+
+

+
+
Returns:
+

-1], self.batch_shape)

+
+
Return type:
+

Tensor of shape (x.shape[

+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.distributions.mixture.html b/_autosummary/axtreme.distributions.mixture.html new file mode 100644 index 00000000..94ceb021 --- /dev/null +++ b/_autosummary/axtreme.distributions.mixture.html @@ -0,0 +1,548 @@ + + + + + + + + + axtreme.distributions.mixture - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.distributions.mixture

+

Mixture model variants.

+

Functions

+
+ + + + + + +

icdf_value_bounds(dist, q)

Returns bounds in which the value for quantile q is gaurenteed to be found.

+
+

Classes

+
+ + + + + + +

ApproximateMixture(mixture_distribution, ...)

Mixture distributions where extreme caclulations are approximated.

+
+
+
+axtreme.distributions.mixture.icdf_value_bounds(dist: MixtureSameFamily, q: Tensor) Tensor
+

Returns bounds in which the value for quantile q is gaurenteed to be found.

+
+
Parameters:
+
    +
  • dist(*batch_shape,) mixture distribution producing events of event_shape samples.

  • +
  • q – quantile to find the inverse cdf of. Must be boardcastable up to (*batch_shape,). Must not have more +dimensions than *batch_shape (only 1 q can be passed to each of the distributions in the batch.)

  • +
+
+
Returns:
+

tensor of shape (2,*batch_shape), there the first index represents the lower +bounds, and the second the upper bounds.

+
+
+

Details: +Mixture distribution calculate the CDF as follows:

+
+

\(q = w_i * CDF_1(y) + w_2 * CDF_2(y) + ... + w_n * CDF_n(y)\) +Which can be written as: \(q = w_i * q_1 + w_2 * q_2 + ... + w_n * q_n\)

+

where \(0 <= w_i <= 1\) and \(\\sum{w_i} = 1\)

+
+

An effective way to bound the x values the can produce y is:

+
+
    +
  • take the icdf(q) for each distribution. Now have X_n values.

  • +
  • lower_bound = min(X_n): at this point the first component distribution has become big enough to produce q. +As the weights are between [0,1] no point prior would be able to procude q as no q_i was large enough.s

  • +
  • upper_bound = max(X_n): at this point the last component distribution has become big enough to produce q. +As the weights sum to one, q must be produced by this point.

  • +
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.distributions.utils.html b/_autosummary/axtreme.distributions.utils.html new file mode 100644 index 00000000..cac2cbca --- /dev/null +++ b/_autosummary/axtreme.distributions.utils.html @@ -0,0 +1,573 @@ + + + + + + + + + axtreme.distributions.utils - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.distributions.utils

+

helpers for working with distribution.

+

Functions

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

dist_dtype(dist)

Return the dtype the distribution calculates values in.

index_batch_dist(dist, index)

Applies indexing to a MixtureSameFamily object along the batch dimension.

index_batch_mixture_dist(dist, index)

Applies indexing to a MixtureSameFamily object along the batch dimension.

+
+
+
+axtreme.distributions.utils.dist_dtype(dist: Distribution) dtype
+

Return the dtype the distribution calculates values in.

+

Parameters may be of different tpyes. It appears the distribution defaults to the largest dtype.

+
+
Parameters:
+

dist – the distribution to find the dtype of.

+
+
Returns:
+

dtype the ditribution returns result in.

+
+
+
+ +
+
+axtreme.distributions.utils.index_batch_dist(dist: Distribution, index: tuple[slice | int, ...]) Distribution
+

Applies indexing to a MixtureSameFamily object along the batch dimension.

+
+
Parameters:
+
    +
  • dist – The distribution to be indexed (only along the batch dimensions)

  • +
  • index – The index/slice to be applied. e.g (slice(1,4), Ellipsis) is equivalent to [1:4,…]. +Slices larger than the batch dimension will cause index error.

  • +
+
+
Returns:
+

A “veiw” of the underling distribution. This is a new object, but we call it a veiw as it is built on a view of +the underling data.

+
+
+
+

Note

+

The returned distribution is built on a view of the underling data. The follows the behaviour of slicing tensors +in pytorch as detailed here. +As such gradients etc are connected.

+
+
+ +
+
+axtreme.distributions.utils.index_batch_mixture_dist(dist: MixtureSameFamily, index: tuple[slice | int, ...]) MixtureSameFamily
+

Applies indexing to a MixtureSameFamily object along the batch dimension.

+
+
Parameters:
+
    +
  • dist – The distribution to be indexed (only along the batch dimensions)

  • +
  • index – The index/slice to be applied. e.g (slice(1,4), Ellipsis) is equivalent to [1:4,…]. +Slices larger than the batch dimension will cause index error.

  • +
+
+
Returns:
+

A “veiw” of the underling distribution. This is a new object, but we call it a veiw as it is built on a view of +the underling data.

+
+
+
+

Note

+

The returned distribution is built on a view of the underling data. The follows the behaviour of slicing tensors +in pytorch as detailed here. +As such gradients etc are connected.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.html b/_autosummary/axtreme.eval.html new file mode 100644 index 00000000..01ec3ae7 --- /dev/null +++ b/_autosummary/axtreme.eval.html @@ -0,0 +1,489 @@ + + + + + + + + + axtreme.eval - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.eval

+

Modules

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

object_logging

Helpers for unpacking nestes objects for logging purposes.

qoi_helpers

Plotting helper tailored for analysingQoIJobResults.

qoi_job

Classes to organize the evaluation of a QoIs.

utils

Additional helpers.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.object_logging.html b/_autosummary/axtreme.eval.object_logging.html new file mode 100644 index 00000000..4fb7408f --- /dev/null +++ b/_autosummary/axtreme.eval.object_logging.html @@ -0,0 +1,646 @@ + + + + + + + + + axtreme.eval.object_logging - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.eval.object_logging

+

Helpers for unpacking nestes objects for logging purposes.

+

When running experiments it is useful to record the objects that produced those results for reproducibility. This module +provides helper for unpacking nested objects for logging. It default implementations, and supports cusomistion so the +right level of granuality can be achieved.

+

Functions

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

default_config()

Default/handy processing configurations.

get_closest_class_value(obj, dic)

Searches a dictionary for the closest class, and return the value stored.

nested_content_to_str(d)

Helper function to turn all values in nested dictionaries to str.

public_vars(obj)

Like vars() but just returns public items.

unpack_object(obj[, ...])

Recursively extracts attributes from objects.

unpack_object_str_content(obj[, ...])

Helper that converts all unpack_object to string.

+
+
+
+axtreme.eval.object_logging.default_config() dict[type, Callable[[Any], dict[str, Any | dict[str, Any | NestedDict]]]]
+

Default/handy processing configurations.

+
+ +
+
+axtreme.eval.object_logging.get_closest_class_value(obj: object, dic: dict[type, T]) T | None
+

Searches a dictionary for the closest class, and return the value stored.

+

Searches the class heirachy from bottom to top for a matching key in the dictionary. Returns the values stored with +by that key.

+
+
Parameters:
+
    +
  • obj – Object to find the class for

  • +
  • dic – takes object of that type,

  • +
+
+
Returns:
+

The value in stored in the dictionary for the closest class, or None if no match is found.

+
+
+
+ +
+
+axtreme.eval.object_logging.nested_content_to_str(d: dict[str, Any | dict[str, Any | NestedDict]]) dict[str, str | dict[str, str | NestedStrDict]]
+

Helper function to turn all values in nested dictionaries to str.

+
+ +
+
+axtreme.eval.object_logging.public_vars(obj: object) dict[str, Any]
+

Like vars() but just returns public items.

+
+ +
+
+axtreme.eval.object_logging.unpack_object(obj: object, custom_unpacking_config: dict[type, Callable[[Any], dict[str, Any | dict[str, Any | NestedDict]]]] | None = None, depth: int = 1) dict[str, Any | dict[str, Any | NestedDict]]
+

Recursively extracts attributes from objects.

+

This can be useful for logging the state of an object. It will unpack the public attributes of an object up to +‘depth’. Specific unpacking function can also be provided for attribute object in custom_unpacking_config. If +these objects are encounter the unpacking function will be used instead.

+
+
Parameters:
+
    +
  • obj – the object to unpack.

  • +
  • custom_unpacking_config

    Overrides default unpacking behaviour for object that subclass the keys.

    +
      +
    • Keys: Types

    • +
    • Values: Functions that take instance of that type, and produces a custom unpacking.

    • +
    • This unpacking should be of the following format:

    • +
    +

  • +
  • depth

      +
    • How many levels of objects to unpack.

    • +
    +

  • +
+
+
Returns:
+

A nested dictionary.

+
    +
  • +
    Without custom unpacking:
      +
    • keys: are the public attribute names

    • +
    • values: are the attribute value, or nested dictionary of the object being unpacked.

      +
      +

      {“__class__”: RootObjectClass, “attribute_1”: {“__class__”: Foo, “a”: “blah”, “b”: None}, “attribute_2”: “x”}

      +
      +
    • +
    +
    +
    +
  • +
  • +
    With custom unpacking:
      +
    • keys: Determined by the custom unpacking function if used otherwise as above.

    • +
    • Values: Determined by the custom unpacking function if used otherwise as above.

      +
      +

      {“__class__”: RootObjectClass, “attribute_1”: {“custom_unpacking_key1”: “name of class if FOO”, “custom_unpacking_key2”: [1, 2, 3]}, “attribute_2”: “x”}

      +
      +
    • +
    +
    +
    +
  • +
+

+
+
+
+

Todo

+

depth: How many levels of objects to unpack.

+
+
+ +
+
+axtreme.eval.object_logging.unpack_object_str_content(obj: object, custom_unpacking_config: None | dict[type, Callable[[Any], dict[str, Any | dict[str, Any | NestedDict]]]] = None, depth: int = 1) dict[str, str | dict[str, str | NestedStrDict]]
+

Helper that converts all unpack_object to string.

+
+
Parameters:
+
    +
  • obj – the object to unpack.

  • +
  • custom_unpacking_config

    Overrides default unpacking behaviour for object that subclass the keys. If None +default_config() is used.

    +
      +
    • Keys: Types

    • +
    • Values: Functions that take instance of that type, and produces a custom unpacking. This unpacking should +be of the following format:

    • +
    +

  • +
  • depth

      +
    • How many levels of objects to unpack.

    • +
    +

  • +
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.qoi_helpers.html b/_autosummary/axtreme.eval.qoi_helpers.html new file mode 100644 index 00000000..caa79f64 --- /dev/null +++ b/_autosummary/axtreme.eval.qoi_helpers.html @@ -0,0 +1,579 @@ + + + + + + + + + axtreme.eval.qoi_helpers - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.eval.qoi_helpers

+

Plotting helper tailored for analysingQoIJobResults.

+

Functions

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

plot_col_histogram(df, ax[, col_name, ...])

Helper which creates a histogram (on the given ax) based on a column of the df.

plot_distribution(df, ax[, n_hists, ...])

Helperfor plotting histograms (on the given ax) of dataframe cells containing lists.

plot_groups(df_grouped, plotting_funcs)

Takes a grouped dataframe, and generates a row of plots for each group, using plotting_funcs.

qoi_ignoring_gp_uncertainty(qoi, model)

Helper to run a QoI with a model, ignoring uncertainty in the model (e.g using the posterior mean).

+
+
+
+axtreme.eval.qoi_helpers.plot_col_histogram(df: DataFrame, ax: Axes, col_name: str = 'mean', brute_force: float | None = None) None
+

Helper which creates a histogram (on the given ax) based on a column of the df.

+

Designed for use with the ‘mean’ or ‘var’ column of a QoiJobResults dataframe.

+
+
Parameters:
+
    +
  • df – A dataframe.

  • +
  • ax – The axis to plot on.

  • +
  • col_name – The column of the df containing lists.

  • +
  • brute_force – Represents the true value (e.g mean). Plots a vertical line if provided.

  • +
+
+
+
+ +
+
+axtreme.eval.qoi_helpers.plot_distribution(df: DataFrame, ax: Axes, n_hists: int = 3, col_name: str = 'samples', brute_force: float | None = None) None
+

Helperfor plotting histograms (on the given ax) of dataframe cells containing lists.

+

Designed for use with the ‘samples’ column of a QoiJobResults dataframe.

+
+
Parameters:
+
    +
  • df – A dataframe.

  • +
  • ax – The axis to plot on.

  • +
  • n_hists – The number of cells of column col_name to plot.

  • +
  • col_name – The column of the df containing lists.

  • +
  • brute_force – Represents the true value (e.g mean). Plots a vertical line if provided.

  • +
+
+
+
+ +
+
+axtreme.eval.qoi_helpers.plot_groups(df_grouped: DataFrameGroupBy, plotting_funcs: list[Callable[[DataFrame, Axes], None]]) Figure
+

Takes a grouped dataframe, and generates a row of plots for each group, using plotting_funcs.

+
+
Parameters:
+
    +
  • df_grouped – The groupby object to plot

  • +
  • plotting_funcs – list of plots to be generated for each group. See plot_col_histogram for an example of a +plotting function.

  • +
+
+
+
+ +
+
+axtreme.eval.qoi_helpers.qoi_ignoring_gp_uncertainty(qoi: GPBruteForce, model: SingleTaskGP) Tensor
+

Helper to run a QoI with a model, ignoring uncertainty in the model (e.g using the posterior mean).

+
+
Parameters:
+
    +
  • qoi – The QoI estimator to use

  • +
  • model – The model to use

  • +
+
+
Returns:
+

the estimates made by the QoI using only the posterior mean of the model.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.qoi_job.QoIJob.html b/_autosummary/axtreme.eval.qoi_job.QoIJob.html new file mode 100644 index 00000000..661c66aa --- /dev/null +++ b/_autosummary/axtreme.eval.qoi_job.QoIJob.html @@ -0,0 +1,566 @@ + + + + + + + + + QoIJob - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

QoIJob

+
+
+class axtreme.eval.qoi_job.QoIJob(model: ~botorch.models.model.Model, qoi: ~axtreme.qoi.qoi_estimator.QoIEstimator, name: str | None = None, tags: dict[str, str | float] = <factory>, metadata: dict[str, str | float] = <factory>)
+

Bases: object

+

Helper to make the interface below clear.

+
+
+__init__(model: ~botorch.models.model.Model, qoi: ~axtreme.qoi.qoi_estimator.QoIEstimator, name: str | None = None, tags: dict[str, str | float] = <factory>, metadata: dict[str, str | float] = <factory>) None
+
+ +

Methods

+
+ + + + + + +

__init__(model, qoi[, name, tags, metadata])

+
+

Attributes

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

name

model

qoi

tags

metadata

+
+
+
+metadata: dict[str, str | float]
+
+ +
+
+model: Model
+
+ +
+
+name: str | None = None
+
+ +
+
+qoi: QoIEstimator
+
+ +
+
+tags: dict[str, str | float]
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.qoi_job.QoIJobResult.html b/_autosummary/axtreme.eval.qoi_job.QoIJobResult.html new file mode 100644 index 00000000..458dedff --- /dev/null +++ b/_autosummary/axtreme.eval.qoi_job.QoIJobResult.html @@ -0,0 +1,625 @@ + + + + + + + + + QoIJobResult - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

QoIJobResult

+
+
+class axtreme.eval.qoi_job.QoIJobResult(mean: ~torch.Tensor, var: ~torch.Tensor, samples: ~torch.Tensor, tags: dict[str, str | float] = <factory>, metadata: dict[str, ~typing.Any] = <factory>)
+

Bases: object

+

Dataclass to store the results of running a QoIEstimator (as produced by QoIJob).

+
+
Parameters:
+
    +
  • mean – the mean of the QoIEstimator results. +Note, if UT methods are used in the QoIEstimator, this can’t be calculated directory form samples

  • +
  • var – variance in the QoIEstimator results. +Note, if UT methods are used in the QoIEstimator, this can’t be calculated directory form samples

  • +
  • samples – Samples produced by the QoIEstimator

  • +
  • tags – Label assigned to the result by the user. This information can typically be found somewhere in metadata, +putting them here is for convience (more accessible and less noise).

  • +
  • metadata – Optional indepth information about the conditions that produced these results.

  • +
+
+
+
+
+__init__(mean: ~torch.Tensor, var: ~torch.Tensor, samples: ~torch.Tensor, tags: dict[str, str | float] = <factory>, metadata: dict[str, ~typing.Any] = <factory>) None
+
+ +

Methods

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

__init__(mean, var, samples[, tags, metadata])

from_dict(kvs, *[, infer_missing])

from_json(s, *[, parse_float, parse_int, ...])

schema(*[, infer_missing, only, exclude, ...])

to_dict([encode_json])

to_json(*[, skipkeys, ensure_ascii, ...])

+
+

Attributes

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

mean

var

samples

tags

metadata

+
+
+
+classmethod from_dict(kvs: dict | list | str | int | float | bool | None, *, infer_missing=False) A
+
+ +
+
+classmethod from_json(s: str | bytes | bytearray, *, parse_float=None, parse_int=None, parse_constant=None, infer_missing=False, **kw) A
+
+ +
+
+classmethod schema(*, infer_missing: bool = False, only=None, exclude=(), many: bool = False, context=None, load_only=(), dump_only=(), partial: bool = False, unknown=None) SchemaF[A]
+
+ +
+
+to_dict(encode_json=False) Dict[str, dict | list | str | int | float | bool | None]
+
+ +
+
+to_json(*, skipkeys: bool = False, ensure_ascii: bool = True, check_circular: bool = True, allow_nan: bool = True, indent: int | str | None = None, separators: Tuple[str, str] | None = None, default: Callable | None = None, sort_keys: bool = False, **kw) str
+
+ +
+
+mean: Tensor
+
+ +
+
+metadata: dict[str, Any]
+
+ +
+
+samples: Tensor
+
+ +
+
+tags: dict[str, str | float]
+
+ +
+
+var: Tensor
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.qoi_job.html b/_autosummary/axtreme.eval.qoi_job.html new file mode 100644 index 00000000..2d39ed20 --- /dev/null +++ b/_autosummary/axtreme.eval.qoi_job.html @@ -0,0 +1,484 @@ + + + + + + + + + axtreme.eval.qoi_job - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.eval.qoi_job

+

Classes to organize the evaluation of a QoIs.

+

Classes

+
+ + + + + + + + + +

QoIJob(model, qoi, name, tags, ...)

Helper to make the interface below clear.

QoIJobResult(mean, var, samples, tags, ...)

Dataclass to store the results of running a QoIEstimator (as produced by QoIJob).

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.eval.utils.html b/_autosummary/axtreme.eval.utils.html new file mode 100644 index 00000000..64a098e2 --- /dev/null +++ b/_autosummary/axtreme.eval.utils.html @@ -0,0 +1,508 @@ + + + + + + + + + axtreme.eval.utils - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.eval.utils

+

Additional helpers.

+

Functions

+
+ + + + + + +

append_to_json(obj, output_file)

Appends a json object to a file containing a list of objects.

+
+
+
+axtreme.eval.utils.append_to_json(obj: Any, output_file: Path) None
+

Appends a json object to a file containing a list of objects.

+

object: Json serialisable object to append. +output_file: The file to append results to. If does not exist, it will be created.

+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.evaluation.EvaluationFunction.html b/_autosummary/axtreme.evaluation.EvaluationFunction.html new file mode 100644 index 00000000..ca901c64 --- /dev/null +++ b/_autosummary/axtreme.evaluation.EvaluationFunction.html @@ -0,0 +1,581 @@ + + + + + + + + + EvaluationFunction - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

EvaluationFunction

+
+
+class axtreme.evaluation.EvaluationFunction(simulator: Simulator, output_dist: rv_continuous, parameter_order: list[str], n_simulations_per_point: int = 20)
+

Bases: object

+

Class for evaluating a simulation at a point, and fits a distribution to the results.

+

Take ax.Parameter, runs the simulator at that point, and packages the result into the format later required +for unpacking in the metrics.

+
+
+__init__(simulator: Simulator, output_dist: rv_continuous, parameter_order: list[str], n_simulations_per_point: int = 20) None
+

Initializes the EvaluationFunction.

+
+
Parameters:
+
    +
  • simulator – Conforming to the simulator in

  • +
  • output_dist – Distribution that should be used to fit the response. This is the distribution of the noise +in the simulation, at a given x,

  • +
  • n_simulations_per_point – The number of simulations to run at each point.

  • +
  • parameter_order

    Order of features that the simulator expects.

    +
    +

    Note

    +

    This is a temporary measure to check that the order isn’t ever shuffled.

    +
    +
    +

    Todo

    +

    Got through ax and check is order is always respected, so we can remove this

    +
    +

  • +
+
+
+
+ +

Methods

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

__init__(simulator, output_dist, parameter_order)

Initializes the EvaluationFunction.

post_process_simulation_output(y)

Post process the simulation output be fitting a the distribution to the results.

run_simulator(x)

Runs the simulator at a point and returns the results.

+
+
+
+post_process_simulation_output(y: ndarray[tuple[int, int, int], dtype[float64]]) SimulationPointResults
+

Post process the simulation output be fitting a the distribution to the results.

+
+
Parameters:
+

y

The output of the simulation with shape (n_simulations_per_points,)

+
+

Note

+

This is the output of the simulator, at a single point and a single output dimension.

+
+

+
+
Returns:
+

A SimulationPointResults object with the mean and covariance of the fitted distribution.

+
+
+
+ +
+
+run_simulator(x: ndarray[tuple[int, int], dtype[float64]]) ndarray[tuple[int, int, int], dtype[float64]]
+

Runs the simulator at a point and returns the results.

+
+
Parameters:
+

x – The points at which to run the simulator with shape (n_points, n_input_dims)

+
+
Returns:
+

The results of the simulator with shape (n_points, n_simulations_per_point, n_output_dims)

+
+
Raises:
+

AssertionError – If the shape of the output of self.simulator is not as expected.

+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.evaluation.SimulationPointResults.html b/_autosummary/axtreme.evaluation.SimulationPointResults.html new file mode 100644 index 00000000..5cb5bb67 --- /dev/null +++ b/_autosummary/axtreme.evaluation.SimulationPointResults.html @@ -0,0 +1,616 @@ + + + + + + + + + SimulationPointResults - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

SimulationPointResults

+
+
+class axtreme.evaluation.SimulationPointResults(metric_names: list[str], means: ndarray[tuple[int], dtype[float64]], cov: ndarray[tuple[int, int], dtype[float64]] | None)
+

Bases: object

+

For a point that has been simulation, stores the mean(s) and covariance(s).

+
+
Parameters:
+
    +
  • means (NDArray[np.float64]) – array of the mean paramter/metric estimates at a X point.

  • +
  • cov (NDArray[np.float64]|None) – covarianc matrix with uncertainty distibution of the metric estimates. +- This can be None if the error is unknown

  • +
  • parameter_names – list of names. Gives the index where relevant data is stored

  • +
+
+
+
+
Design rational:
    +
  • The primary purpose of this is to define the interface between the Runner which generate simulation results, +and Metric which reports the required parts of the results for AX to then use.

  • +
  • +
    The intent is to :
      +
    • Explicitally define the interface information between the two (rather than use a dict)

    • +
    • Prevent Runner needing to know about specific structure of metric.

    • +
    • Prevent Metric needing to know the stucture of Runner

    • +
    • Esentially it mean the translatioin logic between these two components is contained in one discrete +unit/object

    • +
    +
    +
    +
  • +
+
+
+

This is generated (in the Runner) when the simulation is evaluated for a specific Trial. +It is attached to the Trail.metadata, and later read by Metric.fetch_trial_data.

+
+
Parameters:
+
    +
  • metric_name (-) – The name of the metric that these results are relevant to

  • +
  • mean (-) – The mean estimate of the metric for this particular trial

  • +
  • sem (-) – Standard Error Measure, as defined here

  • +
+
+
+
+
Background: For documenation on what can do into this object
+
+
+
+

Todo

+

Revist if there is a better abstraction for this. Detail in Github issue #31.

+
+
+
+__init__(metric_names: list[str], means: ndarray[tuple[int], dtype[float64]], cov: ndarray[tuple[int, int], dtype[float64]] | None) None
+
+ +

Methods

+
+ + + + + + + + + +

__init__(metric_names, means, cov)

metric_data(metric_name)

Construct the 'Metric data-related columns' as defined in ax.Data.

+
+

Attributes

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

metric_names

means

cov

+
+
+
+metric_data(metric_name: str) dict[str, float | None]
+

Construct the ‘Metric data-related columns’ as defined in ax.Data.

+
+
This consists of:
    +
  • “mean”: mean estimate of this parameter

  • +
  • “sem”: as defined here

  • +
+
+
+
+ +
+
+cov: ndarray[tuple[int, int], dtype[float64]] | None
+
+ +
+
+means: ndarray[tuple[int], dtype[float64]]
+
+ +
+
+metric_names: list[str]
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.evaluation.html b/_autosummary/axtreme.evaluation.html new file mode 100644 index 00000000..cbe0bb5d --- /dev/null +++ b/_autosummary/axtreme.evaluation.html @@ -0,0 +1,484 @@ + + + + + + + + + axtreme.evaluation - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.evaluation

+

Responsible for running simulators with a given set of Ax Parameters, and returning estimate with uncertainty.

+

Classes

+
+ + + + + + + + + +

EvaluationFunction(simulator, output_dist, ...)

Class for evaluating a simulation at a point, and fits a distribution to the results.

SimulationPointResults(metric_names, means, cov)

For a point that has been simulation, stores the mean(s) and covariance(s).

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.experiment.html b/_autosummary/axtreme.experiment.html new file mode 100644 index 00000000..881ee49b --- /dev/null +++ b/_autosummary/axtreme.experiment.html @@ -0,0 +1,691 @@ + + + + + + + + + axtreme.experiment - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.experiment

+

Helper functions for ax Experiments.

+

Functions

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

add_json_data_to_experiment(experiment, ...)

Adds the data from a dictionary to an ax Experiment.

add_metric_data_to_experiment(experiment, ...)

Add metric data to an experiment.

add_simulation_data_to_experiment(...)

Add raw simulator data to an experiment.

add_sobol_points_to_experiment(experiment[, ...])

Adds some points (chosen by sobol) to an experiment.

extract_data_from_experiment_as_json(experiment)

Extracts the data from an ax Experiment.

make_experiment(simulator, search_space, dist)

Returns an experiment according to the given simulator, search_space, and dist_class.

+
+
+
+axtreme.experiment.add_json_data_to_experiment(experiment: Experiment, json_data: dict[int, dict[str, dict[str, dict[str, float | dict[str, float]]]]]) None
+

Adds the data from a dictionary to an ax Experiment.

+
+
Parameters:
+
    +
  • experiment – The ax Experiment to add the data to.

  • +
  • json_data – The data to add to the ax Experiment. The structure should be the same as the output of +extract_data_from_experiment.

  • +
+
+
+

Example

+
{
+    "trial_index": {
+        "arm_name": {
+            "parameters": {
+                "parameter_name": "parameter_value"
+            },
+            "metrics": {
+                "metric_name": {
+                    "mean": 0.0,
+                    "sem": 0.0
+                }
+            }
+        }
+    }
+}
+
+
+
+ +
+
+axtreme.experiment.add_metric_data_to_experiment(experiment: Experiment, parameterizations: Iterable[Dict[str, None | str | bool | float | int]], metric_data: Iterable[Mapping[str, float | tuple[float, float | None] | dict[str, float | None]]]) tuple[Data, int]
+

Add metric data to an experiment.

+

This function is used to add data from previously run simulations to an experiment. +To use this function one needs to have an estimate of the mean and standard error for each metric. +This is useful if the simulator is slow or expensive to run and the data is already available.

+
+
Parameters:
+
    +
  • experiment – The ax Experiment to add the data to.

  • +
  • parameterizations

    The parameterizations used in the simulation.

    +
      +
    • Iterable where each element is a dict parameter names and values ({[param_name]: value}).

    • +
    +

  • +
  • metric_data

    The metric data from the simulation.

    +
      +
    • Iterable where each element is a dict of metric names and values.

    • +
    • The values can be a float, a tuple of (mean, sem), or a dict of {“mean”: mean, “sem”: sem}.

    • +
    • If a float is provided, the sem is assumed to be 0.

    • +
    +

  • +
+
+
Returns:
+

    +
  • The data that was attached to the experiment.

  • +
  • The trial index of the trial that was created.

  • +
+

+
+
+
+ +
+
+axtreme.experiment.add_simulation_data_to_experiment(experiment: Experiment, parameters: list[str], simulation_inputs: Iterable[ndarray[Any, dtype[float64]]], simulation_outputs: Iterable[ndarray[Any, dtype[float64]]]) tuple[Data, int]
+

Add raw simulator data to an experiment.

+

This function is used to add data from previously run simulations to an experiment. +This is very useful if the simulator is slow or expensive to run and the data is already available. +Using this function allows you to add the data to the experiment and then use it to train the model +which can be used to collect new data by running new simulations.

+
+
Parameters:
+
    +
  • experiment – The ax Experiment to add the data to.

  • +
  • parameters

    The names of the parameters used as input to the simulator.

    +
      +
    • This has to match the names of the parameters in the search space of the experiment.

    • +
    • This should match the order of the input dimensions in the simulation_inputs.

    • +
    +

  • +
  • simulation_inputs

    The inputs to the simulator.

    +
      +
    • Iterable where each element is the parameters used in the simulation.

    • +
    • Each element should be a numpy array with shape (n_input_dims,)

    • +
    +

  • +
  • simulation_outputs

    The outputs from the simulator.

    +
      +
    • Iterable where each element is multiple output from the simulation ran with the same input.

    • +
    • Each element should be a numpy array with shape (n_simulations_per_point,)

    • +
    • Only supports a single output dimension for now.

    • +
    +

  • +
+
+
Returns:
+

    +
  • The data that was attached to the experiment.

  • +
  • The trial index of the trial that was created.

  • +
+

+
+
+
+ +
+
+axtreme.experiment.add_sobol_points_to_experiment(experiment: Experiment, n_iter: int = 5, seed: int | None = None) None
+

Adds some points (chosen by sobol) to an experiment.

+

Typically used to initialise the experiment so a GP has data for training.

+
+ +
+
+axtreme.experiment.extract_data_from_experiment_as_json(experiment: Experiment) dict[int, dict[str, dict[str, dict[str, float | dict[str, float]]]]]
+

Extracts the data from an ax Experiment.

+
+
Parameters:
+

experiment – The Ax experiment to extract the data from.

+
+
Returns:
+

{
+    "trial_index": {
+        "arm_name": {
+            "parameters": {
+                "parameter_name": "parameter_value"
+            },
+            "metrics": {
+                "metric_name": {
+                    "mean": 0.0,
+                    "sem": 0.0
+                }
+            }
+        }
+    }
+}
+
+
+

+
+
Return type:
+

A dictionary with the following structure

+
+
+
+ +
+
+axtreme.experiment.make_experiment(simulator: Simulator, search_space: SearchSpace, dist: rv_continuous, n_simulations_per_point: int = 100) Experiment
+

Returns an experiment according to the given simulator, search_space, and dist_class.

+
+
Parameters:
+
    +
  • simulator – The simulator to use for the experiment.

  • +
  • search_space – The ax search space to use for the experiment.

  • +
  • dist – The distribution that the result of a simulation is assumed to follow.

  • +
  • n_simulations_per_point – The number of simulations to run for each point in the experiment.

  • +
+
+
Returns:
+

An ax Experiment.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.metrics.LocalMetadataMetric.html b/_autosummary/axtreme.metrics.LocalMetadataMetric.html new file mode 100644 index 00000000..0f0c1084 --- /dev/null +++ b/_autosummary/axtreme.metrics.LocalMetadataMetric.html @@ -0,0 +1,604 @@ + + + + + + + + + LocalMetadataMetric - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

LocalMetadataMetric

+
+
+class axtreme.metrics.LocalMetadataMetric(name: str, lower_is_better: bool | None = None, properties: Dict[str, Any] | None = None)
+

Bases: Metric

+

This metric retrieves its results form the trial metadata.

+

The simple example run the simultion within this function call +(e.g. see) +In general, this method should only ‘fetch’ the results from somewhere else where they have been run. +For example, Runner deploys simulation of remote, this connects to remote and collects result. +This is local implementation of this patter, where results are stored on trail metadata.

+

This is useful when: +- Running a single simulation produces multiple output metrics +(meaning the simulation doesn’t need to be run as many times) +- Want to execute the simulation when trail.run() is called

+
+

Note

+

This object is coupled with LocalMetadataRunner, through SimulationPointResults

+
+

Background:

+

Flow: +- trial.run() called, internally call the runner, and puts the resulting data into metadata +- Later Metric.fetch_trial_data(trial) is called Therefore, Metric has access to all the “bookkeeping” +trial information directly, the only thing that should be in metadata is run result.

+
+
+__init__(name: str, lower_is_better: bool | None = None, properties: Dict[str, Any] | None = None) None
+

Inits Metric.

+
+
Parameters:
+
    +
  • name – Name of metric.

  • +
  • lower_is_better – Flag for metrics which should be minimized.

  • +
  • properties – Dictionary of this metric’s properties

  • +
+
+
+
+ +

Methods

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

__init__(name[, lower_is_better, properties])

Inits Metric.

bulk_fetch_experiment_data(experiment, metrics)

Fetch multiple metrics data for multiple trials on an experiment, using instance attributes of the metrics.

bulk_fetch_trial_data(trial, metrics, **kwargs)

Fetch multiple metrics data for one trial, using instance attributes of the metrics.

clone()

Create a copy of this Metric.

deserialize_init_args(args[, ...])

Given a dictionary, deserialize the properties needed to initialize the object.

fetch_data_prefer_lookup(experiment, metrics)

Fetch or lookup (with fallback to fetching) data for given metrics, depending on whether they are available while running.

fetch_experiment_data_multi(experiment, metrics)

Fetch multiple metrics data for an experiment.

fetch_trial_data(trial, **kwargs)

Fetch data for one trial.

fetch_trial_data_multi(trial, metrics, **kwargs)

Fetch multiple metrics data for one trial.

is_available_while_running()

Whether metrics of this class are available while the trial is running.

maybe_raise_deprecation_warning_on_class_methods()

period_of_new_data_after_trial_completion()

Period of time metrics of this class are still expecting new data to arrive after trial completion.

serialize_init_args(obj)

Serialize the properties needed to initialize the object.

+
+

Attributes

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

db_id

fetch_multi_group_by_metric

Metric class, with which to group this metric in Experiment._metrics_by_class, which is used to combine metrics on experiment into groups and then fetch their data via Metric.fetch_trial_data_multi for each group.

name

Get name of metric.

summary_dict

Returns a dictionary containing the metric's name and properties.

+
+
+
+fetch_trial_data(trial: BaseTrial, **kwargs: Any) Result[Data, MetricFetchE]
+

Fetch data for one trial.

+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.metrics.html b/_autosummary/axtreme.metrics.html new file mode 100644 index 00000000..9b6bb3fa --- /dev/null +++ b/_autosummary/axtreme.metrics.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.metrics - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.metrics

+

Additional Metric implemenations.

+

Classes

+
+ + + + + + +

LocalMetadataMetric(name[, lower_is_better, ...])

This metric retrieves its results form the trial metadata.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.plotting.doe.html b/_autosummary/axtreme.plotting.doe.html new file mode 100644 index 00000000..c96c757b --- /dev/null +++ b/_autosummary/axtreme.plotting.doe.html @@ -0,0 +1,530 @@ + + + + + + + + + axtreme.plotting.doe - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.plotting.doe

+

Helper function for plotting DoE behaviour.

+

Functions

+
+ + + + + + +

plot_qoi_estimates(results[, ax, q, ...])

Plots how the QoI estimates changes over DoE process.

+
+
+
+axtreme.plotting.doe.plot_qoi_estimates(results: ndarray[tuple[int, int], dtype[float64]], ax: None | Axes = None, q: tuple[float, ...] = (0.1, 0.5, 0.9), points_between_ests: int = 1, name: str | None = None, **kwargs: Any) Axes
+

Plots how the QoI estimates changes over DoE process.

+
+
Parameters:
+
    +
  • results

    shape (n_doe_rounds, n_qoi_estimates).

    +
      +
    • n_doe_rounds: The number of DoE rounds in which a QoI estimate was produced.

    • +
    • n_qoi_estimates: the number of estimates produced by a single run of the QoI estimator.

    • +
    +

  • +
  • ax – ax to add the plots to. If not provided, one will be created.

  • +
  • q – the quantiles that should be used/reported.

  • +
  • points_between_ests – This should be used if multplie DoE iterations are used between qoi estimates +(e.g if the estimate is expensive). It adjusts the scale of the x axis.

  • +
  • name – optional name that should be added to the legend information for this plot

  • +
  • kwargs – kwargs that should be passed to matplotlib. Must be applicable to ax.plot and ax.fill_between

  • +
+
+
Returns:
+

the ax with the plot.

+
+
Return type:
+

Axes

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.plotting.gp_fit.html b/_autosummary/axtreme.plotting.gp_fit.html new file mode 100644 index 00000000..e19c9a2c --- /dev/null +++ b/_autosummary/axtreme.plotting.gp_fit.html @@ -0,0 +1,586 @@ + + + + + + + + + axtreme.plotting.gp_fit - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.plotting.gp_fit

+

Plotting module for visualizing how well the GP fits the data.

+

Functions

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

plot_1d_model(model[, X, ax])

Plots a model with 1d in put, and any number of outputs..

plot_gp_fits_2d_surface(model_bridge, ...[, ...])

Plot the GP fit for the given metrics over the 2D search space.

plot_surface_over_2d_search_space(...[, ...])

Creates a figure with the functions in funcs ploted over the search_space.

scatter_plot_training(model_bridge, metric_name)

Make a scattter plot of a metric for the training data of the model.

+
+
+
+axtreme.plotting.gp_fit.plot_1d_model(model: SingleTaskGP, X: Tensor | None = None, ax: None | Axes = None) Axes
+

Plots a model with 1d in put, and any number of outputs..

+
+
Parameters:
+
    +
  • model – Only SingleTaskGp is supported an training data is extracted from the model.

  • +
  • X – (n,1): Linspace of [0,1] is used by default. Only 1d is currently supported.

  • +
  • ax – will plot to this axis if provied

  • +
+
+
+
+ +
+
+axtreme.plotting.gp_fit.plot_gp_fits_2d_surface(model_bridge: TorchModelBridge, search_space: SearchSpace, metrics: dict[str, Callable[[ndarray[tuple[int, int], dtype[float64]]], ndarray[tuple[int], dtype[float64]]]] | None = None, num_points: int = 101) Figure
+

Plot the GP fit for the given metrics over the 2D search space.

+
+
Parameters:
+
    +
  • model_bridge – The model bridge used to make predictions.

  • +
  • search_space – The search space over which the functions are to be evaluated and plotted.

  • +
  • metrics – A dictionary of metrics to plot. The keys are the names of the metrics in the model bridge model +and the values are callables that return the metric value for a given input.

  • +
  • num_points – The number of points in each dimension to evaluate the functions at.

  • +
+
+
+
+ +
+
+axtreme.plotting.gp_fit.plot_surface_over_2d_search_space(search_space: SearchSpace, funcs: list[Callable[[ndarray[tuple[int, int], dtype[float64]]], ndarray[tuple[int], dtype[float64]]]], colors: list[str] | None = None, num_points: int = 101) Figure
+

Creates a figure with the functions in funcs ploted over the search_space.

+
+

Note

+

Currently only support search spaces with 2 parameters.

+
+
+
Parameters:
+
    +
  • search_space – The search space over which the functions are to be evaluated and plotted.

  • +
  • funcs – A list of callables that take in a numpy array with shape (num_values, num_parameters=2 ) +and return a numpy array with (num_values) elements.

  • +
  • colors – A list of colors to use for each function. If None, will use default Plotly colors.

  • +
  • num_points – The number of points in each dimension to evaluate the functions at.

  • +
+
+
+
+ +
+
+axtreme.plotting.gp_fit.scatter_plot_training(model_bridge: TorchModelBridge, metric_name: str, axis: tuple[int, int] = (0, 1), figure: Figure | None = None, *, error_bars: bool = True, error_bar_confidence_interval: float = 0.95) Figure
+

Make a scattter plot of a metric for the training data of the model.

+
+
Parameters:
+
    +
  • model_bridge – The model the training data scatter plot is to be made for.

  • +
  • metric_name – The name of the metric to plot. Must match the name of a metric in the model.

  • +
  • axis – The axis of the input space to plot the scatter plot in

  • +
  • figure – The figure to add the scatter plot to. If None, a new figure is created.

  • +
  • error_bars – Whether to add error bars to the plot.

  • +
  • error_bar_confidence_interval – The confidence interval the error bars in the scatter plot represents.

  • +
+
+
Returns:
+

A Scatter3d plot of the training data for the given metric.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.plotting.histogram3d.html b/_autosummary/axtreme.plotting.histogram3d.html new file mode 100644 index 00000000..a0cf7abf --- /dev/null +++ b/_autosummary/axtreme.plotting.histogram3d.html @@ -0,0 +1,559 @@ + + + + + + + + + axtreme.plotting.histogram3d - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.plotting.histogram3d

+

3D histogram plotting function.

+

Plotly does not have a plotly.graph_objects.Histogram3d object, this is an attempt to remedy that. +The closest is plotly.graph_objects.Histogram2d, but that creates a 2D heatmap.

+

See Also: +- https://github.com/serge-tochilov/barchart3d-plotly +- https://github.com/AymericFerreira/Plotly_barchart3D +- https://community.plotly.com/t/how-to-do-a-3d-bar-chart-if-possible/32287/5

+

Functions

+
+ + + + + + + + + +

histogram3d(samples, *[, n_bins, bounds, ...])

Generate a 3D figure of a 2D histogram of the input samples.

histogram_surface3d(samples, *[, n_bins, ...])

Generate a 3D figure of a 2D histogram of the input samples.

+
+
+
+axtreme.plotting.histogram3d.histogram3d(samples: ndarray[tuple[int, int], dtype[float64]], *, n_bins: int = 20, bounds: Sequence[tuple[float, float]] | None = None, density: bool = True, flatshading: bool = True, show: bool = False, mesh3d_kwargs: dict[str, Any] | None = None, layout_kwargs: dict[str, Any] | None = None) Figure
+

Generate a 3D figure of a 2D histogram of the input samples.

+

Computes a 2D histogram that is then plotted in 3D as a 3D bar chart (confusing naming…).

+
+
Parameters:
+
    +
  • samples – An array of shape (n_samples, 2) of samples to compute the histogram of.

  • +
  • n_bins – The number of bins to use in each dimension.

  • +
  • bounds – An array of shape (2, 2) of the bounds of the histogram: ((x_min, x_max), (y_min, y_max)). If None, the +bounds are handled by numpy.histogramdd.

  • +
  • density – If True, the histogram is normalized to form a probability density function.

  • +
  • flatshading – If True, the 3D bars are shaded smoothly.

  • +
  • show – If True, the figure is displayed.

  • +
  • mesh3d_kwargs – A dictionary of keyword arguments to pass to the plotly Mesh3d object.

  • +
  • layout_kwargs – A dictionary of keyword arguments to pass to the update_layout method of the figure.

  • +
+
+
Returns:
+

A plotly figure of the 3D histogram. If show is True, the figure is also displayed.

+
+
+
+ +
+
+axtreme.plotting.histogram3d.histogram_surface3d(samples: ndarray[tuple[int, int], dtype[float64]], *, n_bins: int = 20, bounds: Sequence[tuple[float, float]] | None = None, density: bool = True, show: bool = False, surface3d_kwargs: dict[str, Any] | None = None, layout_kwargs: dict[str, Any] | None = None) Figure
+

Generate a 3D figure of a 2D histogram of the input samples.

+

Computes a 2D histogram that is then plotted in 3D as a surface plot.

+
+
Parameters:
+
    +
  • samples – An array of shape (n_samples, 2) of samples to compute the histogram of.

  • +
  • n_bins – The number of bins to use in each dimension.

  • +
  • bounds – An array of shape (2, 2) of the bounds of the histogram: ((x_min, x_max), (y_min, y_max)). If None, the +bounds are handled by numpy.histogramdd.

  • +
  • density – If True, the histogram is normalized to form a probability density function.

  • +
  • show – If True, the figure is displayed.

  • +
  • surface3d_kwargs – A dictionary of keyword arguments to pass to the plotly Surface3d object.

  • +
  • layout_kwargs – A dictionary of keyword arguments to pass to the update_layout method of the figure.

  • +
+
+
Returns:
+

A plotly figure of the 3D histogram. If show is True, the figure is also displayed.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.plotting.html b/_autosummary/axtreme.plotting.html new file mode 100644 index 00000000..5875a102 --- /dev/null +++ b/_autosummary/axtreme.plotting.html @@ -0,0 +1,486 @@ + + + + + + + + + axtreme.plotting - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.plotting

+

Modules

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

doe

Helper function for plotting DoE behaviour.

gp_fit

Plotting module for visualizing how well the GP fits the data.

histogram3d

3D histogram plotting function.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.html b/_autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.html new file mode 100644 index 00000000..ef5bdbd8 --- /dev/null +++ b/_autosummary/axtreme.qoi.gp_bruteforce.GPBruteForce.html @@ -0,0 +1,669 @@ + + + + + + + + + GPBruteForce - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

GPBruteForce

+
+
+class axtreme.qoi.gp_bruteforce.GPBruteForce(env_iterable: Iterable[Tensor], input_transform: InputTransform | None = None, outcome_transform: OutcomeTransform | None = None, posterior_sampler: PosteriorSampler | None = None, *, erd_samples_per_period: int = 1, shared_surrogate_base_samples: bool = False, device: device | None = None, no_grad: bool = True, seed: int | None = None)
+

Bases: MeanVarPosteriorSampledEstimates, QoIEstimator

+

Estimate the QoI for an extreme response distribution, using a surrogate model.

+

Uses a full periods of environment samples, and passes each sample through the surrogate.

+

Overview of the algorithem:

+
    +
  • Take n periods of environment data points.

  • +
  • Use the surrogate model to estimate the likely response distribution at each point (the posterior).

  • +
  • Take n_posterior_samples of the posterior, each representing a guess at what the true simulator is.

  • +
  • For each posterior sample:

    +
      +
    • Simulate the response seen at each data point.

    • +
    • Find the largest response in each period. Each of these is a sample of that posterior’s ERD.

    • +
    • Calculate the QoI based on these ERD samples.

    • +
    +
  • +
  • Return the QoIs calculated by each posterior sample.

  • +
+

Uncertainty in the results comes from three sources:

+
    +
  • The envirionment samples used.

  • +
  • Uncertainty in the GP and the posterior samples used.

  • +
  • Randomness from sampling the surrogates output distribution.

  • +
+
+
Optimisation Notes:

GPBruteForce is not smooth w.r.t to smooth changes in the model (e.g like provided By QoILookAhead).

+
+
+
+

Todo

+

Provide reference to the gpbruteforce.md file in docs so it renders (sw 2024-11-29).

+
+
+
+__init__(env_iterable: Iterable[Tensor], input_transform: InputTransform | None = None, outcome_transform: OutcomeTransform | None = None, posterior_sampler: PosteriorSampler | None = None, *, erd_samples_per_period: int = 1, shared_surrogate_base_samples: bool = False, device: device | None = None, no_grad: bool = True, seed: int | None = None) None
+

Initialise the QOI estimator.

+
+
Parameters:
+
    +
  • env_iterable

    An iterable that produces the env data to be used. Typically this is a DataLoader.

    +
      +
    • The iterable contains batches of shape (n_periods, batch_size, d).

    • +
    • Combining all of the batch should produce the shape (n_periods, period_len, d).

    • +
    • This is an iterable because predictions often need to be made in batches for memory reasons.

    • +
    • If your data is small, you can process it all at once by passing [data], where data is a tensor.

    • +
    +

  • +
  • input_transform – Transforms that should be applied to the env_samples before being passed to the model.

  • +
  • outcome_transform – Transforms that should be applied to the output of the model before they are used.

  • +
  • posterior_sampler

    The sampler to use to draw samples from the posterior of the GP.

    +
      +
    • n_posterior_samples is set in the PosteriorSampler.

    • +
    +
    +

    Note

    +

    If env_iterable contains batches, a batch-compatible sampler, such as +NormalIndependentSampler, should be chosen.

    +
    +

  • +
  • erd_samples_per_period – Number of ERD samples created from a single period of data. This can reduce the +noise of sampling the response drawn from the surrogate’s response distribution (at a point ‘x’).

  • +
  • shared_surrogate_base_samples

    If True, all n_posterior_samples will use the same base samples when +sampling the surrogate’s response output. As a result, the posterior samples are responsible for any +difference in ERD distribution (e.g., surrogate sampling noise no longer contributes).

    +
      +
    • Set to False: Better shows overall uncertainty in QoI.

    • +
    • Set to True: Shows only uncertainty caused by GP uncertainty.

    • +
    +

  • +
  • device – The device that the model should be run on.

  • +
  • no_grad – Whether to disable gradient tracking for this QOI calculation.

  • +
  • seed – The seed to use for the random number generator. If None, no seed is set.

  • +
+
+
+
+ +

Methods

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

__init__(env_iterable[, input_transform, ...])

Initialise the QOI estimator.

mean(x)

Function that computes the mean of the estimates produced by using self.posterior_sampler.

posterior_samples_erd_samples(model)

Returns the erd samples created by each posterior sample.

sample_surrogate(params[, n_samples, ...])

Create the surrogate model for a given set of input parameters, and sample response of the surrogate.

var(x)

Function that computes the variance of the estimates produced by using self.posterior_sampler.

+
+

Attributes

+
+ + + + + + +

posterior_sampler

+
+
+
+posterior_samples_erd_samples(model: Model) Tensor
+

Returns the erd samples created by each posterior sample.

+

__call__ uses these erd sample to create a QoI estimate per posterior.

+
+
Parameters:
+

model – The GP model to use for the QOI estimation. It should have output dimension 2 which represents the +location and scale of a Gumbel distribution.

+
+
Returns:
+

The erd samples obtained for each function (posterior sample) obtianed from the GP. +Shape: (n_posterior_samples, n_periods * erd_samples_per_period)

+
+
Return type:
+

Tensor

+
+
+
+ +
+
+static sample_surrogate(params: Tensor, n_samples: int = 1, base_sample_broadcast_dims: list[int] | None = None) Tensor
+

Create the surrogate model for a given set of input parameters, and sample response of the surrogate.

+

Typically a GP is used to parameterise the surrogate model at a specific x. The now parameterise model can be +run multiple times to get different realisations of the stochastic response.

+
+
Parameters:
+
    +
  • params – (*b, p) tensor of parameters. The last dimesion is expected to contain the parameters required to

  • +
  • dimension. (instantiate a single surrogate model. All other dimensions are optional batch)

  • +
  • n_samples – The number of samples to draw from the surrogate model at a single x point.

  • +
  • base_sample_broadcast_dims

    List of indexes in (*b). Base samples will be shared (broadcast) across these +dimension of *b. For example:

    +
      +
    • params.shape is (n_posterior_samples, n_periods, batch_size, n_params).

      +
        +
      • *b = (n_posterior_samples, n_periods, batch_size)

      • +
      • p = (n_params)

      • +
      +
    • +
    • You would like to use the same base samples for each n_posterior_samples, so that any difference in +output can be attributed to the difference in the n_params, rather than due to the randomness in the +sample generated by the surrogate mode.

    • +
    • By setting base_sample_broadcast_dims=[0] the base samples used would be of shape +(1, n_periods, batch_size), which would achieve the desired effect.

    • +
    +

  • +
+
+
Returns:
+

tensor of (n_samples, *b) representing the response of the surrogate model.

+
+
+
+

Todo

+

The base_sample_broadcast_dims behaviour is challenging to describe now that is in this function rather +than in context. Alternately base samples could be directly applied like in +posterior.rsample_from_base_samples. We have avoid this so complexity is contained here for now.

+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.gp_bruteforce.html b/_autosummary/axtreme.qoi.gp_bruteforce.html new file mode 100644 index 00000000..fee4fe29 --- /dev/null +++ b/_autosummary/axtreme.qoi.gp_bruteforce.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.qoi.gp_bruteforce - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.qoi.gp_bruteforce

+

GPBruteForce calculates QoIs by applying the surrogate to each env sample in the period.

+

Classes

+
+ + + + + + +

GPBruteForce(env_iterable[, ...])

Estimate the QoI for an extreme response distribution, using a surrogate model.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.html b/_autosummary/axtreme.qoi.html new file mode 100644 index 00000000..256a929f --- /dev/null +++ b/_autosummary/axtreme.qoi.html @@ -0,0 +1,488 @@ + + + + + + + + + axtreme.qoi - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.qoi

+

Modules

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

gp_bruteforce

GPBruteForce calculates QoIs by applying the surrogate to each env sample in the period.

marginal_cdf_extrapolation

MarginalCDFExtrapolation calculates QoIs by estimating the behaviour of a single timestep, and extrapolating.

qoi_estimator

Module for quantity of interest Quantity of Interest estimator protocol.

+
+
+ +
+
+ +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.html b/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.html new file mode 100644 index 00000000..4ea0f653 --- /dev/null +++ b/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation.html @@ -0,0 +1,624 @@ + + + + + + + + + MarginalCDFExtrapolation - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

MarginalCDFExtrapolation

+
+
+class axtreme.qoi.marginal_cdf_extrapolation.MarginalCDFExtrapolation(env_iterable: Iterable[Tensor] | Iterable[list[Tensor]], period_len: int, quantile: Tensor | None = None, input_transform: InputTransform | None = None, outcome_transform: OutcomeTransform | None = None, posterior_sampler: PosteriorSampler | None = None, response_distribution: type[Distribution] = Gumbel, quantile_accuracy: Tensor | None = None, dtype: dtype = torch.float64, *, device: device | None = None, no_grad: bool = True)
+

Bases: MeanVarPosteriorSampledEstimates, QoIEstimator

+

Estimate an ERD QoI using the marginal CDF for a single timestep.

+
+
Basic Idea:
    +
  • +
    Get the marginal CDF of the response for a single timestep (e.g. 1 hour).

    Marginal CDF: The CDF after marginalising out all sources of randomness within a timestep. E.g if you +considered all the variablity in a single timestep (e.g all the different weather conditions), collected +the different CDFs they produce, and then averaged them, you would have the marginal CDF.

    +
    +
    +
  • +
  • +
    Using the average CDF you can then calculate:
      +
    • +
      “The probablity that a response of size y won’t be exceeded in 1 hour” as follows:
        +
      • \(CDF(y = .8) = .5\)

      • +
      +
      +
      +
    • +
    • +
      “The probablity that a response of size y won’t be exceeded in 2 hours” as follows:
        +
      • [Prb not exceeded in hour one] AND [Prb not exceeded in hour two]

      • +
      • \(CDF(y = .8) * CDF(y = .8) = .5 * .5 = .25\)

      • +
      +
      +
      +
    • +
    • +
      “The probablity that a response of size y won’t be exceeded in N hours” as follows:
        +
      • \(CDF(y = .8)^N = (.5)^N\)

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+

This is possible because we are using the ‘average’ timestep, which is the same for all timesteps.

+
+
Strengths:
    +
  • Once the ‘average’ CDF has been obtained, very large values of N can be calculated quickly.

  • +
+
+
Challenge:
    +
  • Need to obtain the ‘average’ CDF, and it must be very accurate.

  • +
+
+
+

See [#TODO(sw 2024_11_4) put in link to pre-print] for details.

+
+
+__init__(env_iterable: Iterable[Tensor] | Iterable[list[Tensor]], period_len: int, quantile: Tensor | None = None, input_transform: InputTransform | None = None, outcome_transform: OutcomeTransform | None = None, posterior_sampler: PosteriorSampler | None = None, response_distribution: type[Distribution] = Gumbel, quantile_accuracy: Tensor | None = None, dtype: dtype = torch.float64, *, device: device | None = None, no_grad: bool = True) None
+

Initialise the QOI estimator.

+
+
Parameters:
+
    +
  • env_iterable

    An interable that produces the env data to be used. Typically this is a DataLoader. +Supports standard env data, and weighted env data (e.g Importance sampled).

    +
      +
    • Standards env data: Expects tensor of shape (batch_size, d)

    • +
    • Weighted data: Expectes list of tensors.

      +
      +
        +
      • The first: the env data of shape (batch_size,d).

      • +
      • The second item: the weight, of shape (batch_size,).

      • +
      +
      +
    • +
    +

  • +
  • period_len – The number of env samples in the period of interest.

  • +
  • quantile – Shape (,). The quantile of the ERD to be estimate (the QoI). Should be within range (0,1). +default .5.

  • +
  • input_transform – transforms that should be applied to the env_samples before being passed to the model

  • +
  • outcome_transform – transforms that should be applied to the output of the model before they are used

  • +
  • posterior_sampler

    The sampler to use to draw samples from the posterior of the GP.

    +
      +
    • n_posterior_samples: is set in the PosteriorSampler

    • +
    • NOTE: if env_iterable contains batches, a batch compatible sampler such as +NormalIndependentSampler or “ut_sampler” should be selected.

    • +
    +

  • +
  • response_distribution – The distribution which models the stochastic response of the simulation at a single +input point.

  • +
  • quantile_accuracy – shape (,). Default value .01. Internally, optimisation is used to find the quantile. +The optimiser is allowed to terminate once in the region quantile +/- quantile_accuracy. The greater +the accuracy required, the longer the optimisation will take. Typically other sources of uncertainty +produce far greater uncertainty.

  • +
  • dtype – The dtype used for the distribution. This has implications for the numerical accuracy possible.

  • +
  • device – The device QoI should be performed on.

  • +
  • no_grad – If gradient requires tracking through this QOI calculation.

  • +
+
+
+
+ +

Methods

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

__init__(env_iterable, period_len[, ...])

Initialise the QOI estimator.

mean(x)

Function that computes the mean of the estimates produced by using self.posterior_sampler.

var(x)

Function that computes the variance of the estimates produced by using self.posterior_sampler.

+
+

Attributes

+
+ + + + + + +

posterior_sampler

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.html b/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.html new file mode 100644 index 00000000..f53ea018 --- /dev/null +++ b/_autosummary/axtreme.qoi.marginal_cdf_extrapolation.html @@ -0,0 +1,561 @@ + + + + + + + + + axtreme.qoi.marginal_cdf_extrapolation - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.qoi.marginal_cdf_extrapolation

+

MarginalCDFExtrapolation calculates QoIs by estimating the behaviour of a single timestep, and extrapolating.

+

Functions

+
+ + + + + + + + + +

acceptable_timestep_error(q, period_len[, atol])

Maximum possible single timestep error while still producing required accuracy in period estimate.

q_to_qtimestep(q, period_len)

Convert a long term quantile to an equivalent single timestep quantile.

+
+

Classes

+
+ + + + + + +

MarginalCDFExtrapolation(env_iterable, ...)

Estimate an ERD QoI using the marginal CDF for a single timestep.

+
+
+
+axtreme.qoi.marginal_cdf_extrapolation.acceptable_timestep_error(q: float, period_len: int, atol: float = 0.01) float
+

Maximum possible single timestep error while still producing required accuracy in period estimate.

+

We often make estimates for a single timestep, and scale them to a period (many timesteps). e.g. +q = q_timestep^period_len. Errors in the single timestep estimates compound. This function returns the largest +error possible to a single timestep to still be within the required accuracy in the period estimate.

+
+
Parameters:
+
    +
  • q – long term quantile being estimated.

  • +
  • period_len – the number of timesteps that make up the period of interest.

  • +
  • atol – the maximum absolute error acceptable in q

  • +
+
+
Returns:
+

The maximum absolute error acceptable in the q_timestep estimate.

+
+
+
+ +
+
+axtreme.qoi.marginal_cdf_extrapolation.q_to_qtimestep(q: float, period_len: int) float
+

Convert a long term quantile to an equivalent single timestep quantile.

+
+
Parameters:
+
    +
  • q – long term quantile being estimated.

  • +
  • period_len – the number of timesteps that make up the period of interest.

  • +
+
+
Returns:
+

The equivalent quantile for a single timestep with error +-

+
+
+
+

Note

+

This funciton exists because there were numerical concerns for this process. Having a function allows us to +document them in tests. It is appropriately accuract for very large periods. Periods of 1e13 creates an error of +less that 1e-3 in q (the full quantile estimate). See +test/qoi/test_margianl_cdf_extpolation/test_q_to_qtimestep_numerical_precision_period_increase for details.

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.html b/_autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.html new file mode 100644 index 00000000..b640d4e7 --- /dev/null +++ b/_autosummary/axtreme.qoi.qoi_estimator.QoIEstimator.html @@ -0,0 +1,564 @@ + + + + + + + + + QoIEstimator - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

QoIEstimator

+
+
+class axtreme.qoi.qoi_estimator.QoIEstimator(*args, **kwargs)
+

Bases: Protocol

+

A protocol for quantity of interest (QoI) estimators.

+
+
+__init__(*args, **kwargs)
+
+ +

Methods

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

__init__(*args, **kwargs)

mean(x)

Function that computes the mean of the QoI estimates (the output of the call() method).

var(x)

Function that computes the variance of the QoI estimates (the output of the call() method).

+
+
+
+mean(x: Tensor) Tensor
+

Function that computes the mean of the QoI estimates (the output of the call() method).

+

For many applications this should just be using a default implementation that computes the mean. +E.g using torch.mean(x).

+

However, in some special cases, it might be useful to provide a custom implementation +to give a more accurate estimate. E.g. when UTSampler is used.

+
+
Parameters:
+

x – A tensor of QoI estimates with shape (number_of_estimates,).

+
+
Returns:
+

The mean of the QoI estimates. Should be a scalar.

+
+
Return type:
+

torch.Tensor

+
+
+
+ +
+
+var(x: Tensor) Tensor
+

Function that computes the variance of the QoI estimates (the output of the call() method).

+

For many applications this should just be using a default implementation that computes the variance. +E.g. using torch.var(x).

+

However, in some special cases, it might be useful to provide a custom implementation +to give a more accurate estimate. E.g. when UTSampler is used.

+
+
Parameters:
+

x – A tensor of QoI estimates with shape (number_of_estimates,).

+
+
Returns:
+

The variance of the QoI estimates. Should be a scalar.

+
+
Return type:
+

torch.Tensor

+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.qoi.qoi_estimator.html b/_autosummary/axtreme.qoi.qoi_estimator.html new file mode 100644 index 00000000..29d299ea --- /dev/null +++ b/_autosummary/axtreme.qoi.qoi_estimator.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.qoi.qoi_estimator - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.qoi.qoi_estimator

+

Module for quantity of interest Quantity of Interest estimator protocol.

+

Classes

+
+ + + + + + +

QoIEstimator(*args, **kwargs)

A protocol for quantity of interest (QoI) estimators.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.runner.LocalMetadataRunner.html b/_autosummary/axtreme.runner.LocalMetadataRunner.html new file mode 100644 index 00000000..f6ea7a07 --- /dev/null +++ b/_autosummary/axtreme.runner.LocalMetadataRunner.html @@ -0,0 +1,603 @@ + + + + + + + + + LocalMetadataRunner - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

LocalMetadataRunner

+
+
+class axtreme.runner.LocalMetadataRunner(evaluation_function: EvaluationFunction)
+

Bases: Runner

+

Except for the addition of evauation_function this is coppied exactly from ax.runners.SyntheticRunner.

+
+
+__init__(evaluation_function: EvaluationFunction) None
+
+ +

Methods

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

__init__(evaluation_function)

clone()

Create a copy of this Runner.

deserialize_init_args(args[, ...])

Given a dictionary, deserialize the properties needed to initialize the object.

poll_available_capacity()

Checks how much available capacity there is to schedule trial evaluations.

poll_exception(trial)

Returns the exception from a trial.

poll_trial_status(trials)

Checks the status of any non-terminal trials and returns their indices as a mapping from TrialStatus to a list of indices.

run(trial)

Deploys a trial based on custom runner subclass implementation.

run_multiple(trials)

Runs a single evaluation for each of the given trials.

serialize_init_args(obj)

Serialize the properties needed to initialize the object.

stop(trial[, reason])

Stop a trial based on custom runner subclass implementation.

+
+

Attributes

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

db_id

run_metadata_report_keys

A list of keys of the metadata dict returned by run() that are relevant outside the runner-internal impolementation.

staging_required

Whether the trial goes to staged or running state once deployed.

+
+
+
+poll_trial_status(trials: Iterable[BaseTrial]) dict[TrialStatus, set[int]]
+

Checks the status of any non-terminal trials and returns their +indices as a mapping from TrialStatus to a list of indices. Required +for runners used with Ax Scheduler.

+

NOTE: Does not need to handle waiting between polling calls while trials +are running; this function should just perform a single poll.

+
+
Parameters:
+

trials – Trials to poll.

+
+
Returns:
+

A dictionary mapping TrialStatus to a list of trial indices that have +the respective status at the time of the polling. This does not need to +include trials that at the time of polling already have a terminal +(ABANDONED, FAILED, COMPLETED) status (but it may).

+
+
+
+ +
+
+run(trial: BaseTrial) dict[str, Any]
+

Deploys a trial based on custom runner subclass implementation.

+
+
Parameters:
+

trial – The trial to deploy.

+
+
Returns:
+

Dict of run metadata from the deployment process.

+
+
+
+ +
+
+property run_metadata_report_keys: list[str]
+

A list of keys of the metadata dict returned by run() that are +relevant outside the runner-internal impolementation. These can e.g. +be reported in Scheduler.report_results().

+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.runner.html b/_autosummary/axtreme.runner.html new file mode 100644 index 00000000..4a330cc6 --- /dev/null +++ b/_autosummary/axtreme.runner.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.runner - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.runner

+

Additional Runner implementatiions.

+

Classes

+
+ + + + + + +

LocalMetadataRunner(evaluation_function)

Except for the addition of evauation_function this is coppied exactly from ax.runners.SyntheticRunner.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.html b/_autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.html new file mode 100644 index 00000000..9d681fbe --- /dev/null +++ b/_autosummary/axtreme.sampling.base.MeanVarPosteriorSampledEstimates.html @@ -0,0 +1,629 @@ + + + + + + + + + MeanVarPosteriorSampledEstimates - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

MeanVarPosteriorSampledEstimates

+
+
+class axtreme.sampling.base.MeanVarPosteriorSampledEstimates(*args, **kwargs)
+

Bases: Protocol

+

This is a protocol for classes that computes estimates using a PosteriorSampler.

+

Some posterior samplers require that mean and variance of the estimates calculated by sampling from it need to be +calculated in a special way. This protocol allows for these special methods to be easier to be used on the +outside of the class that inherits from this protocol. One example of a case where this is useful is when using a +posterior sampler in a QoIEstimator. For more information check issue #132.

+

Example of usage:

+
class MyClass(MeanVarPosteriorSampledEstimates):
+    def __init__(self, posterior_sampler: PosteriorSampler):
+        self.posterior_sampler = posterior_sampler
+
+    def f(self, x: torch.Tensor) -> torch.Tensor:
+        # Some functions that takes the samples and returns a tensor
+        # The dimension representing the posterior_sampling should be preserved.
+        ...
+
+    def foo(self) -> torch.Tensor:
+        #  Get a model and points x to evaluate posterior
+        x: torch.Tensor = ...
+        model: botorch.models.Model = ...
+
+        # Calculating posterior
+        posterior = model.posterior(x)
+
+        # Sampling from the posterior
+        samples = self.posterior_sampler(posterior)
+
+        return self.f(samples)
+
+
+estimator = MyClass(posterior_sampler)
+result = estimator.foo()
+
+# Using the mean and var methods from MeanVarPosteriorSampledEstimates
+# This will use the mean and var methods from the posterior_sampler if they are available.
+mean = estimator.mean(result)
+var = estimator.var(result)
+
+
+
+
+__init__(*args, **kwargs)
+
+ +

Methods

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

__init__(*args, **kwargs)

mean(x)

Function that computes the mean of the estimates produced by using self.posterior_sampler.

var(x)

Function that computes the variance of the estimates produced by using self.posterior_sampler.

+
+

Attributes

+
+ + + + + + +

posterior_sampler

+
+
+
+mean(x: Tensor) Tensor
+

Function that computes the mean of the estimates produced by using self.posterior_sampler.

+

The dimension representing the posterior_sampling should be preserved from the sampling using +self.posterior_sampler to sample a posterior until using this method.

+

For many applications this method will just be using a default implementation that computes the mean. +E.g using torch.mean(x) like in this implementation.

+

However, in some special cases, it might be useful to provide a custom implementation +to give a more accurate estimate. +For instance if one uses UTSampler to sample the posterior +the mean should be estimated as a weighted sum of the estimates.

+

This function uses the mean method of the posterior_sampler if it is available, +otherwise it uses the default implementation.

+
+
Parameters:
+

x – A tensor of the estimates with shape (num_posterior_samples,).

+
+
Returns:
+

The mean of the the estimates. Should be a scalar with shape ().

+
+
Return type:
+

torch.Tensor

+
+
+
+ +
+
+var(x: Tensor) Tensor
+

Function that computes the variance of the estimates produced by using self.posterior_sampler.

+

The dimension representing the posterior_sampling should be preserved from the sampling using +self.posterior_sampler to sample a posterior until using this method.

+

For many applications this method will just be using a default implementation that computes the variance. +E.g using torch.var(x) like in this implementation.

+

However, in some special cases, it might be useful to provide a custom implementation +to give a more accurate estimate. +For instance if one uses UTSampler to sample the posterior +the variance should be estimated in a special way.

+

This function uses the variance method of the posterior_sampler if it is available, +otherwise it uses the default implementation.

+
+
Parameters:
+

x – A tensor of the estimates with shape (num_posterior_samples,).

+
+
Returns:
+

The variance of the the estimates. Should be a scalar with shape ().

+
+
Return type:
+

torch.Tensor

+
+
+
+ +
+
+posterior_sampler: PosteriorSampler
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.base.PosteriorSampler.html b/_autosummary/axtreme.sampling.base.PosteriorSampler.html new file mode 100644 index 00000000..e384875b --- /dev/null +++ b/_autosummary/axtreme.sampling.base.PosteriorSampler.html @@ -0,0 +1,563 @@ + + + + + + + + + PosteriorSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

PosteriorSampler

+
+
+class axtreme.sampling.base.PosteriorSampler(*args, **kwargs)
+

Bases: Protocol

+

Defines the protocol for sampler function.

+

This follows the definition of the MCSampler.forward() method, but allows for simple function based implementations.

+
+

Note

+

Function using posteriors should check if there are special mean and var methods if they support posterior +samplers that require them (e.g UT). See note below for details.

+
+

Notes on samplers the require special aggregation of results:

+
    +
  • We use a surrogate model to estimate a Quantity of Interest (QOI), and provide uncertainty of that estimate. +Typically it is challenging to calculate this on the posterior directly, so often we take samples of the +posterior and calculate the value of interest using those. We can then combine those estimates to give the QOI +mean/variance for the overall posterior.

  • +
  • Some methods (e.g UT) select posterior samples in a special way which means less samples are needed. The +calculations for each of these samples then need to be combined in a special way to estimate the QOI +mean/variance for the overall posterior. If such special methods are needed, they should be implement on the +posterior sampler with the following signature.

    +
    def mean(self, x: torch.Tensor) -> torch.Tensor: ...
    +def var(self, x: torch.Tensor) -> torch.Tensor: ...
    +
    +
    +

    Where

    +
      +
    • x is the scores (e.g QOIs) for each posterior sample.

      +
        +
      • It is expected to be of shape (batch_shape)

      • +
      +
      +

      Todo

      +

      Batching gets confusing here, how should we do UT of multiple batch dims? Is it only +ever flat, should we say that here?

      +
      +
        +
      • Output is a scalar.

      • +
      +
    • +
    +
  • +
+
+

Todo

+

Need to fix/revisit this. Feel wrong that functions that use posterior need to check for some optional methods +that “might” be there (and those functions are not programmatically defined as part of the protocol). Extra +info in #132.

+
+

Note

+

The functions are not on the protocol because we want MCSampler from botorch to fall into protocol +definition.

+
+
+
+
+__init__(*args, **kwargs)
+
+ +

Methods

+
+ + + + + + +

__init__(*args, **kwargs)

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.base.html b/_autosummary/axtreme.sampling.base.html new file mode 100644 index 00000000..f6b72b14 --- /dev/null +++ b/_autosummary/axtreme.sampling.base.html @@ -0,0 +1,484 @@ + + + + + + + + + axtreme.sampling.base - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.sampling.base

+

Defines the interface posterior samplers are expected to adhear to.

+

Classes

+
+ + + + + + + + + +

MeanVarPosteriorSampledEstimates(*args, **kwargs)

This is a protocol for classes that computes estimates using a PosteriorSampler.

PosteriorSampler(*args, **kwargs)

Defines the protocol for sampler function.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.html b/_autosummary/axtreme.sampling.html new file mode 100644 index 00000000..dbf71e24 --- /dev/null +++ b/_autosummary/axtreme.sampling.html @@ -0,0 +1,493 @@ + + + + + + + + + axtreme.sampling - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.sampling

+

Module for sampling from a posterior distribution.

+

Modules

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

base

Defines the interface posterior samplers are expected to adhear to.

independent_sampler

Base class for sampling methods that ignore covariance between different input points.

mean_sampler

Module for the MeanPosteriorSampler class.

normal_independent_sampler

Module for the NormalIndependentSampler class.

ut_sampler

Module for the UTSampler class for sampling a posterior using the Unscented Transform.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.html b/_autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.html new file mode 100644 index 00000000..77fbe174 --- /dev/null +++ b/_autosummary/axtreme.sampling.independent_sampler.IndependentMCSampler.html @@ -0,0 +1,749 @@ + + + + + + + + + IndependentMCSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

IndependentMCSampler

+
+
+class axtreme.sampling.independent_sampler.IndependentMCSampler(sample_shape: Size, seed: int | None = None, **kwargs: Any)
+

Bases: MCSampler, ABC

+

Abstract base class for MCSamplers that independantly apply the same set of base samples at each x point.

+

This should be used when you want to ignore the covariance between different x points, and sample the X output +space independently.

+
+

Note

+

Dimensions of the posterior are described using botorch notation (detailed in glassary.md) where:

+
    +
  • *b: batch shape (can have arbitrary dimensionality).

  • +
  • n: the number of x input points.

  • +
  • m: dimensionality of targets space.

  • +
+

For example:

+
    +
  • MultivariateNormal: (*b, n)

  • +
  • MultitaskMultivariateNormal: (*b, n, m)

  • +
+
+
+
Dev Notes:
    +
  • Is the shape of the base samples up to us to define, or are there some other parts of the system that expect +MCSampler to have certain shape.

    +
    +

    Answer: MCSampler does not define base_sample - we can do what we want.

    +
    +
  • +
  • MultivariateNormal and MultitaskMultivariateNormal both requires shape (*sample_shape, *posterior.shape() +for base_samples in posterior.rsample_from_base_samples

    +
      +
    • For MultitaskMultivariateNormal: posterior.shape() = (*b,n,m)

    • +
    • For MultivariateNormal: posterior.shape() = (*b,n)

    • +
    +
  • +
+
+
+

Design decision: we decide to make m explicit throughout.

+
+
    +
  • e.g base samples will always have shape (*sample_shape,m)

  • +
  • This makes our code cleaner. When then convert back to implicit m dimension when calling +posterior.rsample_from_base_samples

  • +
+
+
+
+__init__(sample_shape: Size, seed: int | None = None, **kwargs: Any) None
+

Abstract base class for samplers.

+
+
Parameters:
+
    +
  • sample_shape – The sample_shape of the samples to generate. The full shape +of the samples is given by posterior._extended_shape(sample_shape).

  • +
  • seed – An optional seed to use for sampling.

  • +
  • **kwargs – Catch-all for deprecated kwargs.

  • +
+
+
+
+ +

Methods

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

__init__(sample_shape[, seed])

Abstract base class for samplers.

add_module(name, module)

Add a child module to the current module.

apply(fn)

Apply fn recursively to every submodule (as returned by .children()) as well as self.

bfloat16()

Casts all floating point parameters and buffers to bfloat16 datatype.

buffers([recurse])

Return an iterator over module buffers.

children()

Return an iterator over immediate children modules.

compile(*args, **kwargs)

Compile this Module's forward using torch.compile().

cpu()

Move all model parameters and buffers to the CPU.

cuda([device])

Move all model parameters and buffers to the GPU.

double()

Casts all floating point parameters and buffers to double datatype.

eval()

Set the module in evaluation mode.

extra_repr()

Set the extra representation of the module.

float()

Casts all floating point parameters and buffers to float datatype.

forward(posterior)

Draw samples from the posterior, treating each of the n input points as independant.

get_buffer(target)

Return the buffer given by target if it exists, otherwise throw an error.

get_extra_state()

Return any extra state to include in the module's state_dict.

get_parameter(target)

Return the parameter given by target if it exists, otherwise throw an error.

get_submodule(target)

Return the submodule given by target if it exists, otherwise throw an error.

half()

Casts all floating point parameters and buffers to half datatype.

ipu([device])

Move all model parameters and buffers to the IPU.

load_state_dict(state_dict[, strict, assign])

Copy parameters and buffers from state_dict into this module and its descendants.

modules()

Return an iterator over all modules in the network.

named_buffers([prefix, recurse, ...])

Return an iterator over module buffers, yielding both the name of the buffer as well as the buffer itself.

named_children()

Return an iterator over immediate children modules, yielding both the name of the module as well as the module itself.

named_modules([memo, prefix, remove_duplicate])

Return an iterator over all modules in the network, yielding both the name of the module as well as the module itself.

named_parameters([prefix, recurse, ...])

Return an iterator over module parameters, yielding both the name of the parameter as well as the parameter itself.

parameters([recurse])

Return an iterator over module parameters.

register_backward_hook(hook)

Register a backward hook on the module.

register_buffer(name, tensor[, persistent])

Add a buffer to the module.

register_forward_hook(hook, *[, prepend, ...])

Register a forward hook on the module.

register_forward_pre_hook(hook, *[, ...])

Register a forward pre-hook on the module.

register_full_backward_hook(hook[, prepend])

Register a backward hook on the module.

register_full_backward_pre_hook(hook[, prepend])

Register a backward pre-hook on the module.

register_load_state_dict_post_hook(hook)

Register a post hook to be run after module's load_state_dict is called.

register_module(name, module)

Alias for add_module().

register_parameter(name, param)

Add a parameter to the module.

register_state_dict_pre_hook(hook)

Register a pre-hook for the state_dict() method.

requires_grad_([requires_grad])

Change if autograd should record operations on parameters in this module.

set_extra_state(state)

Set extra state contained in the loaded state_dict.

share_memory()

See torch.Tensor.share_memory_().

state_dict(*args[, destination, prefix, ...])

Return a dictionary containing references to the whole state of the module.

to(*args, **kwargs)

Move and/or cast the parameters and buffers.

to_empty(*, device[, recurse])

Move the parameters and buffers to the specified device without copying storage.

train([mode])

Set the module in training mode.

type(dst_type)

Casts all parameters and buffers to dst_type.

xpu([device])

Move all model parameters and buffers to the XPU.

zero_grad([set_to_none])

Reset gradients of all model parameters.

+
+

Attributes

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

T_destination

call_super_init

dump_patches

training

+
+
+
+forward(posterior: Posterior) Tensor
+

Draw samples from the posterior, treating each of the n input points as independant.

+
+
Parameters:
+

posterior – The posterior which should be sampled.

+
+
Returns:
+

(*sample_shape, *b, n, m) where: +- *b: is the posterior batch shape +- n: number of input points in posterior +- m: dimensionality of target

+

NOTE: While MultitaskMultivariateNormal and MultivariateNormal have different shapes ((*b,n,m) and (*b,n)) +the output of this function is always of shape (*sample_shape, *b, n, m). +This is consistent with the behaviour of MCSampler.

+

+
+
Return type:
+

Returns a samples of the posterior with shape

+
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.independent_sampler.html b/_autosummary/axtreme.sampling.independent_sampler.html new file mode 100644 index 00000000..df9e6f8d --- /dev/null +++ b/_autosummary/axtreme.sampling.independent_sampler.html @@ -0,0 +1,529 @@ + + + + + + + + + axtreme.sampling.independent_sampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.sampling.independent_sampler

+

Base class for sampling methods that ignore covariance between different input points.

+

Todo: TODO +- For MultiTask models (e.g GPs with multiple targets that are not indpendant), this covariance should be considered. +- Currently ALL covariance is ignored.

+

Functions

+
+ + + + + + +

diagonalize_distribution(posterior)

Diagonalize the distribution of the posterior.

+
+

Classes

+
+ + + + + + +

IndependentMCSampler(sample_shape[, seed])

Abstract base class for MCSamplers that independantly apply the same set of base samples at each x point.

+
+
+
+axtreme.sampling.independent_sampler.diagonalize_distribution(posterior: GPyTorchPosterior) GPyTorchPosterior
+

Diagonalize the distribution of the posterior.

+

The points in the posterior need to be treated as independent from each other. +Therefore we want the covariance matrix to be diagonal.

+
+
Parameters:
+

posterior – The posterior to diagonalize.

+
+
Returns:
+

The diagonalized posterior.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.mean_sampler.MeanSampler.html b/_autosummary/axtreme.sampling.mean_sampler.MeanSampler.html new file mode 100644 index 00000000..2caaf44e --- /dev/null +++ b/_autosummary/axtreme.sampling.mean_sampler.MeanSampler.html @@ -0,0 +1,515 @@ + + + + + + + + + MeanSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

MeanSampler

+
+
+class axtreme.sampling.mean_sampler.MeanSampler(*args, **kwargs)
+

Bases: PosteriorSampler

+

Class for sampling a posterior by returning the mean of the posterior.

+

This is a simple sampler that just returns the mean of the posterior.

+
+
+__init__(*args, **kwargs)
+
+ +

Methods

+
+ + + + + + +

__init__(*args, **kwargs)

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.mean_sampler.html b/_autosummary/axtreme.sampling.mean_sampler.html new file mode 100644 index 00000000..ee02748a --- /dev/null +++ b/_autosummary/axtreme.sampling.mean_sampler.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.sampling.mean_sampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.sampling.mean_sampler

+

Module for the MeanPosteriorSampler class.

+

Classes

+
+ + + + + + +

MeanSampler(*args, **kwargs)

Class for sampling a posterior by returning the mean of the posterior.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.html b/_autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.html new file mode 100644 index 00000000..ede8a548 --- /dev/null +++ b/_autosummary/axtreme.sampling.normal_independent_sampler.NormalIndependentSampler.html @@ -0,0 +1,682 @@ + + + + + + + + + NormalIndependentSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

NormalIndependentSampler

+
+
+class axtreme.sampling.normal_independent_sampler.NormalIndependentSampler(sample_shape: Size, seed: int | None = None, **kwargs: Any)
+

Bases: IndependentMCSampler

+

IndependentMCSampler that randomly generates base samples from a Normal distribution.

+
+
+__init__(sample_shape: Size, seed: int | None = None, **kwargs: Any) None
+

Abstract base class for samplers.

+
+
Parameters:
+
    +
  • sample_shape – The sample_shape of the samples to generate. The full shape +of the samples is given by posterior._extended_shape(sample_shape).

  • +
  • seed – An optional seed to use for sampling.

  • +
  • **kwargs – Catch-all for deprecated kwargs.

  • +
+
+
+
+ +

Methods

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

__init__(sample_shape[, seed])

Abstract base class for samplers.

add_module(name, module)

Add a child module to the current module.

apply(fn)

Apply fn recursively to every submodule (as returned by .children()) as well as self.

bfloat16()

Casts all floating point parameters and buffers to bfloat16 datatype.

buffers([recurse])

Return an iterator over module buffers.

children()

Return an iterator over immediate children modules.

compile(*args, **kwargs)

Compile this Module's forward using torch.compile().

cpu()

Move all model parameters and buffers to the CPU.

cuda([device])

Move all model parameters and buffers to the GPU.

double()

Casts all floating point parameters and buffers to double datatype.

eval()

Set the module in evaluation mode.

extra_repr()

Set the extra representation of the module.

float()

Casts all floating point parameters and buffers to float datatype.

forward(posterior)

Draw samples from the posterior, treating each of the n input points as independant.

get_buffer(target)

Return the buffer given by target if it exists, otherwise throw an error.

get_extra_state()

Return any extra state to include in the module's state_dict.

get_parameter(target)

Return the parameter given by target if it exists, otherwise throw an error.

get_submodule(target)

Return the submodule given by target if it exists, otherwise throw an error.

half()

Casts all floating point parameters and buffers to half datatype.

ipu([device])

Move all model parameters and buffers to the IPU.

load_state_dict(state_dict[, strict, assign])

Copy parameters and buffers from state_dict into this module and its descendants.

modules()

Return an iterator over all modules in the network.

named_buffers([prefix, recurse, ...])

Return an iterator over module buffers, yielding both the name of the buffer as well as the buffer itself.

named_children()

Return an iterator over immediate children modules, yielding both the name of the module as well as the module itself.

named_modules([memo, prefix, remove_duplicate])

Return an iterator over all modules in the network, yielding both the name of the module as well as the module itself.

named_parameters([prefix, recurse, ...])

Return an iterator over module parameters, yielding both the name of the parameter as well as the parameter itself.

parameters([recurse])

Return an iterator over module parameters.

register_backward_hook(hook)

Register a backward hook on the module.

register_buffer(name, tensor[, persistent])

Add a buffer to the module.

register_forward_hook(hook, *[, prepend, ...])

Register a forward hook on the module.

register_forward_pre_hook(hook, *[, ...])

Register a forward pre-hook on the module.

register_full_backward_hook(hook[, prepend])

Register a backward hook on the module.

register_full_backward_pre_hook(hook[, prepend])

Register a backward pre-hook on the module.

register_load_state_dict_post_hook(hook)

Register a post hook to be run after module's load_state_dict is called.

register_module(name, module)

Alias for add_module().

register_parameter(name, param)

Add a parameter to the module.

register_state_dict_pre_hook(hook)

Register a pre-hook for the state_dict() method.

requires_grad_([requires_grad])

Change if autograd should record operations on parameters in this module.

set_extra_state(state)

Set extra state contained in the loaded state_dict.

share_memory()

See torch.Tensor.share_memory_().

state_dict(*args[, destination, prefix, ...])

Return a dictionary containing references to the whole state of the module.

to(*args, **kwargs)

Move and/or cast the parameters and buffers.

to_empty(*, device[, recurse])

Move the parameters and buffers to the specified device without copying storage.

train([mode])

Set the module in training mode.

type(dst_type)

Casts all parameters and buffers to dst_type.

xpu([device])

Move all model parameters and buffers to the XPU.

zero_grad([set_to_none])

Reset gradients of all model parameters.

+
+

Attributes

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

T_destination

call_super_init

dump_patches

training

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.normal_independent_sampler.html b/_autosummary/axtreme.sampling.normal_independent_sampler.html new file mode 100644 index 00000000..25287d6b --- /dev/null +++ b/_autosummary/axtreme.sampling.normal_independent_sampler.html @@ -0,0 +1,484 @@ + + + + + + + + + axtreme.sampling.normal_independent_sampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.sampling.normal_independent_sampler

+

Module for the NormalIndependentSampler class.

+

This module contains the NormalIndependentSampler class, which is a subclass of IndependentMCSampler. +It is used to randomly generate base samples from a Normal distribution and when you want to ignore +the covariance between different x points, and sample a single X output space independently.

+

Classes

+
+ + + + + + +

NormalIndependentSampler(sample_shape[, seed])

IndependentMCSampler that randomly generates base samples from a Normal distribution.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.ut_sampler.UTSampler.html b/_autosummary/axtreme.sampling.ut_sampler.UTSampler.html new file mode 100644 index 00000000..d600f16f --- /dev/null +++ b/_autosummary/axtreme.sampling.ut_sampler.UTSampler.html @@ -0,0 +1,779 @@ + + + + + + + + + UTSampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

UTSampler

+
+
+class axtreme.sampling.ut_sampler.UTSampler(alpha: float = 1, beta: float = 2, kappa_base: float = 3)
+

Bases: IndependentMCSampler

+

Class for sampling a posterior using the Unscented Transform.

+

The Unscented Transform is a method for transforming a distribution through a non-linear function. +The method is based on the Unscented Kalman Filter. +It uses a set of sigma points to estimate the mean and covariance of the transformed distribution.

+
+
+__init__(alpha: float = 1, beta: float = 2, kappa_base: float = 3) None
+

Initializer for the UTSampler.

+
+
Parameters:
+
    +
  • alpha – Scaling parameter for the sigma points. See filterpy.kalman.MerweScaledSigmaPoints.

  • +
  • beta – Parameter for the distribution. +- For Gaussian distributions, beta=2 is optimal. +- See filterpy.kalman.MerweScaledSigmaPoints.

  • +
  • kappa_base – Base parameter for the sigma points. See filterpy.kalman.MerweScaledSigmaPoints.

  • +
+
+
+
+ +

Methods

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

__init__([alpha, beta, kappa_base])

Initializer for the UTSampler.

add_module(name, module)

Add a child module to the current module.

apply(fn)

Apply fn recursively to every submodule (as returned by .children()) as well as self.

bfloat16()

Casts all floating point parameters and buffers to bfloat16 datatype.

buffers([recurse])

Return an iterator over module buffers.

children()

Return an iterator over immediate children modules.

compile(*args, **kwargs)

Compile this Module's forward using torch.compile().

cpu()

Move all model parameters and buffers to the CPU.

cuda([device])

Move all model parameters and buffers to the GPU.

double()

Casts all floating point parameters and buffers to double datatype.

eval()

Set the module in evaluation mode.

extra_repr()

Set the extra representation of the module.

float()

Casts all floating point parameters and buffers to float datatype.

forward(posterior)

Draw samples from the posterior, treating each of the n input points as independant.

get_buffer(target)

Return the buffer given by target if it exists, otherwise throw an error.

get_extra_state()

Return any extra state to include in the module's state_dict.

get_parameter(target)

Return the parameter given by target if it exists, otherwise throw an error.

get_submodule(target)

Return the submodule given by target if it exists, otherwise throw an error.

half()

Casts all floating point parameters and buffers to half datatype.

ipu([device])

Move all model parameters and buffers to the IPU.

load_state_dict(state_dict[, strict, assign])

Copy parameters and buffers from state_dict into this module and its descendants.

mean(transformed_points[, dim])

Estimate the mean of the transformed UT sampled points.

modules()

Return an iterator over all modules in the network.

named_buffers([prefix, recurse, ...])

Return an iterator over module buffers, yielding both the name of the buffer as well as the buffer itself.

named_children()

Return an iterator over immediate children modules, yielding both the name of the module as well as the module itself.

named_modules([memo, prefix, remove_duplicate])

Return an iterator over all modules in the network, yielding both the name of the module as well as the module itself.

named_parameters([prefix, recurse, ...])

Return an iterator over module parameters, yielding both the name of the parameter as well as the parameter itself.

parameters([recurse])

Return an iterator over module parameters.

register_backward_hook(hook)

Register a backward hook on the module.

register_buffer(name, tensor[, persistent])

Add a buffer to the module.

register_forward_hook(hook, *[, prepend, ...])

Register a forward hook on the module.

register_forward_pre_hook(hook, *[, ...])

Register a forward pre-hook on the module.

register_full_backward_hook(hook[, prepend])

Register a backward hook on the module.

register_full_backward_pre_hook(hook[, prepend])

Register a backward pre-hook on the module.

register_load_state_dict_post_hook(hook)

Register a post hook to be run after module's load_state_dict is called.

register_module(name, module)

Alias for add_module().

register_parameter(name, param)

Add a parameter to the module.

register_state_dict_pre_hook(hook)

Register a pre-hook for the state_dict() method.

requires_grad_([requires_grad])

Change if autograd should record operations on parameters in this module.

set_extra_state(state)

Set extra state contained in the loaded state_dict.

share_memory()

See torch.Tensor.share_memory_().

state_dict(*args[, destination, prefix, ...])

Return a dictionary containing references to the whole state of the module.

to(*args, **kwargs)

Move and/or cast the parameters and buffers.

to_empty(*, device[, recurse])

Move the parameters and buffers to the specified device without copying storage.

train([mode])

Set the module in training mode.

type(dst_type)

Casts all parameters and buffers to dst_type.

var(transformed_points[, dim])

Estimate the variance of the transformed UT sampled points.

xpu([device])

Move all model parameters and buffers to the XPU.

zero_grad([set_to_none])

Reset gradients of all model parameters.

+
+

Attributes

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

T_destination

alpha

The alpha parameter defined by filterpy.kalman.MerweScaledSigmaPoints.

beta

The beta parameter defined by filterpy.kalman.MerweScaledSigmaPoints.

call_super_init

dump_patches

kappa_base

The kappa_base parameter related to kappa defined by filterpy.kalman.MerweScaledSigmaPoints.

training

+
+
+
+mean(transformed_points: Tensor, dim: int = 0) Tensor
+

Estimate the mean of the transformed UT sampled points.

+

The UT sampled points are designed together with the weights to estimate the mean of the distribution +When the points are transformed through some function, +the mean of the transformed points is estimated by calculating the weighted sum of the points.

+
+
This will only work correctly if the last points generated using this sampler
    +
  • Have the same number of targets (m) the transformed points.

  • +
  • Were generated using the same alpha, beta, and kappa_base parameters.

  • +
+
+
+
+
Parameters:
+
    +
  • transformed_points – The transformed points to estimate the mean of.

  • +
  • dim – The dimension along which to calculate the mean.

  • +
+
+
Returns:
+

The estimated mean of the distribution.

+
+
+
+ +
+
+var(transformed_points: Tensor, dim: int = 0) Tensor
+

Estimate the variance of the transformed UT sampled points.

+

The UT sampled points are designed together with the weights to estimate the variance of the distribution +When the points are transformed through some function, +the variance of the transformed points is estimated by calculating the weighted sum of the points.

+
+
This will only work correctly if the last points generated using this sampler
    +
  • Have the same number of targets (m) as the transformed points.

  • +
  • Were generated using the same alpha, beta, and kappa_base parameters.

  • +
+
+
+
+
Parameters:
+
    +
  • transformed_points – The transformed points to estimate the variance of.

  • +
  • dim – The dimension along which to calculate the variance.

  • +
+
+
Returns:
+

The estimated variance of the distribution.

+
+
+
+ +
+
+property alpha: float
+

The alpha parameter defined by filterpy.kalman.MerweScaledSigmaPoints.

+
+ +
+
+property beta: float
+

The beta parameter defined by filterpy.kalman.MerweScaledSigmaPoints.

+
+ +
+
+property kappa_base: float
+

The kappa_base parameter related to kappa defined by filterpy.kalman.MerweScaledSigmaPoints.

+

The kappa value used in filterpy.kalman.MerweScaledSigmaPoints is calculated as kappa_base - num_target.

+
+ +
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.sampling.ut_sampler.html b/_autosummary/axtreme.sampling.ut_sampler.html new file mode 100644 index 00000000..578226e4 --- /dev/null +++ b/_autosummary/axtreme.sampling.ut_sampler.html @@ -0,0 +1,545 @@ + + + + + + + + + axtreme.sampling.ut_sampler - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.sampling.ut_sampler

+

Module for the UTSampler class for sampling a posterior using the Unscented Transform.

+

Functions

+
+ + + + + + +

calculate_sigmas(dim, alpha, beta, kappa_base)

Create the sigma points, and the weight for calculating mean and variance.

+
+

Classes

+
+ + + + + + +

UTSampler([alpha, beta, kappa_base])

Class for sampling a posterior using the Unscented Transform.

+
+
+
+axtreme.sampling.ut_sampler.calculate_sigmas(dim: int, alpha: float, beta: float, kappa_base: float) tuple[Tensor, Tensor, Tensor]
+

Create the sigma points, and the weight for calculating mean and variance.

+
+
Parameters:
+
    +
  • dim – dimensionality of the space to produce sigma points for. +E.g The dimensionality of the output of a GP at a sinlge input point.

  • +
  • alpha – Scaling parameter for the sigma points.

  • +
  • beta – Parameter for the distribution. For Gaussian distributions, beta=2 is optimal.

  • +
  • kappa_base – Base parameter for the sigma points.

  • +
+
+
Returns:
+

A tuple of three tensors where,

+
    +
  1. (m,dim) defines signma points, where +- m: is the number of sigma points generated +- dim: is the dimension of those points

  2. +
  3. (m): weights required to combines these signma points for a mean estimate

  4. +
  5. (m): weights required to combines these signma points for a variance estimate

  6. +
+

+
+
+
+

Todo

+
    +
  • does not currently support correlation between t dimensions.

  • +
  • (ks) - For now using filterpy for UT. Might want to implement our own version

  • +
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.simulator.base.Simulator.html b/_autosummary/axtreme.simulator.base.Simulator.html new file mode 100644 index 00000000..295f274c --- /dev/null +++ b/_autosummary/axtreme.simulator.base.Simulator.html @@ -0,0 +1,514 @@ + + + + + + + + + Simulator - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Simulator

+
+
+class axtreme.simulator.base.Simulator(*args, **kwargs)
+

Bases: Protocol

+

A protocol for (simulation) models.

+
+
+__init__(*args, **kwargs)
+
+ +

Methods

+
+ + + + + + +

__init__(*args, **kwargs)

+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.simulator.base.html b/_autosummary/axtreme.simulator.base.html new file mode 100644 index 00000000..b001d11b --- /dev/null +++ b/_autosummary/axtreme.simulator.base.html @@ -0,0 +1,481 @@ + + + + + + + + + axtreme.simulator.base - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.simulator.base

+

Define the simulator interface downsteam axtreme components expect.

+

Classes

+
+ + + + + + +

Simulator(*args, **kwargs)

A protocol for (simulation) models.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.simulator.html b/_autosummary/axtreme.simulator.html new file mode 100644 index 00000000..9d20a60d --- /dev/null +++ b/_autosummary/axtreme.simulator.html @@ -0,0 +1,483 @@ + + + + + + + + + axtreme.simulator - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.simulator

+

Modules

+
+ + + + + + + + + +

base

Define the simulator interface downsteam axtreme components expect.

utils

Helper functions for creating vaid simulators.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.simulator.utils.html b/_autosummary/axtreme.simulator.utils.html new file mode 100644 index 00000000..7ffd66a4 --- /dev/null +++ b/_autosummary/axtreme.simulator.utils.html @@ -0,0 +1,553 @@ + + + + + + + + + axtreme.simulator.utils - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.simulator.utils

+

Helper functions for creating vaid simulators.

+

Functions

+
+ + + + + + + + + +

is_valid_simulator(instance, *[, verbose])

Checks that instance conforms to Simulator protocol AND signature definition.

simulator_from_func(func)

Adds n_simulations_per_point functionality to a a function that takes x inputs, and return simulation values.

+
+
+
+axtreme.simulator.utils.is_valid_simulator(instance: object, *, verbose: bool = False) bool
+

Checks that instance conforms to Simulator protocol AND signature definition.

+

This test only works if the instance has type definitions.

+
+

Note

+

By default, isinstance with @runtime_checkable “will check only the presence of the required methods not +their type signatures!”. See @runtime_checkable docs for details.

+
+
+
Parameters:
+
    +
  • instance – will check if this is a valid Simulator.

  • +
  • verbose – If true will provide information regarding why it does not conform.

  • +
+
+
Returns:
+

True if methods and signatures match

+
+
Return type:
+

bool

+
+
+
+

Note

+
    +
  • Briefly looked at override the __instancecheck__ so isinstance would acheive this result

  • +
  • Apprears __instancecheck__ doesn’t get called, would need to investigate why to proceed

  • +
  • Adding this behaviour to protocol would cause it to depart from standard protocol behaviour

  • +
+
+
+ +
+
+axtreme.simulator.utils.simulator_from_func(func: Callable[[ndarray[tuple[int, int], dtype[float64]]], ndarray[tuple[int, int], dtype[float64]]]) Simulator
+

Adds n_simulations_per_point functionality to a a function that takes x inputs, and return simulation values.

+
+
Parameters:
+

func – function which accepts (n,d) x input, and returns (n, m) y output (one response per x point).

+
+
Returns:
+

Function conforming to Simultator interface. Output will always be 3 dimensional +(n_points, n_simulations_per_point, n_targets).

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.distibution_helpers.html b/_autosummary/axtreme.utils.distibution_helpers.html new file mode 100644 index 00000000..9cc5268d --- /dev/null +++ b/_autosummary/axtreme.utils.distibution_helpers.html @@ -0,0 +1,566 @@ + + + + + + + + + axtreme.utils.distibution_helpers - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.distibution_helpers

+

Helper for working with scipy distibutions.

+

Functions

+
+ + + + + + + + + +

distribution_parameter_names_from_scipy(dist)

Collects the parameters required for a scipy rv_continous distibution.

fit_dist_with_uncertainty(data, dist)

Fit a distibution, returning the parameters estimate and Gaussian uncertainty of the fit.

+
+
+
+axtreme.utils.distibution_helpers.distribution_parameter_names_from_scipy(dist: rv_continuous) list[str]
+

Collects the parameters required for a scipy rv_continous distibution.

+

Withing axtreme this is used to determine what a GP should predict.

+
+
Parameters:
+

dist – The distibution to retrieve the parameters for.

+
+
Returns:
+

The distibutiion parameter names, IN THE ORDER they should be passed to calls to this distibution class. +For example:

+
+
    +
  • gumbel_r.pdf(x, loc=0, scale=1) -> order returned [‘loc’,’scale’]

  • +
  • weibull_max.pdf(x, c, loc=0, scale=1) -> order returned [‘c’,’loc’,’scale’]

  • +
+
+

+
+
+
+ +
+
+axtreme.utils.distibution_helpers.fit_dist_with_uncertainty(data: Buffer | _SupportsArray[dtype[Any]] | _NestedSequence[_SupportsArray[dtype[Any]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], dist: rv_continuous) tuple[ndarray[tuple[int], dtype[float64]], ndarray[tuple[int, int], dtype[float64]]]
+

Fit a distibution, returning the parameters estimate and Gaussian uncertainty of the fit.

+

Results of fitting with Maximum Likelihood give a normal distibution where

+
    +
  • mean:parameter estimate

  • +
  • covariance matrix: Uncertainty in estimate (Inverse Fischer infomation matrix)

  • +
+
+

Note

+

Parameters are returned in tha same order they appear in the fucntion calls of this call. +For example, weibull_max.pdf(x, c, loc=0, scale=1) -> order returned [‘c’,’loc’,’scale’] +This order can be extracted with the helper function distribution_parameter_names_from_scipy

+
+
+
Parameters:
+
    +
  • data (ArrayLike) – 1 dimensional set of data to fit a distibution to.

  • +
  • dist (rv_continuous) – the distribution to be fitted.

  • +
+
+
Returns:
+

(n) parameter mean estimates +covariance: (n,n) covariance matrix of the uncertainty in parameters fitted

+
+
Return type:
+

feature mean

+
+
+
+

Todo

+
    +
  • Some distributions have convergence issues. Currently only allow gumble_r.

  • +
  • Optimisation method needs thorough testing

  • +
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.experiment_utils.html b/_autosummary/axtreme.utils.experiment_utils.html new file mode 100644 index 00000000..be67ba60 --- /dev/null +++ b/_autosummary/axtreme.utils.experiment_utils.html @@ -0,0 +1,506 @@ + + + + + + + + + axtreme.utils.experiment_utils - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.experiment_utils

+

Helpers for working with the Ax Experiment class.

+

Functions

+
+ + + + + + +

input_out_df_from_experiment(exp)

Shows the x and y data in one dataframe.

+
+
+
+axtreme.utils.experiment_utils.input_out_df_from_experiment(exp: Experiment) DataFrame
+

Shows the x and y data in one dataframe.

+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.gradient.html b/_autosummary/axtreme.utils.gradient.html new file mode 100644 index 00000000..962df60a --- /dev/null +++ b/_autosummary/axtreme.utils.gradient.html @@ -0,0 +1,566 @@ + + + + + + + + + axtreme.utils.gradient - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.gradient

+

Helper for gradient assessment.

+

NOTE: currently just used as a helper in tests. Could move their if we do not consider it useful to users

+

Functions

+
+ + + + + + +

is_smooth_1d(x, y[, d1_threshold, ...])

Helper to warn if 1d function is likely not smooth (twice differntiable).

+
+
+
+axtreme.utils.gradient.is_smooth_1d(x: Tensor, y: Tensor, d1_threshold: float = 3.0, d2_threshold: float = 150, *, plot: bool = False, test: bool = True) None | Figure
+

Helper to warn if 1d function is likely not smooth (twice differntiable).

+
+
Parameters:
+
    +
  • x – (n,) points representing the x (input) values of a function

  • +
  • y – (n,) points representing the y (output) values of a function

  • +
  • d1_threshold – Maximum step size allowed in 1st derivative function to be considered smooth.

  • +
  • d2_threshold – Maximum step size allowed in 1st derivative function to be considered smooth.

  • +
  • plot – If true, will plot the first and second derivative functions.

  • +
  • test – is assert statments should be run

  • +
+
+
+
+
Details
+
Smoothness: (defined up to K, the Kth derivative you can take that give a contious funciton over domain)
    +
  • C_0: set of continous functions

  • +
  • +
    C_1 (once differentiable):
      +
    • C_0 can be differentiated

    • +
    • AND the resulting function is continuous (No steps or holes)

    • +
    +
    +
    +
  • +
  • +
+
+
We want C_2 (twice differentiable) for optimisation. As such here we test.
    +
  • +
    if f’(x) is continous.
      +
    • Check if there are not step = not big changes between points.

    • +
    • +
      Knowing the appropriate step threshold is hard, the gradient is easier to think about.
        +
      • Easy way to do this is check if max slope is not exceeded (derivate 2nd)

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
  • +
    f’’(x) is continous.
      +
    • Check if there are not step = not big changes between points

    • +
    • Easy way to do this is check if max slope is not exceeded (derivate 2nd)

    • +
    +
    +
    +
  • +
+
+
+
+
+

NOTE: The thresholds have been set heuristically. It is recomended to plot your function and establish smoothness, +the use this for regression testing once suitable values have been determined.

+

NOTE: The smaller the step size, the better the estimate of gradient (large and small). See y = sim(50 * x)` with +torch.linspace(0,1,100)` and torch.linspace(0,1,1000)

+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.html b/_autosummary/axtreme.utils.html new file mode 100644 index 00000000..2217f85d --- /dev/null +++ b/_autosummary/axtreme.utils.html @@ -0,0 +1,505 @@ + + + + + + + + + axtreme.utils - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils

+

Utilities for axtreme.

+

Modules

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

distibution_helpers

Helper for working with scipy distibutions.

experiment_utils

Helpers for working with the Ax Experiment class.

gradient

Helper for gradient assessment.

logging

Functions to configure logging for the application.

model_helpers

Utility functions for working with botorch models.

modelbridge_utils

This builds of the utils provided in ax.modelbridge.modelbridge_utils.

numerical_precision

Helpers and documentation for understanding the impacts of numerical precision.

population_estimators

Helpers for understanding the population values expected by estimators.

transforms

The module is used to determine the ax transformations used and create the equivalent botorch transformation.

+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.logging.html b/_autosummary/axtreme.utils.logging.html new file mode 100644 index 00000000..b1cec7d5 --- /dev/null +++ b/_autosummary/axtreme.utils.logging.html @@ -0,0 +1,521 @@ + + + + + + + + + axtreme.utils.logging - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.logging

+

Functions to configure logging for the application.

+

Functions

+
+ + + + + + +

configure_logging([log_level_console, ...])

Configure logging for the application, allowing for both console and file logging.

+
+
+
+axtreme.utils.logging.configure_logging(log_level_console: str = 'WARNING', log_file: Path | None = None, log_level_file: str = 'WARNING') None
+

Configure logging for the application, allowing for both console and file logging.

+

Sets the log levels and formats for the output, ensuring that logs are captured as specified.

+
+
Parameters:
+
    +
  • log_level_console (str, optional) – log level for console output, by default “WARNING”

  • +
  • log_file (Path | None, optional) – log file to be used. If None, file logging is disabled. by default None

  • +
  • log_level_file (str, optional) – log level for file output, by default “WARNING”

  • +
  • Raises

  • +
  • ------

  • +
  • TypeError – if an invalid value for log_level_console or log_level_file is passed

  • +
  • Examples

  • +
  • -------- – configure_logging(log_level_console=”INFO”, log_file=Path(“app.log”), log_level_file=”DEBUG”)

  • +
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.model_helpers.html b/_autosummary/axtreme.utils.model_helpers.html new file mode 100644 index 00000000..7966d1c6 --- /dev/null +++ b/_autosummary/axtreme.utils.model_helpers.html @@ -0,0 +1,554 @@ + + + + + + + + + axtreme.utils.model_helpers - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.model_helpers

+

Utility functions for working with botorch models.

+

Functions

+
+ + + + + + + + + +

get_target_noise_singletaskgp(model)

A helper to extract the training varaince from a botorch model, and return it in a consistent format.

get_training_data_singletaskgp(model)

Extracts the training data from SIngleTaskGP in consistent form.

+
+
+
+axtreme.utils.model_helpers.get_target_noise_singletaskgp(model: SingleTaskGP) Tensor
+

A helper to extract the training varaince from a botorch model, and return it in a consistent format.

+
+
Parameters:
+

model – A SingleTaskGP model.

+
+
Returns:
+

A torch.Tensor of the noise with shape (*b, n,m) where b is an optional batch dimention, n +is the number of observations, m is the number of targets. If homoskedatic noise is used shape will be +(*b, n=1,m).

+
+
Return type:
+

noise (variance)

+
+
+

NOTE: Approach is based on FantasizeMixin.fantasize. +NOTE: Currently unclear if this interface extends to othe type of model.

+
+ +
+
+axtreme.utils.model_helpers.get_training_data_singletaskgp(model: SingleTaskGP) Tensor
+

Extracts the training data from SIngleTaskGP in consistent form.

+

As per Botorch documentation, “SingleTaskGP Modules same training data for all outputs” (BoTorch docs) +As such we are not concerned with batch dimenstion. Gpytorch stores training data in this format:

+
+
    +
  • if m = 1: (*b,n,d)

  • +
  • if m > 1: (*b,m,n,d)

  • +
+
+
+
Parameters:
+

model – the model to collect the training data from.

+
+
Returns:
+

(n,d) A torch.Tensor of the training_inputs

+
+
Return type:
+

training_inputs

+
+
+
+
NOTE: The interface defined here is only available for SingleTaskGPs, as other model can contain different input

data for each batch.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.modelbridge_utils.html b/_autosummary/axtreme.utils.modelbridge_utils.html new file mode 100644 index 00000000..990da73e --- /dev/null +++ b/_autosummary/axtreme.utils.modelbridge_utils.html @@ -0,0 +1,544 @@ + + + + + + + + + axtreme.utils.modelbridge_utils - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.modelbridge_utils

+

This builds of the utils provided in ax.modelbridge.modelbridge_utils.

+

Functions

+
+ + + + + + +

observations_to_arrays(param_names, ...)

Helper method to convert Ax results (Observation) to Numpy arrays of a standard format.

+
+
+
+axtreme.utils.modelbridge_utils.observations_to_arrays(param_names: list[str], outcomes: list[str], observations: list[Observation]) tuple[ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]], ndarray[Any, dtype[float64]]]
+

Helper method to convert Ax results (Observation) to Numpy arrays of a standard format.

+

This is useful e.g. when converting the output of ax.model_bridge.base.ModelBridge.get_training_data into “x” and +“y” and “covariance” arrays.

+
+
Parameters:
+
    +
  • param_names – List of the parameter names to report, and in what order.

  • +
  • outcomes – list of the metric/target names to report, in this order. +TODO(sw): work out if the order ever changes. If not, we should remove this.

  • +
  • observations – The list of observations to convert.

  • +
+
+
Returns:
+

An (n_observation, n_features) array of features. +- f: An (n_observation, m_metrics) array of prediction means. +- cov: An (n_observation, m_metrics, m_metrics) array of covariance between metric per x point.

+
+
Return type:
+

    +
  • features

  • +
+

+
+
+

Example

+
>>> import numpy as np
+>>> from ax.core.observation import Observation, ObservationData, ObservationFeatures
+>>> X = np.array([[1, 2], [3, 4], [5, 6]])
+>>> Y = np.array([[10], [20], [30]])
+>>> of = [ObservationFeatures(parameters={"x1": x[0], "x2": x[1]}) for x in X]
+>>> od = [ObservationData(metric_names=["y"], means=y, covariance=np.eye(1)) for y in Y]
+>>> observations = [Observation(features=f, data=d) for f, d in zip(of, od)]
+>>> features, f, cov = observations_to_arrays(param_names=["x1", "x2"], outcomes=["y"], observations=observations)
+>>> assert np.array_equal(features, X)
+>>> assert np.array_equal(f, Y)
+>>> # There is only one output per x point. This will have perfect covariance with itself.
+>>> assert np.array_equal(cov, np.ones([3, 1, 1]))
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.numerical_precision.html b/_autosummary/axtreme.utils.numerical_precision.html new file mode 100644 index 00000000..567b8aa6 --- /dev/null +++ b/_autosummary/axtreme.utils.numerical_precision.html @@ -0,0 +1,558 @@ + + + + + + + + + axtreme.utils.numerical_precision - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.numerical_precision

+

Helpers and documentation for understanding the impacts of numerical precision.

+

Functions

+
+ + + + + + +

maximal_representation_error_between_0_1(dtype)

Maximal amount a float can be wrong by, for numbers within the range [0,1).

+
+
+
+axtreme.utils.numerical_precision.maximal_representation_error_between_0_1(dtype: dtype) float
+

Maximal amount a float can be wrong by, for numbers within the range [0,1).

+

NOTE: This is calculated for the range [.5,1). Errors will be smaller for ranges < .5.

+
+
Parameters:
+

dtype – The dtype to calculate the maximal representation error for.

+
+
Returns:
+

The maximal representation error for numbers between 0 and 1.

+
+
+
+
Details:

Mantisa (significant bits) with x explicity bits internally has 1 implict bit added. Effectively this become +1.[x bits] (in binary).

+
+
    +
  • e.g float32 has 24 bits of precision but 23 bits of mantisa

  • +
+
+

Epsilon, the smallest representable number where 1+eps != 1 can be calculated as 2^-x

+
+
    +
  • e.g float32: 2^-23 = 1.19e-7

  • +
+
+

The largest representable number less than 1 is calculated as: 1 - 2^-(x + 1):

+
+
    +
  • e.g float32: 1 - 2^-24 = 0.999999940395355225

  • +
+
+

As such the smallest representable number between [.5,1) is: 2^-(x + 1)

+
+
    +
  • e.g float32: 2^-24 = 5.96e-08

  • +
+
+

Value smaller than the smallest representable number will be rounded to the nearest representable number. As +such the largest representation error for number between [.5,1) is 2^-(x + 1)/2 or 2^-(x_2)

+
+
    +
  • e.g float32: 2^-(23+2) = 2.9802322387695312e-08

  • +
+
+

Resoltuion and Precisions: +- TODO(sw): fill out exactly how these work. These number are ignored for now.

+

Additional information:

+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.population_estimators.html b/_autosummary/axtreme.utils.population_estimators.html new file mode 100644 index 00000000..65216332 --- /dev/null +++ b/_autosummary/axtreme.utils.population_estimators.html @@ -0,0 +1,626 @@ + + + + + + + + + axtreme.utils.population_estimators - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.population_estimators

+

Helpers for understanding the population values expected by estimators.

+

NOTE: These tool provide indicative/approximate result.

+

Functions

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

estimate_pdf_value_from_sample(sample, x)

Construct a distibution from a sample, and get the pdf value at point x.

plot_dist(dist[, confidence_level, ax])

Plot the distribution PDF over domain mean +- confidence_level * std.

sample_mean_se(samples)

Distibution of the population mean as estimated by this sample.

sample_median_se(samples)

Distibution of the population median as estimated by this sample.

+
+
+
+axtreme.utils.population_estimators.estimate_pdf_value_from_sample(sample: Tensor, x: float) float
+

Construct a distibution from a sample, and get the pdf value at point x.

+

WARNING: This is an approximate method, and results impove with more samples. See testing results below.

+
+
Parameters:
+
    +
  • sample – 1d Samples to construct a pdf from.

  • +
  • x – the point at which to evaluate the pdf.

  • +
+
+
Returns:
+

Estimated pdf value.

+
+
+

Testing results: +The mean returned and the cof have the following behaviour. Full test detail can be run at +tests/utils/test_population_estimators.py : visualise_performance_of_estimate_pdf_value_from_sample

+
+

Number of samples | mean_est/true | Coef |

+

11 | .86 - 1.02 | .25-.30 | +22 | .88 - 1.02 | .18-.20 | +44 | .90 - 1.01 | .14-.16 | +88 | .92 - 1.00 | .11-.13 | +176 | .95 - 1.00 | .05-.10 |

+
+
+ +
+
+axtreme.utils.population_estimators.plot_dist(dist: Distribution, confidence_level: float = 3.0, ax: Axes | None = None, **kwargs: Any) Axes
+

Plot the distribution PDF over domain mean +- confidence_level * std.

+
+
Parameters:
+
    +
  • dist – the distribution to plot the pdf of.

  • +
  • confidence_level – controls the width of the plot

  • +
  • ax – the axes to plot on. If None, will create an x

  • +
  • **kwargs – passed to the plotting method.

  • +
+
+
Returns:
+

Axes with the plot.

+
+
+
+ +
+
+axtreme.utils.population_estimators.sample_mean_se(samples: Tensor) StudentT
+

Distibution of the population mean as estimated by this sample.

+
+

Note

+

The distribution of the sample itself doesn’t matter. The output distibution is not effected by this.

+
+

Use the following link

+

se = sigma / n**.5

+
+
    +
  • Sigma: should be the population standard deviation, but we approximate this with the sample standard deviation

  • +
  • Because of this approximation we use the Student-t distribution

  • +
+
+
+
Parameters:
+

samples – 1d tensor of sample to estimate the population mean from

+
+
Returns:
+

Distribution of the population mean based on the provided sample. Additionally, it provides the 95% confidence +bounds for the estimate, which are typically calculated to fall within a range of 93% to 97% coverage, depending +on sample variability and the assumptions of the calculation method.

+
+
+
+

Todo

+
    +
  • +
    .cdf() raises NotImplementedError for torch implemenation of StudentT. This is annoying

    because this is the best way to check the confidence bounds (using z = (y - mean)/stddev) assumes you +are using a normal distibution rather than a student t distibution. This approximation is considered okay +for n>30)

    +
    +
    +
  • +
+
+
+ +
+
+axtreme.utils.population_estimators.sample_median_se(samples: Tensor) Normal
+

Distibution of the population median as estimated by this sample.

+

Details of this method can be found here.

+
+

Note

+

This function relies on the approximation estimate_pdf_value_from_sample. The approximation can be quite +inaccurate (see the function for details), and as a result this function should be treated as an estimate.

+
+
+

Note

+

The result returned are much more noisey than sample_mean_se.

+
+
+
Parameters:
+

samples – 1d tensor of sample to estimate the population median from

+
+
Returns:
+

Distibution of the population median as estimated by this sample. The 95% bounds (with 50 samples) estimated by +this function typically produce bounds actually between 90%-97%.

+
+
+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_autosummary/axtreme.utils.transforms.html b/_autosummary/axtreme.utils.transforms.html new file mode 100644 index 00000000..371cc4d9 --- /dev/null +++ b/_autosummary/axtreme.utils.transforms.html @@ -0,0 +1,711 @@ + + + + + + + + + axtreme.utils.transforms - axtreme 0.1.1 + + + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

axtreme.utils.transforms

+

The module is used to determine the ax transformations used and create the equivalent botorch transformation.

+

This allows the user to work directly with the Botorch model, while using inputs and outputs in the original space +(e.g the problem space)

+
+

Todo

+

It would be nice to be able to return an identity transform so we don’t have to deal with Nones (sw 2024-11-21).

+
+

Functions

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

ax_to_botorch_transform_input_output(...)

Determines the input and output transforms applied by Ax, and creates the equivalent transforms in botroch.

check_transform_not_applied(transform, ...)

Used to ensure a transform has not been applied.

translate_cast(transform)

Make sure that Cast has not flattned a HierachicalSearchSpace.

translate_derelativize(transform)

Handle Derelativize (relative constraints to non-relative constraints).

translate_ivw(transform)

Handle IVW (inverse variance weight transform).

translate_standardisey(transform, col_names)

Translate ax standardisation into botorch standardisation.

translate_unitx(transform)

Converts a trained UnitX to botorch equivalent.

+
+
+
+axtreme.utils.transforms.ax_to_botorch_transform_input_output(transforms: list[Transform], outcome_names: list[str]) tuple[InputTransform, OutcomeTransform]
+

Determines the input and output transforms applied by Ax, and creates the equivalent transforms in botroch.

+

This allows the botorch model internal to ax (which operates in a standard “model” space), to be used in the problem +space (e.g non-standardised input and output). This is useful when calculating QoIs.

+
+
Parameters:
+
    +
  • transforms – the TRAINED transforms that have been applied by ax. +- Typically found at TorchModelBridge.transforms.

  • +
  • outcome_names – the order of the output columns used to train the internal ax.Model. +- Typically found at TorchModelBridge.outcomes.

  • +
+
+
Returns:
+

    +
  • output_tranform:

  • +
+

+
+
Return type:
+

    +
  • input_transform

  • +
+

+
+
+
+
Using them in the following way allow input and output in the outcome/problem space:
    +
  • Assume: model is a trained`botorch.models`(such as TorchModelBridge.model.surrogate.model)

  • +
  • > model.posterior(input_transform(X), posterior_transform = output_transform.untransform_posterior)

  • +
+
+
+
+

Todo

+
    +
  • +
    Ideally ax_to_botorch_transform_conversion would a config within the root of this module, so it could easily

    be exteneded. This is challenign becuase the ‘translate_standardisey’ function needs the specific +outcome_names of the problem to be passed. This is because ax does not maintain the order of the metrics in +the transform itself (it stores the names/order internally. See +ax.modelbridge.base.ModelBridge._transform_data for details)

    +
    +
    +
  • +
+
+
+ +
+
+axtreme.utils.transforms.check_transform_not_applied(transform: Transform, parameter_names_store: str) tuple[InputTransform | None, OutcomeTransform | None]
+

Used to ensure a transform has not been applied.

+

Many transforms store an internal list of the ax.parameters (input) they should be applied to. +This is determined by that parameter being of a specific type and having specific attributes as checked within the +transform. +This helper function is used to double check the transforms are not being used/applied to anything. This mean a +translation from ax to botorch is not required.

+
+
Parameters:
+
    +
  • transform – the transform to check

  • +
  • parameter_names_store – The attribute on the transform that should be empty (falsey) if the tranform is not +applied to anything.

  • +
+
+
Returns:
+

Input and output transforms required (will be None). Will raise an error if these transformation have actually +been applied.

+
+
+
+

Note

+
+
This should be instantiated with functools.partial, e.g.
>>> from functools import partial
+>>> log_checker = partial(check_not_applied, parameter_names_store="transform_parameters")
+
+
+
+
+
+
+ +
+
+axtreme.utils.transforms.translate_cast(transform: Cast) tuple[InputTransform | None, OutcomeTransform | None]
+

Make sure that Cast has not flattned a HierachicalSearchSpace.

+
+
Cast changes the parameter (e.g RangeParameter), castings the VALUE to the data type it should be.

e.g RangeParameter values should be a float, cast the value to ensure it is a float

+
+
It also deals with HierachicalSearchSpace:
    +
  • +
    (basically this is like a tree that navigates you to a more specific search space
      +
    • e.g if ‘parameter_a’> 2 -> use SearchSpace1

    • +
    +
    +
    +
  • +
  • .flatten_hss flag if this has been used

  • +
+
+
+
+ +
+
+axtreme.utils.transforms.translate_derelativize(transform: Derelativize) tuple[InputTransform | None, OutcomeTransform | None]
+

Handle Derelativize (relative constraints to non-relative constraints).

+

Derelativize transforms optimisation configs and untransforms constraints. As we are only interested in input and +output transformations, this can be ignored.

+
+

Todo

+

Is there a safer way to ensure this is not being used? Difficult because it doesn’t store anything internally

+
+
+

Todo

+

This needs some additional work.

+
+
+ +
+
+axtreme.utils.transforms.translate_ivw(transform: IVW) tuple[InputTransform | None, OutcomeTransform | None]
+

Handle IVW (inverse variance weight transform).

+

IVW is used when at the same location (x), there are multiple measure of the same metric. +It combines these into a single measure of the metric, and passes this on to the botroch model for training +As this is only using for training (transforming the y input to the model), we can ignore this, as we currently +use these transforms for prediction only.

+
+

Note

+

It is hard to tell if this transformation has been applied because no attribute are stored on the object.

+
+
+

Todo

+

Check if botorch supports multiple measure of a single metric at a single point (suspect not) +- if not it is reasonable to ignore this transformation as standard botorch model shouldn’t be using in that way

+
+
+ +
+
+axtreme.utils.transforms.translate_standardisey(transform: StandardizeY, col_names: list[str]) tuple[InputTransform | None, OutcomeTransform | None]
+

Translate ax standardisation into botorch standardisation.

+
+

Note

+

Ax does not maintain the order of the metrics, so need to explicitly pass the order.

+
+

Todo

+

Can there be some work around for this? Would be good not to have to pass constraints.

+
+
+
+

Note

+
+
col_name should be passed using functools.partial
>>> from functools import partial
+>>> standardise_y = partial(translate_standardiseY, col_names=["loc", "scale"])
+
+
+
+
+
+
+
Parameters:
+
    +
  • transform – StandardizeY to translate

  • +
  • col_names – the order of the column in the data being passed in. +This is required to the correct transformation can be applied to the correct column

  • +
+
+
+
+ +
+
+axtreme.utils.transforms.translate_unitx(transform: UnitX) tuple[InputTransform | None, OutcomeTransform | None]
+

Converts a trained UnitX to botorch equivalent.

+

Ax bounds look like this: {‘x1’: (0.0, 2.0), ‘x2’: (0.0, 3.0)}

+

BoTorch bounds look like: tensor([[0., 0.],[2., 3.]])

+
+ +
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/_images/ax_component_diagram.png b/_images/ax_component_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe6055111464f9ef4b2ee0c031efb5f3337dd17 GIT binary patch literal 65861 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

)iw;xA1OCuGeh!1N0=LNA3Yq`j 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 Ymw&#Gi?UG0x(7Vu-YQF#OBe_J50vRW?EnA( literal 0 HcmV?d00001 diff --git a/_images/doe_point.png b/_images/doe_point.png new file mode 100644 index 0000000000000000000000000000000000000000..1f05947640defceb7419d4e22fee5716df24b8e3 GIT binary patch literal 60536 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 oj{gHKqaJGhhwF_KdB&mg#Z8m literal 0 HcmV?d00001 diff --git a/_images/erd_smoothness.png b/_images/erd_smoothness.png new file mode 100644 index 0000000000000000000000000000000000000000..3d5d1f2e5a7567c6284ffc031f0991e2cae53f6a GIT binary patch literal 39257 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ⅅYKenJ`&4CZ?f6HV5AxE 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ðZUj{jF)yz}NeKmwXhkjjgW(2Zy#><$8@{ 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 literal 0 HcmV?d00001 diff --git a/_images/noise_simulator.png b/_images/noise_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..191e49160463ce7b231317e5ccc361559bbb5c33 GIT binary patch literal 22721 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 UA>#p$V1Fg~Z(0d!R{#J2 literal 0 HcmV?d00001 diff --git a/_images/simulator_non_gaus_noise.png b/_images/simulator_non_gaus_noise.png new file mode 100644 index 0000000000000000000000000000000000000000..d94dd2929d9727d1a73eff27a0b5c91e3b064988 GIT binary patch literal 31593 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 literal 0 HcmV?d00001 diff --git a/_images/simulator_normal_noise.png b/_images/simulator_normal_noise.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3b7438fc10b0840ee62880c3b85ea92cb335c7 GIT binary patch literal 23709 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 literal 0 HcmV?d00001 diff --git a/_images/surrogate_model_no_uncertainty.png b/_images/surrogate_model_no_uncertainty.png new file mode 100644 index 0000000000000000000000000000000000000000..28a3a8ca30eb06c555926ac88464b394409ade48 GIT binary patch literal 67774 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 WqEV@J<~yb}l9Imv!^{ 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 literal 0 HcmV?d00001 diff --git a/_images/surrogate_model_uncertainty_aware.png b/_images/surrogate_model_uncertainty_aware.png new file mode 100644 index 0000000000000000000000000000000000000000..94db4d859247649ab256898a8961bf879e7c6ecd GIT binary patch literal 56961 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%0AkP*D4D0kp|41rjZJmHw8HID|`?q0QCs zu=e_*MqNDFI8$A>&W=>iCeb}pC@Xxr+QtNc0xG?JYUVlfGBCH(o;-;fOL8S!N^tW0 z_(~5g^>{A098I|T0x3M}l3U~5&!OW~sTihm#x7A-Efp@rCE5ktqKWoaB&J=$+ljseRQ6rfZQRnSt9U}Q7|_zJ!Mx$RMO87 z&1(}Vj*^C%Wq!%o5rO#qxI(yKnIJn-WU_{{2J&h_a1LLD;tuC3(qniY(*gz^Y|Ep1 zzPTJN_yS%4VTZ@sUi_ii)m7b_p@(YxUPiUEQk61LjeyRr2;g~eMK4ZrBgFq`=cBw> z&Sr&XYxU1TAtnrq82zQHee3+$MTyC2fheWJ8i$v33pG}cz8AOZk5y!?Mnxd{*Ggr_ zazSoDVRe&Zz5^seCd)sc-F!gui|iEH`y%l)aPbF#&Eh2qkpA+o0py264*� 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 score`). Internally the acquisiton function "fantasizes" what new GP would be produced at candidate point $x$ and the calculates the QoI with the new GP. Is uses the variance of the QoI as the score. As this acquistion function needs to be optimised, it important to understand if the acquisiton function is smooth (is the relationship between $x$ and score smooth). The smoothness is influenced by the steps taken when performing this calculation. + +`x --> new_model --> qoi(new_model) --> var(qoi) --> score` + + +While `QoILookAhead` guarantees the `new_model` is smooth w.r.t $x$, the `GPBruteForce` QoI is **not** smooth w.r.t the `new_model`. As a result the acqusition function is not smooth and cannot be optimised with optimisers that expect 1st or 2nd derivative. The following details why the `GPBruteForce` QoI is **not** smooth w.r.t the `new_model`. + +### ERD smoothness w.r.t model +A single ERD sample is created byt finding the response of each env sample in a period, and taking the max. say `env_samples = [.1,.3,.6,.4]`. Say the new model is built by adding a single new point between [0,1]. For each different new_model, the response for a specific env sample changes. This can be plotted as follows. + +![erd_smoothness](img/gpbruteforce/erd_smoothness.png) + +As the plot shows, even if the `env_samples` responses are smooth w.r.t the model, the ERD sample is not gaurenteed to be. + +### QoI smoothness w.r.t model +A QoI is estimated from ERD samples (typically a seperate estimate is made for each posterior sample). The following plot shows even if the ERD samples are smooth w.r.t the model, the QoI (in this case the median) is not gaurenteed to be. + +![qoi_smoothness](img/gpbruteforce/qoi_smoothness.png) diff --git a/_sources/technical_details/technical_details.rst.txt b/_sources/technical_details/technical_details.rst.txt new file mode 100644 index 00000000..653859fe --- /dev/null +++ b/_sources/technical_details/technical_details.rst.txt @@ -0,0 +1,11 @@ +Technical Details +================= +The following contains in depth information about specific components of `axtreme`. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + ax_integration + gpbruteforce + diff --git a/_sources/usecase_offshorewind.md.txt b/_sources/usecase_offshorewind.md.txt new file mode 100644 index 00000000..c40cd77f --- /dev/null +++ b/_sources/usecase_offshorewind.md.txt @@ -0,0 +1,48 @@ +# Example Usecase +The following offshore wind usecase is used to introduce the `axtreme` package, as we have found this type of introduction more informative than abstract technical definitions of key package terminology and capabilities: + +## Overview +An offshore wind turbine is being designed to operate for 20 years. The engineers have information about the typical weather conditions (called the environment conditions), and have a slow but accurate stochastic simulator of the response experienced by the turbine in a give weather condition. In order to know their design will survive for the 20 year period they need to know (amongst other things) the Ultimate Limit State (ULS). This is the largest response the wind turbine is experiences in 20 years of operation. + +Because of randomness in the weather and the turbine's response, the largest response experienced in a 20 year period is not a fixed values, and has a distribution. This distribution is called the the Extreme Response Distribution (ERD). The engineers are specifically interested in knowing the median of this distribution (this is called their Quantity of Interest (QoI)). + +![long_term_response_dist](img/usecase_offshorewind/long_term_response_distribution.png) + +The following details the environment samples and simulator. + +### Environment Samples: +The environment represents the factors that effect the wind turbine, and these are used as inputs to the simulator. Typically these are weather conditions such as wind and wave information. The environment distribution then represents how likely it is that a condition will be experience by the wind turbine. + +The environment distribution reports "long-term" conditions. This means it represents the average conditions (e.g wind speed) over an hour. This is different to the instantaneous conditions, which are called "short-term" conditions. Short-term conditions are typically (stochastically) generated within the simulator from the long term conditions. This one of the factors causing stochastic output in the simulator. + +### Wind Turbine Simulator $f:X -> Y$ +This stochastic function predicts the response caused by a given environment condition. +- Input: Takes a "long-term" environment condition $x$ . e.g average wind speed and turbulence. +- Output: The turbines maximum response $y$ during an hour of operation in those conditions. The response is stochastic as the model internally randomly generates an hour on instantaneous weather that satisfies the long term average $x$. As there are many patterns of instantaneous weather, each which may produce different responses, the output is stochastic + +## Possible Solutions: + +### Naive approach: +If the simulator was fast we could use the following process to calculate the QoI: +- Taking one period worth of environment samples. +- Running them through the simulator, creating one period worth of responses. +- Taking the largest responses in that period. + +This produces a single sample of the ERD. The process could be be repeated until enough samples were obtains to estimate the QoI. + +### Traditional Approaches: +Method such as Environment Contouring have been create to approximate the QoI with fewer runs of the simulator. These work better than the Naive approach, but have shortcomings. + + +### `axtreme` approach: +The `axtreme` package deals with this problem by using a fast surrogate model in place of the real simulator when performing the QoI calculations. The process consists of 3 key steps (detailed further in "Basic Concepts"): +1) #### Build an uncertainty-aware Surrogate Model. +Once a small dataset has been created with the simulator (input and output pairs), a surrogate model can be fit to this dataset. For the surrogate to be useful it should: +- Properly capture the (possibly non-Gaussian) randomness in the simulators response. +- Be uncertainty aware: Using a surrogate model introduces uncertainty regarding the quality of the fit. Without knowing this uncertainty, it is difficult to trust the results calculated using the surrogate. + +2) #### Calculate the QoI: +The surrogate model can now be used in place of the simulator to calculate the QoI. It is important that the uncertainty the surrogate has regarding the true model (the simulator) is propagated through to the QoI. + +3) #### Reduce the uncertainty in the QoI: +We can reduce uncertainty in the QoI by adding data to the surrogate (which reduces the surrogates uncertainty). Some data points are more influential in the QoI calculation than others. By using active learning (also called DoE) to identify these regions, uncertainty in the QoI can be reduced with minimal runs of the (expensive) simulator. diff --git a/_static/DNV_logo_RGB.jpg b/_static/DNV_logo_RGB.jpg new file mode 100644 index 0000000000000000000000000000000000000000..136fe620f88821ed5b5455cc64326fae3a52a047 GIT binary patch literal 202826 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 aP!ymjKv96A07U_c0u%-Qw<)mS{eJ-a*w+F8 literal 0 HcmV?d00001 diff --git a/_static/axtreme.svg b/_static/axtreme.svg new file mode 100644 index 00000000..1e02cbed --- /dev/null +++ b/_static/axtreme.svg @@ -0,0 +1 @@ +mypackagelogo svg1224 x 1223 \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..7ebbd6d0 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/debug.css b/_static/debug.css new file mode 100644 index 00000000..74d4aec3 --- /dev/null +++ b/_static/debug.css @@ -0,0 +1,69 @@ +/* + This CSS file should be overridden by the theme authors. It's + meant for debugging and developing the skeleton that this theme provides. +*/ +body { + font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; + background: lavender; +} +.sb-announcement { + background: rgb(131, 131, 131); +} +.sb-announcement__inner { + background: black; + color: white; +} +.sb-header { + background: lightskyblue; +} +.sb-header__inner { + background: royalblue; + color: white; +} +.sb-header-secondary { + background: lightcyan; +} +.sb-header-secondary__inner { + background: cornflowerblue; + color: white; +} +.sb-sidebar-primary { + background: lightgreen; +} +.sb-main { + background: blanchedalmond; +} +.sb-main__inner { + background: antiquewhite; +} +.sb-header-article { + background: lightsteelblue; +} +.sb-article-container { + background: snow; +} +.sb-article-main { + background: white; +} +.sb-footer-article { + background: lightpink; +} +.sb-sidebar-secondary { + background: lightgoldenrodyellow; +} +.sb-footer-content { + background: plum; +} +.sb-footer-content__inner { + background: palevioletred; +} +.sb-footer { + background: pink; +} +.sb-footer__inner { + background: salmon; +} +.sb-article { + background: white; +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..51cf7f54 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plot_directive.css b/_static/plot_directive.css new file mode 100644 index 00000000..d45593c9 --- /dev/null +++ b/_static/plot_directive.css @@ -0,0 +1,16 @@ +/* + * plot_directive.css + * ~~~~~~~~~~~~ + * + * Stylesheet controlling images created using the `plot` directive within + * Sphinx. + * + * :copyright: Copyright 2020-* by the Matplotlib development team. + * :license: Matplotlib, see LICENSE for details. + * + */ + +img.plot-directive { + border: 0; + max-width: 100%; +} diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..02b4b128 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,258 @@ +.highlight pre { line-height: 125%; } +.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ +@media not print { +body[data-theme="dark"] .highlight pre { line-height: 125%; } +body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight .hll { background-color: #404040 } +body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } +body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ +body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ +body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ +body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ +body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body[data-theme="dark"] .highlight .gr { color: #ff3a3a } /* Generic.Error */ +body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ +body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */ +body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ +body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +@media (prefers-color-scheme: dark) { +body:not([data-theme="light"]) .highlight pre { line-height: 125%; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } +body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } +body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ +body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ +body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ +body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ +body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body:not([data-theme="light"]) .highlight .gr { color: #ff3a3a } /* Generic.Error */ +body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ +body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */ +body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ +body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +} +} \ No newline at end of file diff --git a/_static/scripts/furo-extensions.js b/_static/scripts/furo-extensions.js new file mode 100644 index 00000000..e69de29b diff --git a/_static/scripts/furo.js b/_static/scripts/furo.js new file mode 100644 index 00000000..0abb2afa --- /dev/null +++ b/_static/scripts/furo.js @@ -0,0 +1,3 @@ +/*! For license information please see furo.js.LICENSE.txt */ +(()=>{var t={856:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(856),e=n.n(t),o=null,r=null,c=document.documentElement.scrollTop;const s=64;function l(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function a(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",l)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;(function(t){const e=Math.floor(r.getBoundingClientRect().top);console.log(`headerTop: ${e}`),0==e&&t!=e?r.classList.add("scrolled"):r.classList.remove("scrolled")})(n=t),function(t){tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);return r.getBoundingClientRect().height+2.5*t+1}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),a()}))})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/_static/scripts/furo.js.LICENSE.txt b/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 00000000..1632189c --- /dev/null +++ b/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/_static/scripts/furo.js.map b/_static/scripts/furo.js.map new file mode 100644 index 00000000..80ea12b8 --- /dev/null +++ b/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":"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","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader(positionY) {\n const headerTop = Math.floor(header.getBoundingClientRect().top);\n\n console.log(`headerTop: ${headerTop}`);\n if (headerTop == 0 && positionY != headerTop) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader(positionY);\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return header.getBoundingClientRect().height + 2.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","GO_TO_TOP_OFFSET","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","headerTop","floor","scrollHandlerForHeader","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","height"],"sourceRoot":""} \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/skeleton.css b/_static/skeleton.css new file mode 100644 index 00000000..467c878c --- /dev/null +++ b/_static/skeleton.css @@ -0,0 +1,296 @@ +/* Some sane resets. */ +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; +} + +/* All the flexbox magic! */ +body, +.sb-announcement, +.sb-content, +.sb-main, +.sb-container, +.sb-container__inner, +.sb-article-container, +.sb-footer-content, +.sb-header, +.sb-header-secondary, +.sb-footer { + display: flex; +} + +/* These order things vertically */ +body, +.sb-main, +.sb-article-container { + flex-direction: column; +} + +/* Put elements in the center */ +.sb-header, +.sb-header-secondary, +.sb-container, +.sb-content, +.sb-footer, +.sb-footer-content { + justify-content: center; +} +/* Put elements at the ends */ +.sb-article-container { + justify-content: space-between; +} + +/* These elements grow. */ +.sb-main, +.sb-content, +.sb-container, +article { + flex-grow: 1; +} + +/* Because padding making this wider is not fun */ +article { + box-sizing: border-box; +} + +/* The announcements element should never be wider than the page. */ +.sb-announcement { + max-width: 100%; +} + +.sb-sidebar-primary, +.sb-sidebar-secondary { + flex-shrink: 0; + width: 17rem; +} + +.sb-announcement__inner { + justify-content: center; + + box-sizing: border-box; + height: 3rem; + + overflow-x: auto; + white-space: nowrap; +} + +/* Sidebars, with checkbox-based toggle */ +.sb-sidebar-primary, +.sb-sidebar-secondary { + position: fixed; + height: 100%; + top: 0; +} + +.sb-sidebar-primary { + left: -17rem; + transition: left 250ms ease-in-out; +} +.sb-sidebar-secondary { + right: -17rem; + transition: right 250ms ease-in-out; +} + +.sb-sidebar-toggle { + display: none; +} +.sb-sidebar-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + + transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; + + opacity: 0; + background-color: rgba(0, 0, 0, 0.54); +} + +#sb-sidebar-toggle--primary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], +#sb-sidebar-toggle--secondary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms ease, height 0ms ease, opacity 250ms ease; +} + +#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { + left: 0; +} +#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { + right: 0; +} + +/* Full-width mode */ +.drop-secondary-sidebar-for-full-width-content + .hide-when-secondary-sidebar-shown { + display: none !important; +} +.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { + display: none !important; +} + +/* Mobile views */ +.sb-page-width { + width: 100%; +} + +.sb-article-container, +.sb-footer-content__inner, +.drop-secondary-sidebar-for-full-width-content .sb-article, +.drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 100vw; +} + +.sb-article, +.match-content-width { + padding: 0 1rem; + box-sizing: border-box; +} + +@media (min-width: 32rem) { + .sb-article, + .match-content-width { + padding: 0 2rem; + } +} + +/* Tablet views */ +@media (min-width: 42rem) { + .sb-article-container { + width: auto; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 42rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 46rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 46rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 50rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 50rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Tablet views */ +@media (min-width: 59rem) { + .sb-sidebar-secondary { + position: static; + } + .hide-when-secondary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 63rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 67rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Desktop views */ +@media (min-width: 76rem) { + .sb-sidebar-primary { + position: static; + } + .hide-when-primary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} + +/* Full desktop views */ +@media (min-width: 80rem) { + .sb-article, + .match-content-width { + width: 46rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } +} + +@media (min-width: 84rem) { + .sb-article, + .match-content-width { + width: 50rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } +} + +@media (min-width: 88rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-page-width { + width: 88rem; + } +} diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '

" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css new file mode 100644 index 00000000..82295876 --- /dev/null +++ b/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map new file mode 100644 index 00000000..c26eac7f --- /dev/null +++ b/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAEE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cAIA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UCzCN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/_static/styles/furo.css b/_static/styles/furo.css new file mode 100644 index 00000000..05a56b17 --- /dev/null +++ b/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,p,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;clip:rect(0,0,0,0)!important;background:var(--color-background-primary);border:0!important;color:var(--color-foreground-primary);white-space:nowrap!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-stack--headings:var(--font-stack);--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#6b6f76;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#0a4bff;--color-brand-content:#2757dd;--color-brand-visited:#872ee0;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-api-added:#21632c;--color-api-added-border:#38a84d;--color-api-changed:#046172;--color-api-changed-border:#06a1bc;--color-api-deprecated:#605706;--color-api-deprecated-border:#f0d90f;--color-api-removed:#b30000;--color-api-removed-border:#ff5c5c;--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link--hover:var(--color-brand-content);--color-link-underline--hover:var(--color-foreground-border);--color-link--visited:var(--color-brand-visited);--color-link-underline--visited:var(--color-background-border);--color-link--visited--hover:var(--color-brand-visited);--color-link-underline--visited--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:block}@media(prefers-color-scheme:dark){body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-dark{display:block}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:none}}body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-family:var(--font-stack--headings);font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:visited{color:var(--color-link--visited);text-decoration-color:var(--color-link-underline--visited)}a:visited:hover{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link:hover:visited{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{height:100%}.skip-to-content,body,html{background:var(--color-background-primary);color:var(--color-foreground-primary)}.skip-to-content{border-radius:1rem;left:.25rem;padding:1rem;position:fixed;top:.25rem;transform:translateY(-200%);transition:transform .3s ease-in-out;z-index:40}.skip-to-content:focus-within{transform:translateY(0)}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{display:flex}.theme-toggle{background:transparent;border:none;cursor:pointer;display:flex;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1.25rem;width:1.25rem}.theme-toggle-header{align-items:center;display:flex;justify-content:center}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1.5rem;width:1.5rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg,.content-icon-container .view-this-page svg{color:inherit;height:1.25rem;width:1.25rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.content{margin-left:auto;margin-right:auto;padding:0 1em}}@media(max-width:63em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.theme-toggle-header,.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.5rem;width:1.5rem}:target{scroll-margin-top:calc(var(--header-height) + 2.5rem)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}}@media(max-width:48em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){article[role=main] aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:4.25rem}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}div.deprecated,div.versionadded,div.versionchanged,div.versionremoved{border-left:.1875rem solid;border-radius:.125rem;padding-left:.75rem}div.deprecated p,div.versionadded p,div.versionchanged p,div.versionremoved p{margin-bottom:.125rem;margin-top:.125rem}div.versionadded{border-color:var(--color-api-added-border)}div.versionadded .versionmodified{color:var(--color-api-added)}div.versionchanged{border-color:var(--color-api-changed-border)}div.versionchanged .versionmodified{color:var(--color-api-changed)}div.deprecated{border-color:var(--color-api-deprecated-border)}div.deprecated .versionmodified{color:var(--color-api-deprecated)}div.versionremoved{border-color:var(--color-api-removed-border)}div.versionremoved .versionmodified{color:var(--color-api-removed)}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class] pre{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>:not(span),div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}[role=main] .table-wrapper.container{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:2.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(2.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(2.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover);color:var(--color-sidebar-link-text)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23607D8B' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' viewBox='0 0 24 24'%3E%3Cpath stroke='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree a.reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling. Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo.css.map b/_static/styles/furo.css.map new file mode 100644 index 00000000..3ecc3715 --- /dev/null +++ b/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"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sCAIA,aADF,WACE,CAKF,SACE,CAHJ,kBAEE,CAJE,gBAEJ,CAHI,iBAMA,yFAKA,aACA,eACA,cElbJ,iBAEE,aADA,iBACA,6BAEA,kCAEA,SACA,UAIA,gCACA,CALA,SAEA,SAEA,CAJA,0EAEA,CAFA,OAKA,CAGA,mDACE,iBAGF,gCACE,CADF,UACE,aAEJ,iCAEE,CAFF,UAEE,wCAEA,WACA,WADA,UACA,CACA,4CAGA,MACA,CADA,KACA,wCACA,UAGA,CAJA,UAIA,6DAUA,0CACE,CAFF,mBAEE,wEACA,CAVA,YACA,CAMF,mBAJE,OAOA,gBAJJ,gCACE,CANE,cACA,CAHA,oBACA,CAGA,QAGJ,CAII,0BACA,CADA,UACA,wCAEJ,kBACE,0DACA,gCACE,kBACA,CADA,YACA,oEACA,2CAMF,mDAII,CALN,YACE,CANE,cAKJ,CACE,iBAII,kEACA,yCACE,kDACA,yDACE,+CACA,uBANN,CAMM,+BANN,uCACE,qDACA,4BAEE,mBADA,0CACA,CADA,qBACA,0DACE,wCACA,sGALJ,oCACA,sBACE,kBAFF,UAEE,2CACA,wFACE,cACA,kEANN,uBACE,iDACA,CADA,UACA,0DACE,wDAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCrEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAGJ,wDAEE,uCAEF,kE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","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/variables/_layout.scss","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote, p\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto-light\n display: block\n\n @media (prefers-color-scheme: dark)\n .theme-toggle svg.theme-icon-when-auto-dark\n display: block\n .theme-toggle svg.theme-icon-when-auto-light\n display: none\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n --font-stack--headings: var(--font-stack);\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #6b6f76; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #0a4bff;\n --color-brand-content: #2757dd;\n --color-brand-visited: #872ee0;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n\n --color-api-added: #21632c;\n --color-api-added-border: #38a84d;\n --color-api-changed: #046172;\n --color-api-changed-border: #06a1bc;\n --color-api-deprecated: #605706;\n --color-api-deprecated-border: #f0d90f;\n --color-api-removed: #b30000;\n --color-api-removed-border: #ff5c5c;\n\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline--hover: var(--color-foreground-border);\n\n --color-link--visited: var(--color-brand-visited);\n --color-link-underline--visited: var(--color-background-border);\n --color-link--visited--hover: var(--color-brand-visited);\n --color-link-underline--visited--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #cfd0d0; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #3d94ff;\n --color-brand-content: #5ca5ff;\n --color-brand-visited: #b27aeb;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n --color-api-added: #3db854;\n --color-api-added-border: #267334;\n --color-api-changed: #09b0ce;\n --color-api-changed-border: #056d80;\n --color-api-deprecated: #b1a10b;\n --color-api-deprecated-border: #6e6407;\n --color-api-removed: #ff7575;\n --color-api-removed-border: #b03b3b;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-family: var(--font-stack--headings)\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:visited\n color: var(--color-link--visited)\n text-decoration-color: var(--color-link-underline--visited)\n &:hover\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &:visited\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n.skip-to-content\n position: fixed\n padding: 1rem\n border-radius: 1rem\n left: 0.25rem\n top: 0.25rem\n z-index: 40\n background: var(--color-background-primary)\n color: var(--color-foreground-primary)\n\n transform: translateY(-200%)\n transition: transform 300ms ease-in-out\n\n &:focus-within\n transform: translateY(0%)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n display: flex\n\n.theme-toggle\n display: flex\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n height: 1.25rem\n width: 1.25rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n display: flex\n align-items: center\n justify-content: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1.5rem\n width: 1.5rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page, .view-this-page\n svg\n color: inherit\n height: 1.25rem\n width: 1.25rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $content-padded-width + $sidebar-width)\n // Center the page\n .content\n margin-left: auto\n margin-right: auto\n padding: 0 $content-padding--small\n\n@media (max-width: $content-padded-width--small + $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon, .theme-toggle-header\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: 1.5rem\n width: 1.5rem\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: calc(var(--header-height) + 2.5rem)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n\n@media (max-width: $content-width + 2* $content-padding--small)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n article[role=main] aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","// Overall Layout Variables\n//\n// Because CSS variables can't be used in media queries. The fact that this\n// makes the layout non-user-configurable is a good thing.\n$content-padding: 3em;\n$content-padding--small: 1em;\n$content-width: 46em;\n$sidebar-width: 15em;\n$content-padded-width: $content-width + 2 * $content-padding;\n$content-padded-width--small: $content-width + 2 * $content-padding--small;\n$full-width: $content-padded-width + 2 * $sidebar-width;\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 4.25rem\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\ndiv.versionadded,\ndiv.versionchanged,\ndiv.deprecated,\ndiv.versionremoved\n border-left: 0.1875rem solid\n border-radius: 0.125rem\n\n padding-left: 0.75rem\n\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\ndiv.versionadded\n border-color: var(--color-api-added-border)\n .versionmodified\n color: var(--color-api-added)\n\ndiv.versionchanged\n border-color: var(--color-api-changed-border)\n .versionmodified\n color: var(--color-api-changed)\n\ndiv.deprecated\n border-color: var(--color-api-deprecated-border)\n .versionmodified\n color: var(--color-api-deprecated)\n\ndiv.versionremoved\n border-color: var(--color-api-removed-border)\n .versionmodified\n color: var(--color-api-removed)\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n pre\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > *:not(span),\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n","[role=main] .table-wrapper.container\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n",":target\n scroll-margin-top: 2.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(2.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(2.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n color: var(--color-sidebar-link-text)\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the