Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

PyPI - VersionstatustestDocumentation Status

DeepDiagnostics

DeepDiagnostics is a package for diagnosing the posterior from an inference method. It is flexible, applicable for both simulation-based and likelihood-based inference.

Documentation

Installation

From PyPi

pip install deepdiagnostics

From Source

This project is built from poetry, if working from source we recommend using poetry run to run any commands that use the package. You can also use poetry env activate to get the path to the python virtual environment used by poetry. For additional information - please view poetry's environment management documentation.

git clone https://github.com/deepskies/DeepDiagnostics/ pip install poetry poetry env activate poetry install
poetry run pytest
poetry run diagnose --config {config path}

Quickstart

View the template yaml here for a minimally working example with our supplied sample data to get started.

Data and Model Requirements

To access your trained model, use the SBIModel class to load in a trained model in the form of a .pkl file. This format specifics are shown here If you wish to use a different model format, we encourage you to open a new issue requesting it, or even better, write an subclass of deepdiagnostics.models.Model to include it!

To read in your own data, supply an .h5 or .pkl file and specify your format in the data.data_engine field of the configuration file. The possible fields are listed here. We recommend an .h5 file.

The data must have the following fields:

  • xs - The range of data your parameters have been tested against. For example, if you are modeling y = mx + b, your xs are the values you have tested for x. Please ensure they are of the shape (x_size, n_samples).
  • thetas - The parameters that characterize your problem. For example, if you are modeling y = mx + b, your thetas are m and b. Please ensure they are in the shape of (n_parameters, n_samples) and ordered the same way parameter_labels is supplied in your configuration file to prevent mislabelled plots.

If you do not supply a simulator method, including a ys field can allow for the use of a lookup-table simulator substitute.

Pipeline

DeepDiagnostics includes a CLI tool for analysis.

  • To run the tool using a configuration file:
 diagnose --config {path to yaml}
  • To use defaults with specific models and data:
 diagnose --model_path {model pkl} --data_path {data pkl} [--simulator {sim name}]

Additional arguments can be found using diagnose -h

Standalone

DeepDiagnostics comes with the option to run different plots and metrics independently.

Setting a configuration ahead of time ensures reproducibility with parameters and seeds. It is encouraged, but not required.

fromdeepdiagnostics.utils.configurationimportConfigfromdeepdiagnostics.modelimportSBIModelfromdeepdiagnostics.dataimportH5Datafromdeepdiagnostics.plotsimportLocalTwoSampleTest, RanksConfig({configuration_path})
model=SBIModel({model_path})
data=H5Data({data_path}, simulator={simulatorname})
LocalTwoSampleTest(data=data, model=model, show=True)(use_intensity_plot=False, n_alpha_samples=200)
Ranks(data=data, model=model, show=True)(num_bins=3)

Contributing

Please view the Deep Skies Lab contributing guidelines before opening a pull request.

DeepDiagnostics is structured so that any new metric or plot can be added by adding a class that is a child of metrics.Metric or plots.Display.

These child classes need a few methods. A minimal example of both a metric and a display is below.

It is strongly encouraged to provide typing for all inputs of the plot and calculate methods so they can be automatically documented.

Please ensure the proxy format DataDisplay is used for all plots, which ensures results can be re-plotted.

Metric

fromdeepdiagnostics.metricsimportMetricclassNewMetric(Metric): """ {What the metric is, any resources or credits.} .. code-block:: python  {a basic example on how to run the metric} """def__init__(self, model, data,out_dir=None, save=True, use_progress_bar=None, samples_per_inference=None, percentiles=None, number_simulations=None,
) ->None:
# Initialize the parent Metricsuper().__init__(model, data, out_dir, save, use_progress_bar, samples_per_inference, percentiles, number_simulations)
# Any other calculations that need to be done ahead of time def_collect_data_params(self): # Compute anything that needs to be done each time the metric is calculated. returnNonedefcalculate(self, metric_kwargs:dict[str, int]) ->Sequence[int]: """ Description of the calculations Kwargs:  metric_kwargs (Required, dict[str, int]): dictionary of the metrics to return, under the name "metric".  Returns: Sequence[int]: list of the number in metrics_kwargs """# Where the main calculation takes place, used by the metric __call__. self.output= {'The Result of the calculation'=[metric_kwargs["metric"]]} # Update 'self.output' so the results are saved to the results.json. return [0] # Return the result so the metric can be used standalone. 

