DIANNA
DIANNA: Deep Insight And Neural Network Analysis - Published in JOSS (2022)
Science Score: 98.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 16 DOI reference(s) in README and JOSS metadata -
✓Academic publication links
Links to: arxiv.org, plos.org, joss.theoj.org, zenodo.org -
○Committers with academic emails
-
○Institutional organization owner
-
✓JOSS paper metadata
Published in Journal of Open Source Software
Keywords
Scientific Fields
Repository
Deep Insight And Neural Network Analysis
Basic Info
- Host: GitHub
- Owner: dianna-ai
- License: apache-2.0
- Language: Jupyter Notebook
- Default Branch: main
- Homepage: https://dianna.readthedocs.io
- Size: 279 MB
Statistics
- Stars: 52
- Watchers: 4
- Forks: 12
- Open Issues: 96
- Releases: 19
Topics
Metadata Files
README.md


Deep Insight And Neural Network Analysis
DIANNA is a Python package that brings explainable AI (XAI) to your research project. It wraps carefully selected XAI methods in a simple, uniform interface. It's built by, with and for (academic) researchers and research software engineers working on machine learning projects.
Why DIANNA?
DIANNA software is addressing needs of both (X)AI researchers and mostly the various domains scientists who are using or will use AI models for their research without being experts in (X)AI. DIANNA is future-proof: one of the very few XAI library supporting the Open Neural Network Exchange (ONNX) format.
After studying the vast XAI landscape we have made choices in the parts of the XAI Taxonomy on which methods, data modalities and problems types to focus. Our choices, based on the largest usage in scientific literature, are shown graphically in the XAI taxonomy below:
The key points of DIANNA:
- Provides an easy-to-use interface for non (X)AI experts
- Implements well-known XAI methods LIME, RISE and KernelSHAP, chosen by systematic and objective evaluation criteria
- Comes with a dashboard where results of different explainers can be compared for all data types
- Supports the de-facto standard of neural network models - ONNX
- Supports images, text, time series, tabular data modalities and embeddings (in a related package)
- Comes with simple intuitive image, text, time series, and tabular benchmarks, so can help you with your XAI research
- Includes scientific use-cases tutorials
- Easily extendable to other XAI methods
For more information on the unique strengths of DIANNA with comparison to other tools, please see the context landscape.
Installation
DIANNA can be installed from PyPI using pip on any of the supported Python versions (see badge):
console
python3 -m pip install dianna
To install the most recent development version directly from the GitHub repository run:
console
python3 -m pip install git+https://github.com/dianna-ai/dianna.git
If you get an error related to OpenMP when importing dianna, have a look at this issue for possible workarounds.
Pre-requisites only for Macbook Pro with M1 Pro chip users
- To install TensorFlow you can follow this [tutorial](https://betterdatascience.com/install-tensorflow-2-7-on-macbook-pro-m1-pro/). - To install TensorFlow Addons you can follow these [steps](https://github.com/tensorflow/addons/pull/2504). For further reading see this [issue](https://github.com/tensorflow/addons/issues/2503). Note that this temporary solution works only for macOS versions >= 12.0. Note that this step may have changed already, see https://github.com/dianna-ai/dianna/issues/245. - Before installing DIANNA, comment `tensorflow` requirement in `setup.cfg` file (tensorflow package for M1 is called `tensorflow-macos`).
Getting started
You need:
- your trained ONNX model (convert my pytorch/tensorflow/keras/scikit-learn model to ONNX)
- a data item to be explained
You get:
- a relevance map overlayed over the data item
Template example for any data modality and explainer
- Provide your trained model and data item ( text, image, time series or tabular )
python
model_path = 'your_model.onnx' # model trained on your data modality
data_item = <data_item> # data item for which the model's prediction needs to be explained
- If the task is classification: which are the classes your model has been trained for?
python
labels = [class_a, class_b] # example of binary classification labels
Which of these classes do you want an explanation for?
python
explained_class_index = labels.index(<explained_class>) # explained_class can be any of the labels
- Run dianna with the explainer of your choice ( 'LIME', 'RISE' or 'KernalSHAP') and visualize the output:
python
explanation = dianna.<explanation_function>(model_path, data_item, explainer)
dianna.visualization.<visualization_function>(explanation[explained_class_index], data_item)
Text and image usage
Examples
Lets illustrate the template above with *textual* data. The data item of interest is a sentence being (a part of) a movie review and the model has been trained to classify reviews into positive and negative sentiment classes.
We are intersted which words are contributing positively (red) and which - negatively (blue) towards the model's desicion to classify the review as positive and we would like to use the *LIME* explainer:
```python
model_path = 'your_text_model.onnx'
# also define a model runner here (details in dedicated notebook)
review = 'The movie started great but the ending is boring and unoriginal.'
labels = ["negative", "positive"]
explained_class_index = labels.index("positive")
explanation = dianna.explain_text(model_path, text, 'LIME')
dianna.visualization.highlight_text(explanation[explained_class_index], model_runner.tokenizer.tokenize(review))
```

Here is another illustration on how to use dianna to explain which parts of a bee *image* contributied positively (red) or negativey (blue) towards a classifying the image as a *'bee'* using *RISE*.
The Imagenet model has been trained to distinguish between 1000 classes (specified in ```labels```).
For images, which are data of higher dimention compared to text, there are also some specifics to consider:
```python
model_path = 'your_image_model.onnx'
image = PIL.Image.open('your_bee_image.jpeg')
axis_labels = {2: 'channels'}
explained_class_index = labels.index('bee')
explanation = dianna.explain_image(model_path, image, 'RISE', axis_labels=axis_labels, labels=labels)
dianna.visualization.plot_image(explanation[explained_class_index], utils.img_to_array(image)/255., heatmap_cmap='bwr')
plt.show()
```
And why would Imagenet think the same image would be a *garden spider*?
```python
explained_class_index = labels.index('garden_spider') # interested in the image being classified as a garden spider
explanation = dianna.explain_image(model_path, image, 'RISE', axis_labels=axis_labels, labels=labels)
dianna.visualization.plot_image(explanation[explained_class_index], utils.img_to_array(image)/255., heatmap_cmap='bwr')
plt.show()
```
Overview tutorial
There are full working examples on how to use the supported explainers and how to use dianna for all supported data modalities in our overview tutorial.
IMPORTANT: Sensitivity to hyperparameters
The explainers are sensitive to the choice of their hyperparameters! In this work, this sensitivity to hyperparameters is researched and useful conclusions are drawn. The default hyperparameters used in DIANNA for each explainer as well as the values for our tutorial examples are given in the Tutorials README.
Introductory video
This video shows the main functionality of DIANNA and shows you how to use DIANNA also from its dashboard.
Dashboard
Explore the explanations of your trained model using the DIANNA dashboard. Click here for more information.
Datasets
DIANNA comes with simple datasets. Their main goal is to provide intuitive insight into the working of the XAI methods. They can be used as benchmarks for evaluation and comparison of existing and new XAI methods.
Images
| Dataset | Description | Examples | Generation | | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | | Binary MNIST
| [Binary MNIST dataset generation](https://github.com/dianna-ai/dianna-exploration/tree/main/example_data/dataset_preparation/MNIST) |
| [Simple Geometric (circles and triangles)](https://doi.org/10.5281/zenodo.5012824)
| [Simple geometric shapes dataset generation](https://github.com/dianna-ai/dianna-exploration/tree/main/example_data/dataset_preparation/geometric_shapes) |
| [Simple Scientific (LeafSnap30)](https://zenodo.org/record/5061353/)
| [LeafSnap30 dataset generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/dataset_preparation/LeafSnap/) |
Text
| Dataset | Description | Examples | Generation |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------- | :--------------------------------------------------------------- | :------------------------------------------------------------------ |
| [Stanford sentiment treebank](https://nlp.stanford.edu/sentiment/index.html)
| Dataset for predicting the sentiment, positive or negative, of movie reviews. | _This movie was actually neither that funny, nor super witty._ | [Sentiment treebank](https://nlp.stanford.edu/sentiment/treebank.html) |
| [EU-law statements](https://zenodo.org/records/8200000) | Reproducibility data for a quantitative study on EU legislation. | _A Member State wishing to grant exemptions referred to in paragraph 6 shall notify the Council in writing_ | [EU legislation strictness analysis](https://github.com/nature-of-eu-rules/eu-legislation-strictness-analysis) |
Time series
| Dataset | Description | Examples | Generation |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------ |
| [Coffee dataset](https://www.timeseriesclassification.com/description.php?Dataset=Coffee) | Food spectographs time series dataset for a two class problem to distinguish between Robusta and Arabica coffee beans. |
| [data source](https://github.com/QIBChemometrics/Benchtop-NMR-Coffee-Survey) |
| [Weather dataset](https://zenodo.org/record/7525955)
| The light version of the weather prediciton dataset, which contains daily observations (89 features) for 11 European locations through the years 2000 to 2010. |
| [data source](https://github.com/florian-huber/weather_prediction_dataset) |
Tabular
| Dataset | Description | Examples | Generation |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------ |
| [Pengiun dataset](https://www.kaggle.com/code/parulpandey/penguin-dataset-the-new-iris) | Palmer Archipelago (Antarctica) penguin dataset is a great intro dataset for data exploration & visualization similar to the famous Iris dataset. |
| [data source](https://github.com/allisonhorst/palmerpenguins) |
| [Weather dataset](https://zenodo.org/record/7525955) | The light version of the weather prediciton dataset, which contains daily observations (89 features) for 11 European locations through the years 2000 to 2010. |
| [data source](https://github.com/florian-huber/weather_prediction_dataset) |
| [Land atmosphere dataset](https://zenodo.org/records/12623257)
| It contains land-atmosphere variables and latent heat flux (LEtot) simulated by STEMMUS-SCOPE (soil-plant model), version 1.5.0, over 19 Fluxnet sites and for the year 2014 with hourly intervals. |
| [data source](https://zenodo.org/records/12623257) |
Models
We work with ONNX! ONNX is a great unified neural network standard which can be used to boost reproducible science. Using ONNX for your model also gives you a boost in performance! In case your models are still in another popular DNN (deep neural network) format, here are some simple recipes to convert them:
- pytorch and pytorch-lightning - use the built-in
torch.onnx.exportfunction to convert pytorch models to onnx, or call the built-into_onnxfunction on yourLightningModuleto export pytorch-lightning models to onnx. - tensorflow - use the
tf2onnxpackage to convert tensorflow models to onnx. - keras - same as the conversion from tensorflow to onnx, the
tf2onnxpackage also supports keras. - scikit-learn - use the
skl2onnxpackage to scikit-learn models to onnx.
More converters with examples and tutorials can be found on the ONNX tutorial page.
And here are links to notebooks showing how we created our models on the benchmark datasets:
Images
| Models | Generation | | :-------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Binary MNIST model](https://zenodo.org/record/5907177) | [Binary MNIST model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/MNIST/generate_model_binary.ipynb) | | [Simple Geometric model](https://zenodo.org/deposit/5907059) | [Simple geometric shapes model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/geometric_shapes/generate_model.ipynb) | | [Simple Scientific model](https://zenodo.org/record/5907196) | [LeafSnap30 model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/LeafSnap/generate_model.ipynb) |Text
| Models | Generation | |:---------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [Movie reviews model](https://zenodo.org/record/5910598) | [Stanford sentiment treebank model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/movie_reviews/generate_model.ipynb) | | [Regalatory statement classifier](https://zenodo.org/record/8200001) | [EU-law regulatory-statement-classification](https://github.com/nature-of-eu-rules/regulatory-statement-classification) |Time series
| Models | Generation | | :-------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Coffee model](https://zenodo.org/records/10579458) | [Coffee model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/coffee/generate_model.ipynb) | | [Season prediction model](https://zenodo.org/record/7543883) | [Season prediction model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/season_prediction/generate_model.ipynb) | | [Fast Radio Burst classification model](https://zenodo.org/records/10656614) | [Fast Radio Burst classification model generation](https://doi.org/10.3847/1538-3881/aae649) |Tabular
| Models | Generation | | :-------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Penguin model (classification)](https://zenodo.org/records/10580743) | [Penguin model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/penguin_species/generate_model.ipynb) | | [Sunshine hours prediction model (regression)](https://zenodo.org/records/10580833) | [Sunshine hours prediction model generation](https://github.com/dianna-ai/dianna-exploration/blob/main/example_data/model_generation/sunshine_prediction/generate_model.ipynb) | | [Latent heat flux prediction model (regression)](https://zenodo.org/records/12623257) | [Latent heat flux prediction model](doi:10.5281/zenodo.12623256/stemmus_scope_emulator_model_LEtot.onnx) |We envision the birth of the ONNX Scientific models zoo soon...
Tutorials
DIANNA supports different data modalities and XAI methods (explainers). We have evaluated many explainers using objective criteria (see the How to find your AI explainer blog-post). The table below contains links to the relevant XAI method's papers (for some explanatory videos on the methods, please see tutorials). The DIANNA tutorials cover each supported method and data modality on a least one dataset using the default or tuned hyperparameters. Our plans to expand DIANNA with more data modalities and explainers are given in the ROADMAP.
| Data \ XAI | RISE | LIME | KernelSHAP | | :--------- | :------------------------------------------------ | :----------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- | | Images | ✅ | ✅ | ✅ | | Text | ✅ | ✅ | | | Timeseries | ✅ | ✅ | | | Tabular | ✅ | ✅ | ✅ | | Embedding | inspired by RISE in distance_explainer | | | | Graphs | next steps | ... | ... |
LRP and PatternAttribution also feature in the top 5 of our thoroughly evaluated explainers. Also GradCAM) has been recently found to be semantically continous! Contributing by adding these and more (new) post-hoc explainability methods on ONNX models is very welcome!
Scientific use-cases
Our goal is that the scientific community embrases XAI as a source for novel and unexplored perspectives on scientific problems. Here, we offer tutorials on specific scientific use-cases of uisng XAI:
| Use-case (data) \ XAI | RISE | LIME | KernelSHAP | |:-------------------------------------------------------------------|:-----------------------------------------------------| :---------------------------------------------------------------------| :-------------------------------------------------------------------------------------------------------| | Biology (Phytomorphology): Tree Leaves classification (images) | | ✅ | | | Astronomy: Fast Radio Burst detection (timeseries) | ✅ | | | | Land-atmosphere modeling: Latent heat flux prediction (tabular) | | | ✅ | | Social sciences: EU-law regulatory statement classification (text) | | ✅ | | | Climate | planned | ... | ... |
Reference documentation
For detailed information on using specific DIANNA functions, please visit the documentation page hosted at Readthedocs.
Contributing
If you want to contribute to the development of DIANNA, have a look at the contribution guidelines. See our developer documentation for information on developer installation, running tests, generating documentation, versioning and making a release.
How to cite us
If you use this package for your scientific work, please consider citing directly the software as:
Ranguelova, E., Bos, P., Liu, Y., Meijer, C., Oostrum, L., Crocioni, G., Ootes, L., Chandramouli, P., Jansen, A., Smeets, S. (2023). dianna (*[VERSION YOU USED]*). Zenodo. https://zenodo.org/record/5592606
or the JOSS paper as:
Ranguelova et al., (2022). DIANNA: Deep Insight And Neural Network Analysis. Journal of Open Source Software, 7(80), 4493, https://doi.org/10.21105/joss.04493
See also the Zenodo page or the JOSS page for exporting the software citation to BibTteX and other formats.
Credits
This package was created with Cookiecutter and the NLeSC/python-template.
Owner
- Name: Deep Insight And Neural Network Analysis (DIANNA)
- Login: dianna-ai
- Kind: organization
- Location: Amsterdam
- Website: https://www.esciencecenter.nl/news/explaining-the-unexplained-at-the-netherlands-escience-center-and-surf/
- Twitter: dianna_ai
- Repositories: 3
- Profile: https://github.com/dianna-ai
Netherlands eScience Center and SURF project to build software for post-hoc explainability of deep neural networks for scientists
JOSS Publication
DIANNA: Deep Insight And Neural Network Analysis
Authors
Tags
explainable AI Deep Neural Networks ONNX benchmark datasetsCitation (CITATION.cff)
# YAML 1.2
---
cff-version: 1.2.0
title: "dianna"
authors:
-
family-names: Ranguelova
given-names: Elena
orcid: "https://orcid.org/0000-0002-9834-1756"
-
family-names: Bos
given-names: Patrick
orcid: "https://orcid.org/0000-0002-6033-960X"
-
family-names: Liu
given-names: Yang
orcid: "https://orcid.org/0000-0002-1966-8460"
-
family-names: Meijer
given-names: Christiaan
orcid: "https://orcid.org/0000-0002-5529-5761"
-
family-names: Alidoost
given-names: Fakhereh (Sarah)
orcid: "https://orcid.org/0000-0001-8407-6472"
-
family-names: Oostrum
given-names: Leon
orcid: "https://orcid.org/0000-0001-8724-8372"
-
family-names: Crocioni
given-names: Giulia
orcid: "https://orcid.org/0000-0002-0823-0121"
-
family-names: Jansen
given-names: Aron
orcid: "https://orcid.org/0000-0002-4764-9347"
-
family-names: Ootes
given-names: Laura
orcid: "https://orcid.org/0000-0002-2800-8309"
-
family-names: Chandramouli
given-names: Pranav
orcid: "https://orcid.org/0000-0002-7896-2969"
-
family-names: Smeets
given-names: Stef
orcid: "https://orcid.org/0000-0002-5413-9038"
-
family-names: Spek
given-names: Willem
name-particle: "van der"
doi: 10.5281/zenodo.5801485
version: "1.7.0"
repository-code: "https://github.com/dianna-ai/dianna"
keywords:
- XAI
- machine learning
message: "If you use this software, please cite it using these metadata."
license: Apache-2.0
GitHub Events
Total
- Create event: 8
- Release event: 1
- Issues event: 5
- Watch event: 6
- Delete event: 2
- Issue comment event: 26
- Push event: 40
- Pull request review comment event: 4
- Pull request review event: 8
- Pull request event: 12
Last Year
- Create event: 8
- Release event: 1
- Issues event: 5
- Watch event: 6
- Delete event: 2
- Issue comment event: 26
- Push event: 40
- Pull request review comment event: 4
- Pull request review event: 8
- Pull request event: 12
Committers
Last synced: 5 months ago
Top Committers
| Name | Commits | |
|---|---|---|
| Laura Ootes | l****s@e****l | 399 |
| Elena Ranguelova | E****a@e****l | 375 |
| Christiaan Meijer | c****r@e****l | 322 |
| Leon Oostrum | l****m@e****l | 211 |
| Yang | y****u@e****l | 173 |
| E. G. Patrick Bos | e****s@g****m | 90 |
| SarahAlidoost | f****t@e****l | 78 |
| gcroci2 | c****a@g****m | 37 |
| Stef Smeets | s****s | 33 |
| WillemSpek | w****k@g****m | 29 |
| cpranav93 | p****i@e****l | 27 |
| Aron | a****n@g****m | 20 |
| Pranav Chandramouli | c****3@y****m | 16 |
| Abel Soares Siqueira | a****a@g****m | 2 |
| Jurriaan H. Spaaks | j****s@e****l | 2 |
| NLeSC Python template | n****e | 1 |
| _ocean | o****1 | 1 |
| elboyran | e****r@I****4 | 1 |
| Giulia Crocioni | g****i@g****n | 1 |
| kody.moodley@gmail.com | k****y@g****m | 1 |
Committer Domains (Top 20 + Academic)
Issues and Pull Requests
Last synced: 4 months ago
All Time
- Total issues: 237
- Total pull requests: 140
- Average time to close issues: 3 months
- Average time to close pull requests: 22 days
- Total issue authors: 13
- Total pull request authors: 11
- Average comments per issue: 1.44
- Average comments per pull request: 2.04
- Merged pull requests: 124
- Bot issues: 0
- Bot pull requests: 0
Past Year
- Issues: 11
- Pull requests: 18
- Average time to close issues: 15 days
- Average time to close pull requests: 5 days
- Issue authors: 3
- Pull request authors: 5
- Average comments per issue: 1.64
- Average comments per pull request: 2.28
- Merged pull requests: 10
- Bot issues: 0
- Bot pull requests: 0
Top Authors
Issue Authors
- cwmeijer (81)
- elboyran (64)
- laurasootes (22)
- WillemSpek (15)
- geek-yang (15)
- cpranav93 (13)
- SarahAlidoost (13)
- loostrum (8)
- stefsmeets (6)
- egpbos (1)
- ClaireDons (1)
- gcroci2 (1)
- APJansen (1)
Pull Request Authors
- elboyran (54)
- cwmeijer (34)
- loostrum (20)
- SarahAlidoost (20)
- laurasootes (18)
- geek-yang (18)
- stefsmeets (16)
- egpbos (9)
- cpranav93 (7)
- WillemSpek (6)
- APJansen (1)
Top Labels
Issue Labels
Pull Request Labels
Packages
- Total packages: 2
-
Total downloads:
- pypi 85 last-month
-
Total dependent packages: 0
(may contain duplicates) -
Total dependent repositories: 1
(may contain duplicates) - Total versions: 38
- Total maintainers: 2
proxy.golang.org: github.com/dianna-ai/dianna
- Documentation: https://pkg.go.dev/github.com/dianna-ai/dianna#section-documentation
- License: apache-2.0
-
Latest release: v1.7.0
published about 1 year ago
Rankings
pypi.org: dianna
Deep Insight And Neural Network Analysis
- Homepage: https://github.com/dianna-ai/dianna
- Documentation: https://dianna.readthedocs.io/
- License: Apache License 2.0
-
Latest release: 1.7.0
published about 1 year ago
Rankings
Dependencies
- actions/setup-python v3 composite
- ./.github/actions/install-python-and-package * composite
- actions/checkout v3 composite
- actions/checkout v3 composite
- citation-file-format/cffconvert-github-action 2.0.0 composite
- ./.github/actions/install-python-and-package * composite
- actions/checkout v3 composite
- actions/checkout v3 composite
- actions/upload-artifact v1 composite
- openjournals/openjournals-draft-action master composite
- fair-software/howfairis-github-action 0.2.1 composite
- ./.github/actions/install-python-and-package * composite
- actions/checkout v3 composite
- actions/checkout main composite
- gaurav-nelson/github-action-markdown-link-check v1 composite
- actions/checkout main composite
- gaurav-nelson/github-action-markdown-link-check v1 composite
- ./.github/actions/install-python-and-package * composite
- actions/checkout v3 composite
- ./.github/actions/install-python-and-package * composite
- actions/checkout v3 composite
- actions/download-artifact v3 composite
- actions/upload-artifact v3 composite
- pypa/gh-action-pypi-publish v1.4.2 composite
- ./.github/actions/install-python-and-package * composite
- SonarSource/sonarcloud-github-action master composite
- actions/checkout v3 composite
