Tags give the ability to mark specific points in history as being important
-
3.3.1
50da825a · ·- pyAgrum - **Static typing**: pyAgrum is marked as typed (`py.typed`), the entry points written in Python are annotated and the remaining C++ types in the annotations are translated (sets of node ids are now `set[int]`). - `CredalNet` CPT accessors and `ShaferShenoyLIMIDInference.reversePartialOrder()` return Python lists instead of unusable SWIG objects. - Fixed `NameError` in `loadMRF`/`saveMRF`/`loadID`/`saveID` for an unknown extension, and missing imports in two tutorials. - aGrUM - `act guideline`: clearer output and new checks `lint` (ruff), `pyannot` and `pytyping` (mypy). - `ruff.toml` selects its rules explicitly; the whole repository is clean for them. -
3.3.0
873701e5 · ·- pyAgrum - **Configuration in C++**: `pyagrum.config` is now the C++ `gum::Configuration` (`PyAgrumConfiguration` and `pyagrum/config.py` removed), with the same API and the same `defaults.ini` / `pyagrum.ini` files. - **Renamed configuration keys**: the `default_` prefix is dropped and the keys of the look of the graphs (`notebook`, `factorgraph`, `dynamicBN`, `influenceDiagram`, `credalnet`, `causal`) are now lowerCamelCase keys defined in aGrUM. The old names are deprecated (still accepted, with a `DeprecationWarning`). - **Graphs drawn by aGrUM**: the raw `toDot()` of graphs and models now gives the look displayed in notebooks, and accepts a new `pyagrum.DotOptions` (size, layout, labels, colors of nodes and arcs). Font colors can be `adaptive` (black or white according to the background, the new default). Graphs given by the user are shown as they are. Code parsing the text of a `toDot()` may have to be adapted. - `pyagrum.lib._colors` renamed `pyagrum.lib.dotstyle` (deprecated relay kept); `hex2rgb` deprecated (use `color2rgb`); `CausalModel.toDot()` arguments `SHOW_LATENT_NAMES`, `NODE_BG`, `NODE_FG`, `EDGE_COL` deprecated. - `skbn.BNClassifier`: `priorWeight` now defaults to the configuration. - Fixed `proba2hex` (invalid colors) and `CLGInference2dot` (without evidence). pyAgrum requires `pydot>=2`. - **Exceptions**: all the aGrUM exceptions are now exported by `pyagrum` (`FactoryError`, `NotImplementedYet`, `IncompatibleEvidence`, `LearningError`, ...). `TypeError` and `IOError` are renamed `GumTypeError` and `GumIOError` so that `from pyagrum import *` no longer shadows the Python builtins. `pyagrum.IOError` is deprecated (use `GumIOError`), as `pyagrum.SyntaxError`: syntax errors are raised as the builtin `SyntaxError` (the aGrUM class is no longer wrapped). A few checks of Python arguments (e.g. `setEvidence` or `setTargets` with a wrong type) and `del pyagrum.config[...]` now raise the builtin `TypeError` or `SyntaxError` instead of the aGrUM ones. - aGrUM - **New: `gum::Configuration`**: thread-safe, typed and documented configuration singleton (defaults embedded in the library from several sources, `agrum.ini` read at start-up, domains of validity, hooks, `push`/`pop`, `save`/`load`). - **Defaults from the configuration**: approximation schemes, sampling/Gibbs/LBP inferences, KL distances, learners (new key `learning.BNLearnerPreferredAlgo`), jgum writers and the text display of tensors read their defaults from the configuration. The corresponding macros (`DEFAULT_EPSILON`, `GIBBSKL_DEFAULT_*`, `GUM_CHI_EPSILON`, ...) are removed. - **Numerical tolerances**: `core.epsilonCoarse`, `epsilonStandard` and `epsilonFine` replace hard-coded literals (some tolerances change slightly, e.g. in `IBayesNet::check()` and `AlmostDifferent`). - **New `gum::dot`** (`DotStyle`, `DotWriter`, `DotOptions`, colors): all the `toDot()` share the same writer, read the configuration and accept `DotOptions`; new `CredalNet::toDot()`; several malformed dot outputs fixed. - `KTBNLearner` and `KTBNAdaptiveLearner` gain `usePC()`, `useFCI()` and `useGreedyThickThinning()`. - Fixed the copy/move of `IBNLearner` and `BNLearner::copyState()`, which lost some options. - `GibbsBNdistance` now draws the variables at random by default (`gibbsKL.drawnAtRandom`). - **Much faster reading of models with clang and MSVC** (BIF, DSL, NET, UAI, O3PRM...): e.g. a large BIF file from 8 s to 0.1 s with clang. - **Aggregators `min`, `max`, `median`, `amplitude`, `sum` on values**: they worked on the indices of the parents, which was wrong for ranges not starting at 0 and for parents with different domains. They now work on the values of the parents and give the closest value of the aggregator (saturated at both bounds). `sum` and `amplitude` need numerical variables (use `count` to count the true parents), `min`, `max` and `median` accept labelized variables (order of the labels) or numerical ones, but not both: an incompatible variable is rejected with `TypeError` (`GumTypeError` in pyAgrum). The decomposition of aggregators now gives the right domains to the intermediate nodes (#198, #201). The aggregators derive from `MultiDimFoldAggregator` (`count`, `exists`, `forall`, `and`, `or`: `neutralElt_()` and `fold_()` on the indices of the parents) or from `MultiDimValueAggregator` (`min`, `max`, `median`, `amplitude`, `sum`: `buildValue_()` on their values). - O3PRM: the error of a system that cannot be instantiated gives the reason (e.g. an unassigned reference slot or a parent refused by an aggregator) instead of an unknown error. - Bug fixes (aGrUM and pyAgrum), thanks to @jschueller for issues #181 to #205 - `ImportanceSampling`: the weight of a sample kept only the ratio of the last node (#181). - Hybrid samplers (`LoopySamplingInference`, `Loopy*Sampling` in pyAgrum): they stopped too early, while the LBP prior still outweighed the samples, and the prior was weighted in the wrong units with weighted samplers (#181). - `LoopyBeliefPropagation`: the error of a sweep was never reset, so LBP stopped after two sweeps (#182). - `ShaferShenoyLIMIDInference`: the optimal policy of a decision now keeps its decision parents (#183), and the variance of `MEU()` includes the covariances between utilities (#188, thanks to Mathias Alerini, Equinor). - `StructuredPlaner`: action-dependent rewards are taken into account (#184); `FMDPSimulator` and the planners no longer crash on a variable without transition for an action, which now keeps its value (#187). - `ShaferShenoyMRFInference::jointPosterior(wanted, declared)` returned the joint of the declared target, not of the wanted one (#185). - `MultiDimFunctionGraphManager`: `setSon` and `eraseNode` left inconsistent parent links (#186). - `MultiDimNoisyORCompound`: a causal weight lower than the leak (invalid model, giving probabilities outside [0,1]) is now rejected with `OutOfBounds` (#190). - `evidenceProbability()` (`LazyPropagation`, `ShaferShenoyInference`, `ShaferShenoyMRFInference`) ignored the connected components without target; the MRF one returned Z(e) instead of P(e) (#191, #193). - `evidenceImpact`, `evidenceJointImpact` and `jointMutualInformation` (BN and MRF) no longer replace the targets and the evidence of the user (#192). - `GibbsSampling`: the chain could freeze on a starting state of null probability; it now starts from a state of positive probability (or raises `IncompatibleEvidence`/`OperationNotAllowed`) (#189); exactly `burnIn()` transitions are done and `burnIn(0)` is allowed (#194). - `MeekRules`: rule R4 was not Meek's R4, so some compelled edges stayed undirected (#195, thanks to @ldesreumaux). - `MultiDimNoisyORCompound`, `MultiDimNoisyORNet`, `MultiDimNoisyAND`: weights outside [0,1] or NaN (and a null leak for `NoisyAND`, also through its setter) are rejected (#205). `BayesNet::addArc` and `addWeightedArc` no longer leave an arc in the graph when the CPT refuses it. - PRM: the CPT of a cast descendant (`setAsCastDescendant`) ignored the label map (#199). - `qBNSampling`: `qBNRejection` reused stale operators after `setEvidence`/`useFragmentBN` (#197); the quantum registers are created in the order of the qubit map (#200); the binarized parent states follow the CPT order (#204); a variable with a single state is rejected with `OperationNotAllowed` instead of crashing (#203). -
3.2.1
37b83783 · ·- pyAgrum - Fixed broken notebook thumbnails (notebooks 22, 67, 80) and added an I/O summary table image to notebook 91. - Expected scikit-learn warnings are now silenced in the pyAgrum tests. - aGrUM - Fixed missing exported symbols (`GUM_PUBLIC` tagging) in several `BASE`, `BN` and `PRM` classes. - `GUM_NO_EXTERN_TEMPLATE_CLASS` is now a public configuration macro. - Removed nested duplicate visibility macros. -
3.2.0
e79c91f3 · ·- pyAgrum - **New: KTBN (k-order dynamic Bayesian networks)** (thanks to Seth Aguila and Anis Khacef): learn, generate and run inference on dynamic Bayesian networks with more than one time slice of memory. Inference (filtering and smoothing) works over any time window with interventions AND observations, and the memory order K itself can be learned from data instead of being fixed by hand. Replaces `pyagrum.lib.dynamicBN` (now deprecated), with new notebooks. - **Lighter, faster import**: pyAgrum's Python modules (`markov_random_field`, `influence_diagram`, `credal_net`, `causal_model`, `prm`, `ktbn`) are now loaded only when needed instead of all at once. - Cleaner error messages (internal technical details no longer shown). - Minor notebook fixes. - **CausalModel from a DAG**: `CausalModel` can now be built from a plain `DAG`, without a `BayesNet` (`hasObservationalBN()`); structural queries work either way, CPT-dependent ones raise `OperationNotAllowed`. `connectedComponents()` return type aligned with other graphical models. - aGrUM - **New: KTBN (k-order dynamic Bayesian networks)** (thanks to Seth Aguila and Anis Khacef): C++ engine behind the pyAgrum feature above -- construction, inference over an arbitrary time window (filtering and smoothing), automatic learning of the memory order K, and random generation. - Windows build reliability improvements (several linking/build fixes). - New CI job testing pyAgrum wheels against a conda-forge-like environment on Windows. - **CausalModel decoupled from BayesNet**: new DAG-only constructor; `observationalBN()` now optional (`hasObservationalBN()` guard); fixes `inducedCausalSubModel` silently building a BN with uninitialized CPTs. `connectedComponents()` now returns `NodeProperty<NodeId>`, like `DAGmodel`/`DiGraph`. - **BUILD_SHARED_LIBS=ON support**: per-module shared libraries for pyAgrum on conda-forge, with `GUM_PUBLIC_<MODULE>` visibility tagging across all modules and numerous accompanying Windows link/build fixes. - Documentation improvements and typo fixes. -
-
3.1.0
0b19c9c0 · ·- pyAgrum - **fastGraph**: - Added `fastDiGraph()`, `fastUndiGraph()`, `fastMixedGraph()`, `fastDAG()`, and `fastPDAG()`. `fastGraph(desc)` is preserved as a single entry point that guesses the returned graph type from `desc`. - The dot-like syntax now accepts non-numeric tokens as node names (not only unsigned ints); malformed or type-incompatible descriptions raise `pyagrum.InvalidArc` / `pyagrum.InvalidEdge` instead of a generic error. - **Configuration**: - `defaults.ini` now carries typed metadata (`### type :: doc` comments) with validation; added `config.typed` accessor and key-deprecation support. - Boolean values are canonicalized to `True`/`False` at set time. - Deprecated `asBool`/`asInt`/`asFloat` accessors. - The configuration reference documentation is now generated from `defaults.ini`. - **Native GUM Format (jgum / bgum)**: - `saveGUM()` for `BayesNet`, `InfluenceDiagram`, and `MarkovRandomField` gains an `indent` parameter, defaulting to `core.default_jgumIndent`. - Aggregator and ICI model nodes are now serialized compactly instead of as dense CPTs. - **MCBNDistance**: - Wrapped the new `MCBNDistance` C++ class. - Fixed `animApproximationScheme` flicker by consolidating it into `utils.py`. - **Documentation**: several improvements. - **Misc**: - Refreshed `pydot>=2` requirement. - aGrUM - **MCBNDistance**: - Added `MCBNDistance`, an independent Monte Carlo estimator of the KL divergence between two Bayesian networks. For a large BN, MCBNDistance is often faster and more accurate than the `GibbsBNDistance` estimator. - **Native GUM Format (jgum / bgum)**: - Aggregator and ICI model nodes are now serialized compactly instead of as dense CPTs. - Hardened aggregator/ICI serialization: `gum::Exception` on malformed input, O(N) writer, `std::optional` aggregator `value()`, private `addAggregator`/`addICIModel`, deduplicated aggregator dispatch. - **fastGraph**: - Replaced the ad hoc Python `fastGraph` parser with a generic C++ template, `gum::fastGraph<GRAPH_TYPE>(std::string_view)`, building a `DiGraph`, `UndiGraph`, `MixedGraph`, `DAG`, or `PDAG` from a dot-like textual description; node tokens can now be names (not only unsigned-int ids) and are preserved when the built graph feeds `moralGraph()`. Malformed or type-incompatible descriptions throw `InvalidArc`/`InvalidEdge` instead of being silently misread. - **StructuralMetrics**: - Guarded `precision`/`recall`/`f_score` against 0/0 division. - **PRM fixes**: - Fixed PRM test suites broken since the `internalGraph()` rename and the CxxTest-to-doctest migration. - Fixed `PRMInstance::_addReferingInstance_` storing the target attribute's safe name instead of the slot chain's own name, which broke SVED/StructuredBayesBall name resolution. - Promoted PRM to an independent CMake module (`PRM_DEPS=BN`) instead of folding it into `BN_DIRS`. - **Testing infrastructure**: - optimization, bug fixes to the new doctest infrastructure. - **Build & Tooling**: - `act guideline` gains a `--source` glob filter to restrict checks to matching files. - Added `gum_cppnb`, a standalone C++ notebook tool auto-installed by `act install aGrUM`, with BN/MRF/ID/CM tutorials. - Finalized the BN+BNLEARNING merge: dropped the redundant BN/learning glob entry - Required `swig>=4.3` (thanks to Julien Schueller). - Simplified CMake threading logic: `GUM_THREADS` cache variable (`stl`/`omp`) replaces the previous flag-assembly logic (thanks to Julien Schueller). -
3.0.0
9c28852d · ·## Changelog for 3.0.0 This major release brings three headline changes: the causal module is promoted from pure Python to a first-class C++ module (`CM`), structure learning is extended with PC, FCI (with PAG output), GreedyThickThinning, and triangle deletions in GreedyHillClimbing, and a new native GUM serialization format (`jgum` / `bgum`) is introduced for all graphical models. It also consolidates widespread API modernisation (C++20 `std::format`, `string_view`, `optional_ref`, `std::optional`, `concepts`) and several breaking renames detailed below. See changelog.txt and https://pyagrum.gitlab.io/blog/changelog_300 for more details.
-
2.3.2
84561d99 · ·## Changelog for 2.3.2 - pyAgrum - Fix sklearn `check_X_y` compatibility with mixed-type DataFrames.
-
2.3.1
31831027 · ·## Changelog for 2.3.1 - aGrUM - Fixed a typo in BIFXML export (thanks to Pierre-François Gimenez). - Better use of PCH in CMakefiles (thanks to Julien Schueller). - o4DGContext :disambiguated log2 namespace. - Make -fno-assume-unique-vtables public (thanks to Julien Schueller). - better ci for linux. - Improved logic for `gum::BNLearner::learnParameters()`. - pyAgrum - `scikit-learn` as a required-dist. - New action for `act` : `pipinstall`. - Improved documentation and notebooks. - Improved logic for `pyagrum.BNLearner.learnParameters()` and `pyagrum.BNLearner.fitParameters()`. -
2.3.0
50ed291c · ·## Changelog for 2.3.0 - aGrUM - Use of std::format` (C++20) to correctly print doubles (thanks to Christopher Eveland). - Updated docker images, runners and CI for C++20 and python 3.14. - Moved `minimalCondSet` from `gum::IBayesNet` to `gum::DAG{model}`. - pyAgrum - Added python 3.14 suppor and fixed some `Py_DecRef`. - Refreshed binder files (python 3.10) - Introduced the new `pyagrum.explain` submodule for explainability in Bayesian Networks. - Improved SHAP value computation performance in in new package `pyagrum.explain` (thanks to Rayane Nasri). - Added support for SHAP values on partial subsets of features in `pyagrum.explain` (thanks to Rayane Nasri). - Introduced the concept of SHALL values for explaining log-likelihood in Bayesian Networks in `pyagrum.explain` (thanks to Ekaterina Bogush and Amélie Chu). - Added tool for exporting documentation to the new site. -
2.2.1
40993102 · ·## Changelog for 2.2.1 - aGrUM - Fixed bugs in `gum::PDAG`(thanks to Louis Derumaux). - Added `gum::Set::popFirst()` - pyAgrum - updated some requirements - Fixed bugs in `pyagrum.PDAG`(thanks to Louis Derumaux). -
2.2.0
cf1283f7 · ·## Changelog for 2.2.0 - aGrUM - (internal) Improved cmake files and act - Enhanced `gum::BNLearner::copyState` to more correctly handle constraints. - Enhanced `gum::BNLearner`'s EM algorithm to enable user-based initialization. - Enhanced `gum::BNLearner`'s EM algorithm to provide more flexible stopping criteria. - Added first version of `CITATION.cff` file. - pyAgrum - Improved documentations coverage - Update wheels - Improved API for `pyagrum.lib.DiscreteTypeProcessor` - Used quantile_method='averaged_inverted_cdf' when quantile method is used for discretization. (sklearn >=1.7 needed). - New (experimental) option for building pyAgrum :--no-gil. - New target for sphinx : markdown for website (new target `site` for sphinx Makefile). - Enhanced `pyagrum.BNLearner`'s EM algorithm to enable user-based initialization. - Enhanced `pyagrum.BNLearner`'s EM algorithm to provide more flexible stopping criteria. - Improved documentaiton. Especially BNLearner and EM's documentation and tutorial.
-
2.1.1
d15a377b · ·## Changelog for 2.1.1 - pyAgrum - documentation (improved coverage and BN input/ouput mainly) - now using `ruff` for formatting (and linting) python files (also in `act guideline`)
-
2.1.0
bb927861 · ·## Changelog for 2.1.0 - aGrUM - Added a new constructor for `gum::Tensor` with a list of variables to automatically add. - Enhanced BIFXML reader/writer to support fast syntax (both for Bayesian Network and for Influence Diagram). - Added deterministic and uniform tensor creation methods in `Tensor` class. - Added `BayesNet.contextualize` method for structurally handling observations and interventions. - Improved code for `BayesNet::operator==`. - `gum::influenceDiagramGenerator` now creates `gum::RangeVariable` instead of `gum::LabelizedVariable`. - Improved readability of range parsing in `allDiscreteVariables_tpl.h`. - Fixed a bug in `gum::Instantiation::contains(std::string)`. - Added `gum::trim_copy` method. - pyAgrum - De-modularized pyagrum to resolve weird bugs. - Enhanced BIFXML reader/writer to support fast syntax (both for Bayesian Network and for Influence Diagram). - Added a new constructor for `pyAgrum.Tensor` with a list of variables to automatically add. - Added deterministic and uniform tensor creation methods in `Tensor` class. - Added `BayesNet.contextualize` method for structurally handling observations and interventions. - `gum::influenceDiagramGenerator` now creates `gum::RangeVariable` instead of `gum::LabelizedVariable`. - Added `pyagrum.lib.notebook.inspectBN` function to visualize a (small) Bayesian Network and its CPTs in a notebook. - Simplified some pyagrum's error messages. - Removed useless methods `newFactory`. - Fixed typos in RTD's documentation and added `pyAgrum.mutilateBN` in the documentation.
-
-
2.0.0
2c47d77a · ·# aGrUM Changelog ## Changelog for 2.0.0 This major update brings several important changes that align with our goals of improving usability, compliance, and consistency. Below are the three main motivations behind this significant upgrade: #### 1. License Change : MIT+LGPLV3 The first major change in version 2.0.0 is the update to our software license. This change ensures better alignment with modern open-source standards and provides clearer guidelines for usage, distribution, and modification ([see here for details](https://agrum.gitlab.io/articles/dual-licenses-lgplv3mit.html)). #### 2. Package Name Update to Follow PEP8 To adhere to Python's PEP8 naming conventions, we have renamed the package from `pyAgrum` to `pyagrum`. We are aware that this change may cause some inconvenience, but it is necessary to ensure consistency with Python's style guidelines and improve the overall user experience. The transition to version 2.0.0 is the right time to implement this change, as it allows us to make a clean break and set a solid foundation for future development. #### 3. Class Renaming: Potential to Tensor In an effort to make the library more intuitive and reflective of its functionality, we have renamed the `Potential` class to `Tensor`. This change better represents the mathematical nature of the class and aligns with common terminology in the field ([see here for details](https://agrum.gitlab.io/articles/tensors-in-pyagrum.html)). #### 4. Modular Code Structure We have reworked the internal structure of the code to make it more modular. This redesign allows for easier extensibility and maintenance in the long term. By breaking down the code into more independent and reusable components, we aim to facilitate future enhancements and possible contributions from the community. ----- #### Detailed Changelog - aGrUM - Split library into `BASE`/`BN`/`CN`/`FMDP`/`ID`/`MRF` sub-libraries . - Enhanced swig files (thanks to Julien Schueller!). - Improved compilation time for the whole library. - Removed obsolete deprecated, experimental code. - Moved `gum::Potential` to `gum::Tensor`. - used functions of `std::filesystem`. - Removed uses of `mkstemp`/`opendir`/`dup`/etc. and inclusions of `dirent.h` and `unistd.h`. - Minor typos in aGrUM's testsuite. - pyAgrum - Split module into `pyAgrum.base`/`bn`/`cn`/`id`/`mrf` sub-modules. - Changed name of pyAgrum's package: from `pyAgrum` to `pyAgrum`. - Alignd wheel naming with binary distribution format. - Renamed `gum.lib.Discretizer` to `gum.lib.DiscreteTypeProcessor`. - Fixed a bug for `pyAgrum.DiscreteTypeProcessor` with a boolean variable in the database (thanks to Yann Le Biannic). - Fixed a bug then calling `gum.BNLearner.learnEssentialGraph` with a score-based algorithm (thanks to Yann Le Biannic). - *pyAgrum-izing* types in `swig`-generated `cpp` files. - Removed obsolete deprecated, experimental codes. - Moved `pyAgrum.Potential` to `pyAgrum.Tensor`. - Added glossary in readthedoc site. - Improved notebooks, docstrings and sphinx documentations. - Stable abi for wheel generation. Added possibility to turn off stable abi use. - CIs for apple silicon. - Removed old deprecation. - Added new experimental pyAgrum's model : Miture of Bayesian Networks (thanks to Rodrique Tavernier). - Licences are now included in the wheels.
-
1.17.2
e26d7c4b · ·* pyAgrum * Fixed some bugs in `pyAgrum.lib.shapley` (thanks Stefano Mariani !). * Changed last MN->MRF (`pyAgrum.{loadMRF|saveMRF|availableMRFExts}`). * Improved pickling of `pyAgrum.skbn.BNClassifier`. -
1.17.1
814ba584 · ·* aGrUM * Fixed extra semicolon. * pyAgrum * Fixed some pyAgrum types in generated files. * Added check for pandas in tests. * Renamed files in module `pyAgrum.clg`. * Fixed METADATA for pypi.
-
1.17.0
4c6e93b4 · ·* pyAgrum * Added support for `python 3.13`. * Added generator `pyAgrum.Instantiation.loopIn()` to iterate on an `pyAgrum.Instantiation`. * Significantly accelerated `pyAgrum.Potential.fillFromDistribution()`. * Major acceleration of `pyAgrum.clg.ForwardSampling.make_sample()`.
-
1.16.0
1c53d45e · ·* aGrUM * Added 3 behaviors for generating sampling from `gum::DiscretizedVariable` in `gum::BNDatabaseGenerator` : `INTERVAL`/`MEDIAN`/`RANDOM`. The default was `INTERVAL` and is now `RANDOM`. * Added timeout for `gum::BNDatabaseGenerator` to prevent slowish (maybe infinite) rejection sampling. * Added two new constraints for learning :`gum::learning::NoParentNode`,`gum::learning::NoChildNode`. * Added these new constraints in `gum::BNLearner` : `addNoParentNode(nodeid)` and `addNoChildrenNode(nodeid)`. * (internal) Improved `act`'s scripts. * pyAgrum * Dropped support of python 3.9 (following [NEP29](https://numpy.ingg/nings/nep-0029-deprecation_policy.html)). * Added 3 behaviors for generating sampling from `pyAgrum.DiscretizedVariable` in `pyAgrum.BNDatabaseGenerator` : `INTERVAL`/`MEDIAN`/`RANDOM`. The default was `INTERVAL` and is now `RANDOM`. * Added timeout for `pyAgrum.BNDatabaseGenerator` to prevent slowish (maybe infinite) rejection sampling. * Added two new constraints `pyAgrum.BNLearner.addNoParentNode()` and `pyAgrum.BNLearner.addNoChildrenNode()`. * (internal) Standardized licence in python files * Added new `pyAgrum.causal.CausalEffectsEstimation` (thanks to Thierry Rioual). * `pyAgrum.causal.BNClassfier`can now be pickled (thanks to Valentin Vassilev). * Added module `pyAgrum.lib.shapley` (included in `pyAgrum.lib.explain`) to allow the use of `ShapValues` not only from notebooks (thanks to Stefano Mariani). * Added a parameter `filename` to `pyAgrum.lib.shapley.ShapValues`'s methods for saving the figure instead of showing it (thanks to Stefano Mariani).