Display

importmatplotlib.pyplotaspltfromdeepdiagnostics.plots.plotimportDisplayclassNewPlot(Display):
def__init__(
self, model, data, save, show, out_dir=None, percentiles=None, use_progress_bar=None,
samples_per_inference=None,
number_simulations=None,
parameter_names=None, parameter_colors=None, colorway=None):
""" {Description of the plot} .. code-block:: python {How to run the plot} """super().__init__(model, data, save, show, out_dir, percentiles, use_progress_bar, samples_per_inference, number_simulations, parameter_names, parameter_colors, colorway)
defplot_name(self):
# The name of the plot (the filename, to be saved in out_dir/{file_name})# When you run the plot for the first time, it will yell at you if you haven't made this a png path. return"new_plot.png"def_data_setup(self):
# When data needs to be run for the plot to work, model inference etc. passdefplot_settings(self):
# If there additional settings to pull from the configpassdefplot(self, plot_kwarg:float):
""" Args: plot_kwarg (float, required): Some kwarg """plt.plot([0,1], [plot_kwarg, plot_kwarg])

Adding to the package

If you wish to add the addition to the package to run using the CLI package, a few things need to be done. For this example, we will add a new metric, but an identicial workflow takes place for plots, just modifying the plots submodule instead of metrics.

  1. Add the name and mapping to the submodule __init__.py.
src/deepdiagnostics/metrics/__init__.py
...
fromdeepdiagnostics.metrics.{yourmetricfile} importNewMetricMetrics= {
...
"NewMetric": NewMetric
}
  1. Add the name and defaults to the Defaults.py
src/deepdiagnostics/utils/Defaults.py
Defaults= {
"common": {...}, ..., "metrics": {
...
"NewMetric": {"default_kwarg": "default overwriting the metric_default in the function definition."}
}
}
  1. Add a test to the repository, ensure it passes.
tests/test_metrics.py
fromdeepdiagnostics.metricsimportNewMetric ...
deftest_newmetric(metric_config, mock_model, mock_data): Config(metric_config)
new_metric=NewMetric(mock_model, mock_data, save=True)
expected_results= {whatyoushouldgetout}
real_results=new_metric.calculate("kwargs that produce the expected results")
assertexpected_results.all() ==real_results.all()
new_metric()
assertnew_metric.outputisnotNoneassertos.path.exists(f"{new_metric.out_dir}/diagnostic_metrics.json")
python3 -m pytest tests/test_metrics.py::test_newmetric
  1. Add documentation
docs/source/metrics.rst
from deepdiagnostics.metrics import NewMetric .. _metrics:
Metrics
=========
.. autoclass:: deepdiagnostics.metrics.metric.Metric:members:...
.. autoclass:: deepdiagnostics.metrics.newmetric.NewMetric:members: calculate
.. bibliography:: 

Building documentation:

  • Documentation automatically updates after any push to the main branch according to readthedocs.yml. Verify the documentation built by checking the readthedocs badge.

Publishing a release:

  • Releases to pypi are built automatically off the main branch whenever a github release is made.
  • Update the version number to match with the release you are going to make before publishing in the pyproject.toml
  • Create a new github release and monitor the publish.yml action to verify the new release is built properly.

Citation

@article{key , author = {Me :D}, title = {title}, journal = {journal}, volume = {v}, year = {20XX}, number = {X}, pages = {XX--XX}
}

Acknowledgement

This software has been authored by an employee or employees of Fermi Research Alliance, LLC (FRA), operator of the Fermi National Accelerator Laboratory (Fermilab) under Contract No. DE-AC02-07CH11359 with the U.S. Department of Energy.

About

Inference diagnostics for mostly SBI

Resources

Contributing

Stars

3 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages