diff options
| author | CoprDistGit <infra@openeuler.org> | 2023-05-05 03:34:42 +0000 |
|---|---|---|
| committer | CoprDistGit <infra@openeuler.org> | 2023-05-05 03:34:42 +0000 |
| commit | c2bb1d962534f76d4e4bfcc32eaa993e61422068 (patch) | |
| tree | 93e2ef9cc5bc633e228b35380f5d9a3bb0722bec | |
| parent | fe3494a0adb494fcbcb730864da08ce9eda8753f (diff) | |
automatic import of python-pydtmcopeneuler20.03
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | python-pydtmc.spec | 938 | ||||
| -rw-r--r-- | sources | 1 |
3 files changed, 940 insertions, 0 deletions
@@ -0,0 +1 @@ +/PyDTMC-8.2.0.tar.gz diff --git a/python-pydtmc.spec b/python-pydtmc.spec new file mode 100644 index 0000000..133cfce --- /dev/null +++ b/python-pydtmc.spec @@ -0,0 +1,938 @@ +%global _empty_manifest_terminate_build 0 +Name: python-PyDTMC +Version: 8.2.0 +Release: 1 +Summary: A full-featured and lightweight library for discrete-time Markov chains analysis. +License: MIT +URL: https://github.com/TommasoBelluzzo/PyDTMC +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/64/b0/8f7ab69998f60976805efe15c2bf086259aed3d423196726e035faef2741/PyDTMC-8.2.0.tar.gz +BuildArch: noarch + +Requires: python3-matplotlib +Requires: python3-networkx +Requires: python3-numpy +Requires: python3-scipy +Requires: python3-setuptools +Requires: python3-wheel +Requires: python3-twine +Requires: python3-docutils +Requires: python3-typing-extensions +Requires: python3-sphinx +Requires: python3-sphinx-autodoc-typehints +Requires: python3-sphinx-rtd-theme +Requires: python3-flake8 +Requires: python3-pylint +Requires: python3-defusedxml +Requires: python3-numpydoc +Requires: python3-pandas +Requires: python3-pydot +Requires: python3-coverage +Requires: python3-pytest +Requires: python3-pytest-benchmark +Requires: python3-pytest-cov +Requires: python3-coveralls + +%description +PyDTMC is a full-featured and lightweight library for discrete-time Markov chains analysis. It provides classes and functions for creating, manipulating, simulating and visualizing Markov processes. + +<table> + <tr> + <td align="right">Status:</td> + <td align="left"> + <a href="https://github.com/TommasoBelluzzo/PyDTMC/actions/workflows/continuous_integration.yml"><img alt="Build" src="https://img.shields.io/github/workflow/status/TommasoBelluzzo/PyDTMC/Continuous%20Integration?style=flat&label=Build&color=1081C2"/></a> + <a href="https://pydtmc.readthedocs.io/"><img alt="Docs" src="https://img.shields.io/readthedocs/pydtmc?style=flat&label=Docs&color=1081C2"/></a> + <a href="https://coveralls.io/github/TommasoBelluzzo/PyDTMC?branch=master"><img alt="Coverage" src="https://img.shields.io/coveralls/github/TommasoBelluzzo/PyDTMC?style=flat&label=Coverage&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Info:</td> + <td align="left"> + <a href="#"><img alt="License" src="https://img.shields.io/github/license/TommasoBelluzzo/PyDTMC?style=flat&label=License&color=1081C2"/></a> + <a href="#"><img alt="Lines" src="https://img.shields.io/tokei/lines/github/TommasoBelluzzo/PyDTMC?style=flat&label=Lines&color=1081C2"/></a> + <a href="#"><img alt="Size" src="https://img.shields.io/github/repo-size/TommasoBelluzzo/PyDTMC?style=flat&label=Size&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">PyPI:</td> + <td align="left"> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Version" src="https://img.shields.io/pypi/v/PyDTMC?style=flat&label=Version&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Python" src="https://img.shields.io/pypi/pyversions/PyDTMC?style=flat&label=Python&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Wheel" src="https://img.shields.io/pypi/wheel/PyDTMC?style=flat&label=Wheel&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Downloads" src="https://img.shields.io/pypi/dm/PyDTMC?style=flat&label=Downloads&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Conda:</td> + <td align="left"> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Version" src="https://img.shields.io/conda/vn/conda-forge/pydtmc?style=flat&label=Version"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Python" src="https://img.shields.io/pypi/pyversions/PyDTMC?style=flat&label=Python&color=1081C2"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Platforms" src="https://img.shields.io/conda/pn/conda-forge/pydtmc?style=flat&label=Platforms&color=1081C2"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Downloads" src="https://img.shields.io/conda/dn/conda-forge/pydtmc?style=flat&label=Downloads&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Donation:</td> + <td align="left"> + <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D8LH6DNYN7EN8"><img alt="PayPal" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif"/></a> + </td> + </tr> +</table> + +## Requirements + +The `Python` environment must include the following packages: + +* [Matplotlib](https://matplotlib.org/) +* [NetworkX](https://networkx.github.io/) +* [NumPy](https://www.numpy.org/) +* [SciPy](https://www.scipy.org/) + +*Notes:* + +* It's recommended to install [Graphviz](https://www.graphviz.org/) and [pydot](https://pypi.org/project/pydot/) before using the `plot_graph` function. +* The packages [pytest](https://pytest.org/) and [pytest-benchmark](https://pypi.org/project/pytest-benchmark/) are required for performing unit tests. +* The package [Sphinx](https://www.sphinx-doc.org/) is required for building the package documentation. + +## Installation & Upgrade + +[PyPI](https://pypi.org/): + +```sh +$ pip install PyDTMC +$ pip install --upgrade PyDTMC +``` + +[Git](https://git-scm.com/): + +```sh +$ pip install https://github.com/TommasoBelluzzo/PyDTMC/tarball/master +$ pip install --upgrade https://github.com/TommasoBelluzzo/PyDTMC/tarball/master + +$ pip install git+https://github.com/TommasoBelluzzo/PyDTMC.git#egg=PyDTMC +$ pip install --upgrade git+https://github.com/TommasoBelluzzo/PyDTMC.git#egg=PyDTMC +``` + +[Conda](https://docs.conda.io/): + +```sh +$ conda install -c conda-forge pydtmc +$ conda update -c conda-forge pydtmc + +$ conda install -c tommasobelluzzo pydtmc +$ conda update -c tommasobelluzzo pydtmc +``` + +## Usage: MarkovChain Class + +The `MarkovChain` class can be instantiated as follows: + +```console +>>> p = [[0.2, 0.7, 0.0, 0.1], [0.0, 0.6, 0.3, 0.1], [0.0, 0.0, 1.0, 0.0], [0.5, 0.0, 0.5, 0.0]] +>>> mc = MarkovChain(p, ['A', 'B', 'C', 'D']) +>>> print(mc) + +DISCRETE-TIME MARKOV CHAIN + SIZE: 4 + RANK: 4 + CLASSES: 2 + > RECURRENT: 1 + > TRANSIENT: 1 + ERGODIC: NO + > APERIODIC: YES + > IRREDUCIBLE: NO + ABSORBING: YES + REGULAR: NO + REVERSIBLE: YES + SYMMETRIC: NO +``` + +Below a few examples of `MarkovChain` properties: + +```console +>>> print(mc.is_ergodic) +False + +>>> print(mc.recurrent_states) +['C'] + +>>> print(mc.transient_states) +['A', 'B', 'D'] + +>>> print(mc.steady_states) +[array([0.0, 0.0, 1.0, 0.0])] + +>>> print(mc.is_absorbing) +True + +>>> print(mc.fundamental_matrix) +[[1.50943396, 2.64150943, 0.41509434] + [0.18867925, 2.83018868, 0.30188679] + [0.75471698, 1.32075472, 1.20754717]] + +>>> print(mc.kemeny_constant) +5.547169811320755 + +>>> print(mc.entropy_rate) +0.0 +``` + +Below a few examples of `MarkovChain` methods: + +```console +>>> print(mc.absorption_probabilities()) +[1.0 1.0 1.0] + +>>> print(mc.expected_rewards(10, [2, -3, 8, -7])) +[44.96611926, 52.03057032, 88.00000000, 51.74779651] + +>>> print(mc.expected_transitions(2)) +[[0.0850, 0.2975, 0.0000, 0.0425] + [0.0000, 0.3450, 0.1725, 0.0575] + [0.0000, 0.0000, 0.7000, 0.0000] + [0.1500, 0.0000, 0.1500, 0.0000]] + +>>> print(mc.first_passage_probabilities(5, 3)) +[[0.5000, 0.0000, 0.5000, 0.0000] + [0.0000, 0.3500, 0.0000, 0.0500] + [0.0000, 0.0700, 0.1300, 0.0450] + [0.0000, 0.0315, 0.1065, 0.0300] + [0.0000, 0.0098, 0.0761, 0.0186]] + +>>> print(mc.hitting_probabilities([0, 1])) +[1.0, 1.0, 0.0, 0.5] + +>>> print(mc.mean_absorption_times()) +[4.56603774, 3.32075472, 3.28301887] + +>>> print(mc.mean_number_visits()) +[[0.50943396, 2.64150943, INF, 0.41509434] + [0.18867925, 1.83018868, INF, 0.30188679] + [0.00000000, 0.00000000, INF, 0.00000000] + [0.75471698, 1.32075472, INF, 0.20754717]] + +>>> print(mc.simulate(10, seed=32)) +['D', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C'] +``` + +```console +>>> sequence = ["A"] +>>> for i in range(1, 11): +... current_state = sequence[-1] +... next_state = mc.next(current_state, seed=32) +... print((' ' if i < 10 else '') + f'{i}) {current_state} -> {next_state}') +... sequence.append(next_state) + 1) A -> B + 2) B -> C + 3) C -> C + 4) C -> C + 5) C -> C + 6) C -> C + 7) C -> C + 8) C -> C + 9) C -> C +10) C -> C +``` + +Below a few examples of `MarkovChain` plotting functions; in order to display the output of plots immediately, the [interactive mode](https://matplotlib.org/stable/users/interactive.html#interactive-mode) of [Matplotlib](https://matplotlib.org/) must be turned on: + +```console +>>> plot_eigenvalues(mc, dpi=300) +>>> plot_graph(mc, dpi=300) +>>> plot_sequence(mc, 10, plot_type='histogram', dpi=300) +>>> plot_sequence(mc, 10, plot_type='heatmap', dpi=300) +>>> plot_sequence(mc, 10, plot_type='matrix', dpi=300) +>>> plot_redistributions(mc, 10, plot_type='heatmap', dpi=300) +>>> plot_redistributions(mc, 10, plot_type='projection', dpi=300) +``` + + + +## Usage: HiddenMarkovModel Class + +The `HiddenMarkovModel` class can be instantiated as follows: + +```console +>>> p = [[0.4, 0.6], [0.8, 0.2]] +>>> states = ['A', 'B'] +>>> e = [[0.5, 0.0, 0.0, 0.5], [0.2, 0.2, 0.2, 0.4]] +>>> symbols = ['H1', 'H2', 'H3', 'H4'] +>>> hmm = HiddenMarkovModel(p, e, states, symbols) +>>> print(hmm) + +HIDDEN MARKOV MODEL + STATES: 2 + SYMBOLS: 4 + ERGODIC: NO + REGULAR: NO +``` + +Below a few examples of `HiddenMarkovModel` methods: + +```console +>>> sim_states, sim_symbols = hmm.simulate(12, seed=1488) +>>> print(sim_states) +['B', 'A', 'A', 'A', 'B', 'A', 'A'] +>>> print(sim_symbols) +['H2', 'H4', 'H4', 'H4', 'H3', 'H4', 'H4'] + +>>> est_hmm = hmm.estimate(states, symbols, sim_states, sim_symbols) +>>> print(est_hmm.p) +[[0.75, 0.25] + [1.00, 0.00]] +>>> print(est_hmm.e) +[[0.0, 0.0, 0.0, 1.0] + [0.0, 0.5, 0.5, 0.0]] + +>>> dec_lp, dec_posterior, dec_backward, dec_forward, _ = hmm.decode(sim_symbols) +>>> print(dec_lp) +-8.77549587 +>>> print(dec_posterior) +[[0.00000000, 0.84422968, 0.41785105, 0.84422968, 0.00000000, 0.82089552, 0.52238806] + [1.00000000, 0.15577032, 0.58214895, 0.15577032, 1.00000000, 0.17910448, 0.47761194]] +>>> print(dec_backward) +[[1.50000000, 0.88942581, 1.01307561, 0.79988630, 1.31154065, 0.94776119, 0.98507463, 1.00000000] + [0.50000000, 1.00000000, 0.93462194, 1.21887436, 0.43718022, 1.00000000, 1.07462687, 1.00000000]] +>>> print(dec_forward) +[[0.50000000, 0.00000000, 0.83333333, 0.52238806, 0.64369311, 0.00000000, 0.83333333 0.52238806] + [0.50000000, 1.00000000, 0.16666667, 0.47761194, 0.35630689, 1.00000000, 0.16666667 0.47761194]] + +>>> pre_lp, pre_states = hmm.predict('viterbi', sim_symbols) +>>> print(pre_lp) +-13.24482936 +>>> print(pre_states) +['B', 'A', 'B', 'A', 'B', 'A', 'B'] +``` + +Below a few examples of `HiddenMarkovModel` plotting functions; in order to display the output of plots immediately, the [interactive mode](https://matplotlib.org/stable/users/interactive.html#interactive-mode) of [Matplotlib](https://matplotlib.org/) must be turned on: + +```console +>>> plot_graph(hmm, dpi=300) +>>> plot_sequence(hmm, 10, plot_type='histogram', dpi=300) +>>> plot_sequence(hmm, 10, plot_type='heatmap', dpi=300) +>>> plot_sequence(hmm, 10, plot_type='matrix', dpi=300) +>>> plot_trellis(hmm, 10, dpi=300) +``` + + + + +%package -n python3-PyDTMC +Summary: A full-featured and lightweight library for discrete-time Markov chains analysis. +Provides: python-PyDTMC +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-PyDTMC +PyDTMC is a full-featured and lightweight library for discrete-time Markov chains analysis. It provides classes and functions for creating, manipulating, simulating and visualizing Markov processes. + +<table> + <tr> + <td align="right">Status:</td> + <td align="left"> + <a href="https://github.com/TommasoBelluzzo/PyDTMC/actions/workflows/continuous_integration.yml"><img alt="Build" src="https://img.shields.io/github/workflow/status/TommasoBelluzzo/PyDTMC/Continuous%20Integration?style=flat&label=Build&color=1081C2"/></a> + <a href="https://pydtmc.readthedocs.io/"><img alt="Docs" src="https://img.shields.io/readthedocs/pydtmc?style=flat&label=Docs&color=1081C2"/></a> + <a href="https://coveralls.io/github/TommasoBelluzzo/PyDTMC?branch=master"><img alt="Coverage" src="https://img.shields.io/coveralls/github/TommasoBelluzzo/PyDTMC?style=flat&label=Coverage&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Info:</td> + <td align="left"> + <a href="#"><img alt="License" src="https://img.shields.io/github/license/TommasoBelluzzo/PyDTMC?style=flat&label=License&color=1081C2"/></a> + <a href="#"><img alt="Lines" src="https://img.shields.io/tokei/lines/github/TommasoBelluzzo/PyDTMC?style=flat&label=Lines&color=1081C2"/></a> + <a href="#"><img alt="Size" src="https://img.shields.io/github/repo-size/TommasoBelluzzo/PyDTMC?style=flat&label=Size&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">PyPI:</td> + <td align="left"> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Version" src="https://img.shields.io/pypi/v/PyDTMC?style=flat&label=Version&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Python" src="https://img.shields.io/pypi/pyversions/PyDTMC?style=flat&label=Python&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Wheel" src="https://img.shields.io/pypi/wheel/PyDTMC?style=flat&label=Wheel&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Downloads" src="https://img.shields.io/pypi/dm/PyDTMC?style=flat&label=Downloads&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Conda:</td> + <td align="left"> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Version" src="https://img.shields.io/conda/vn/conda-forge/pydtmc?style=flat&label=Version"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Python" src="https://img.shields.io/pypi/pyversions/PyDTMC?style=flat&label=Python&color=1081C2"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Platforms" src="https://img.shields.io/conda/pn/conda-forge/pydtmc?style=flat&label=Platforms&color=1081C2"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Downloads" src="https://img.shields.io/conda/dn/conda-forge/pydtmc?style=flat&label=Downloads&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Donation:</td> + <td align="left"> + <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D8LH6DNYN7EN8"><img alt="PayPal" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif"/></a> + </td> + </tr> +</table> + +## Requirements + +The `Python` environment must include the following packages: + +* [Matplotlib](https://matplotlib.org/) +* [NetworkX](https://networkx.github.io/) +* [NumPy](https://www.numpy.org/) +* [SciPy](https://www.scipy.org/) + +*Notes:* + +* It's recommended to install [Graphviz](https://www.graphviz.org/) and [pydot](https://pypi.org/project/pydot/) before using the `plot_graph` function. +* The packages [pytest](https://pytest.org/) and [pytest-benchmark](https://pypi.org/project/pytest-benchmark/) are required for performing unit tests. +* The package [Sphinx](https://www.sphinx-doc.org/) is required for building the package documentation. + +## Installation & Upgrade + +[PyPI](https://pypi.org/): + +```sh +$ pip install PyDTMC +$ pip install --upgrade PyDTMC +``` + +[Git](https://git-scm.com/): + +```sh +$ pip install https://github.com/TommasoBelluzzo/PyDTMC/tarball/master +$ pip install --upgrade https://github.com/TommasoBelluzzo/PyDTMC/tarball/master + +$ pip install git+https://github.com/TommasoBelluzzo/PyDTMC.git#egg=PyDTMC +$ pip install --upgrade git+https://github.com/TommasoBelluzzo/PyDTMC.git#egg=PyDTMC +``` + +[Conda](https://docs.conda.io/): + +```sh +$ conda install -c conda-forge pydtmc +$ conda update -c conda-forge pydtmc + +$ conda install -c tommasobelluzzo pydtmc +$ conda update -c tommasobelluzzo pydtmc +``` + +## Usage: MarkovChain Class + +The `MarkovChain` class can be instantiated as follows: + +```console +>>> p = [[0.2, 0.7, 0.0, 0.1], [0.0, 0.6, 0.3, 0.1], [0.0, 0.0, 1.0, 0.0], [0.5, 0.0, 0.5, 0.0]] +>>> mc = MarkovChain(p, ['A', 'B', 'C', 'D']) +>>> print(mc) + +DISCRETE-TIME MARKOV CHAIN + SIZE: 4 + RANK: 4 + CLASSES: 2 + > RECURRENT: 1 + > TRANSIENT: 1 + ERGODIC: NO + > APERIODIC: YES + > IRREDUCIBLE: NO + ABSORBING: YES + REGULAR: NO + REVERSIBLE: YES + SYMMETRIC: NO +``` + +Below a few examples of `MarkovChain` properties: + +```console +>>> print(mc.is_ergodic) +False + +>>> print(mc.recurrent_states) +['C'] + +>>> print(mc.transient_states) +['A', 'B', 'D'] + +>>> print(mc.steady_states) +[array([0.0, 0.0, 1.0, 0.0])] + +>>> print(mc.is_absorbing) +True + +>>> print(mc.fundamental_matrix) +[[1.50943396, 2.64150943, 0.41509434] + [0.18867925, 2.83018868, 0.30188679] + [0.75471698, 1.32075472, 1.20754717]] + +>>> print(mc.kemeny_constant) +5.547169811320755 + +>>> print(mc.entropy_rate) +0.0 +``` + +Below a few examples of `MarkovChain` methods: + +```console +>>> print(mc.absorption_probabilities()) +[1.0 1.0 1.0] + +>>> print(mc.expected_rewards(10, [2, -3, 8, -7])) +[44.96611926, 52.03057032, 88.00000000, 51.74779651] + +>>> print(mc.expected_transitions(2)) +[[0.0850, 0.2975, 0.0000, 0.0425] + [0.0000, 0.3450, 0.1725, 0.0575] + [0.0000, 0.0000, 0.7000, 0.0000] + [0.1500, 0.0000, 0.1500, 0.0000]] + +>>> print(mc.first_passage_probabilities(5, 3)) +[[0.5000, 0.0000, 0.5000, 0.0000] + [0.0000, 0.3500, 0.0000, 0.0500] + [0.0000, 0.0700, 0.1300, 0.0450] + [0.0000, 0.0315, 0.1065, 0.0300] + [0.0000, 0.0098, 0.0761, 0.0186]] + +>>> print(mc.hitting_probabilities([0, 1])) +[1.0, 1.0, 0.0, 0.5] + +>>> print(mc.mean_absorption_times()) +[4.56603774, 3.32075472, 3.28301887] + +>>> print(mc.mean_number_visits()) +[[0.50943396, 2.64150943, INF, 0.41509434] + [0.18867925, 1.83018868, INF, 0.30188679] + [0.00000000, 0.00000000, INF, 0.00000000] + [0.75471698, 1.32075472, INF, 0.20754717]] + +>>> print(mc.simulate(10, seed=32)) +['D', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C'] +``` + +```console +>>> sequence = ["A"] +>>> for i in range(1, 11): +... current_state = sequence[-1] +... next_state = mc.next(current_state, seed=32) +... print((' ' if i < 10 else '') + f'{i}) {current_state} -> {next_state}') +... sequence.append(next_state) + 1) A -> B + 2) B -> C + 3) C -> C + 4) C -> C + 5) C -> C + 6) C -> C + 7) C -> C + 8) C -> C + 9) C -> C +10) C -> C +``` + +Below a few examples of `MarkovChain` plotting functions; in order to display the output of plots immediately, the [interactive mode](https://matplotlib.org/stable/users/interactive.html#interactive-mode) of [Matplotlib](https://matplotlib.org/) must be turned on: + +```console +>>> plot_eigenvalues(mc, dpi=300) +>>> plot_graph(mc, dpi=300) +>>> plot_sequence(mc, 10, plot_type='histogram', dpi=300) +>>> plot_sequence(mc, 10, plot_type='heatmap', dpi=300) +>>> plot_sequence(mc, 10, plot_type='matrix', dpi=300) +>>> plot_redistributions(mc, 10, plot_type='heatmap', dpi=300) +>>> plot_redistributions(mc, 10, plot_type='projection', dpi=300) +``` + + + +## Usage: HiddenMarkovModel Class + +The `HiddenMarkovModel` class can be instantiated as follows: + +```console +>>> p = [[0.4, 0.6], [0.8, 0.2]] +>>> states = ['A', 'B'] +>>> e = [[0.5, 0.0, 0.0, 0.5], [0.2, 0.2, 0.2, 0.4]] +>>> symbols = ['H1', 'H2', 'H3', 'H4'] +>>> hmm = HiddenMarkovModel(p, e, states, symbols) +>>> print(hmm) + +HIDDEN MARKOV MODEL + STATES: 2 + SYMBOLS: 4 + ERGODIC: NO + REGULAR: NO +``` + +Below a few examples of `HiddenMarkovModel` methods: + +```console +>>> sim_states, sim_symbols = hmm.simulate(12, seed=1488) +>>> print(sim_states) +['B', 'A', 'A', 'A', 'B', 'A', 'A'] +>>> print(sim_symbols) +['H2', 'H4', 'H4', 'H4', 'H3', 'H4', 'H4'] + +>>> est_hmm = hmm.estimate(states, symbols, sim_states, sim_symbols) +>>> print(est_hmm.p) +[[0.75, 0.25] + [1.00, 0.00]] +>>> print(est_hmm.e) +[[0.0, 0.0, 0.0, 1.0] + [0.0, 0.5, 0.5, 0.0]] + +>>> dec_lp, dec_posterior, dec_backward, dec_forward, _ = hmm.decode(sim_symbols) +>>> print(dec_lp) +-8.77549587 +>>> print(dec_posterior) +[[0.00000000, 0.84422968, 0.41785105, 0.84422968, 0.00000000, 0.82089552, 0.52238806] + [1.00000000, 0.15577032, 0.58214895, 0.15577032, 1.00000000, 0.17910448, 0.47761194]] +>>> print(dec_backward) +[[1.50000000, 0.88942581, 1.01307561, 0.79988630, 1.31154065, 0.94776119, 0.98507463, 1.00000000] + [0.50000000, 1.00000000, 0.93462194, 1.21887436, 0.43718022, 1.00000000, 1.07462687, 1.00000000]] +>>> print(dec_forward) +[[0.50000000, 0.00000000, 0.83333333, 0.52238806, 0.64369311, 0.00000000, 0.83333333 0.52238806] + [0.50000000, 1.00000000, 0.16666667, 0.47761194, 0.35630689, 1.00000000, 0.16666667 0.47761194]] + +>>> pre_lp, pre_states = hmm.predict('viterbi', sim_symbols) +>>> print(pre_lp) +-13.24482936 +>>> print(pre_states) +['B', 'A', 'B', 'A', 'B', 'A', 'B'] +``` + +Below a few examples of `HiddenMarkovModel` plotting functions; in order to display the output of plots immediately, the [interactive mode](https://matplotlib.org/stable/users/interactive.html#interactive-mode) of [Matplotlib](https://matplotlib.org/) must be turned on: + +```console +>>> plot_graph(hmm, dpi=300) +>>> plot_sequence(hmm, 10, plot_type='histogram', dpi=300) +>>> plot_sequence(hmm, 10, plot_type='heatmap', dpi=300) +>>> plot_sequence(hmm, 10, plot_type='matrix', dpi=300) +>>> plot_trellis(hmm, 10, dpi=300) +``` + + + + +%package help +Summary: Development documents and examples for PyDTMC +Provides: python3-PyDTMC-doc +%description help +PyDTMC is a full-featured and lightweight library for discrete-time Markov chains analysis. It provides classes and functions for creating, manipulating, simulating and visualizing Markov processes. + +<table> + <tr> + <td align="right">Status:</td> + <td align="left"> + <a href="https://github.com/TommasoBelluzzo/PyDTMC/actions/workflows/continuous_integration.yml"><img alt="Build" src="https://img.shields.io/github/workflow/status/TommasoBelluzzo/PyDTMC/Continuous%20Integration?style=flat&label=Build&color=1081C2"/></a> + <a href="https://pydtmc.readthedocs.io/"><img alt="Docs" src="https://img.shields.io/readthedocs/pydtmc?style=flat&label=Docs&color=1081C2"/></a> + <a href="https://coveralls.io/github/TommasoBelluzzo/PyDTMC?branch=master"><img alt="Coverage" src="https://img.shields.io/coveralls/github/TommasoBelluzzo/PyDTMC?style=flat&label=Coverage&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Info:</td> + <td align="left"> + <a href="#"><img alt="License" src="https://img.shields.io/github/license/TommasoBelluzzo/PyDTMC?style=flat&label=License&color=1081C2"/></a> + <a href="#"><img alt="Lines" src="https://img.shields.io/tokei/lines/github/TommasoBelluzzo/PyDTMC?style=flat&label=Lines&color=1081C2"/></a> + <a href="#"><img alt="Size" src="https://img.shields.io/github/repo-size/TommasoBelluzzo/PyDTMC?style=flat&label=Size&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">PyPI:</td> + <td align="left"> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Version" src="https://img.shields.io/pypi/v/PyDTMC?style=flat&label=Version&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Python" src="https://img.shields.io/pypi/pyversions/PyDTMC?style=flat&label=Python&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Wheel" src="https://img.shields.io/pypi/wheel/PyDTMC?style=flat&label=Wheel&color=1081C2"/></a> + <a href="https://pypi.org/project/PyDTMC/"><img alt="Downloads" src="https://img.shields.io/pypi/dm/PyDTMC?style=flat&label=Downloads&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Conda:</td> + <td align="left"> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Version" src="https://img.shields.io/conda/vn/conda-forge/pydtmc?style=flat&label=Version"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Python" src="https://img.shields.io/pypi/pyversions/PyDTMC?style=flat&label=Python&color=1081C2"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Platforms" src="https://img.shields.io/conda/pn/conda-forge/pydtmc?style=flat&label=Platforms&color=1081C2"/></a> + <a href="https://anaconda.org/conda-forge/pydtmc/"><img alt="Downloads" src="https://img.shields.io/conda/dn/conda-forge/pydtmc?style=flat&label=Downloads&color=1081C2"/></a> + </td> + </tr> + <tr> + <td align="right">Donation:</td> + <td align="left"> + <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D8LH6DNYN7EN8"><img alt="PayPal" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif"/></a> + </td> + </tr> +</table> + +## Requirements + +The `Python` environment must include the following packages: + +* [Matplotlib](https://matplotlib.org/) +* [NetworkX](https://networkx.github.io/) +* [NumPy](https://www.numpy.org/) +* [SciPy](https://www.scipy.org/) + +*Notes:* + +* It's recommended to install [Graphviz](https://www.graphviz.org/) and [pydot](https://pypi.org/project/pydot/) before using the `plot_graph` function. +* The packages [pytest](https://pytest.org/) and [pytest-benchmark](https://pypi.org/project/pytest-benchmark/) are required for performing unit tests. +* The package [Sphinx](https://www.sphinx-doc.org/) is required for building the package documentation. + +## Installation & Upgrade + +[PyPI](https://pypi.org/): + +```sh +$ pip install PyDTMC +$ pip install --upgrade PyDTMC +``` + +[Git](https://git-scm.com/): + +```sh +$ pip install https://github.com/TommasoBelluzzo/PyDTMC/tarball/master +$ pip install --upgrade https://github.com/TommasoBelluzzo/PyDTMC/tarball/master + +$ pip install git+https://github.com/TommasoBelluzzo/PyDTMC.git#egg=PyDTMC +$ pip install --upgrade git+https://github.com/TommasoBelluzzo/PyDTMC.git#egg=PyDTMC +``` + +[Conda](https://docs.conda.io/): + +```sh +$ conda install -c conda-forge pydtmc +$ conda update -c conda-forge pydtmc + +$ conda install -c tommasobelluzzo pydtmc +$ conda update -c tommasobelluzzo pydtmc +``` + +## Usage: MarkovChain Class + +The `MarkovChain` class can be instantiated as follows: + +```console +>>> p = [[0.2, 0.7, 0.0, 0.1], [0.0, 0.6, 0.3, 0.1], [0.0, 0.0, 1.0, 0.0], [0.5, 0.0, 0.5, 0.0]] +>>> mc = MarkovChain(p, ['A', 'B', 'C', 'D']) +>>> print(mc) + +DISCRETE-TIME MARKOV CHAIN + SIZE: 4 + RANK: 4 + CLASSES: 2 + > RECURRENT: 1 + > TRANSIENT: 1 + ERGODIC: NO + > APERIODIC: YES + > IRREDUCIBLE: NO + ABSORBING: YES + REGULAR: NO + REVERSIBLE: YES + SYMMETRIC: NO +``` + +Below a few examples of `MarkovChain` properties: + +```console +>>> print(mc.is_ergodic) +False + +>>> print(mc.recurrent_states) +['C'] + +>>> print(mc.transient_states) +['A', 'B', 'D'] + +>>> print(mc.steady_states) +[array([0.0, 0.0, 1.0, 0.0])] + +>>> print(mc.is_absorbing) +True + +>>> print(mc.fundamental_matrix) +[[1.50943396, 2.64150943, 0.41509434] + [0.18867925, 2.83018868, 0.30188679] + [0.75471698, 1.32075472, 1.20754717]] + +>>> print(mc.kemeny_constant) +5.547169811320755 + +>>> print(mc.entropy_rate) +0.0 +``` + +Below a few examples of `MarkovChain` methods: + +```console +>>> print(mc.absorption_probabilities()) +[1.0 1.0 1.0] + +>>> print(mc.expected_rewards(10, [2, -3, 8, -7])) +[44.96611926, 52.03057032, 88.00000000, 51.74779651] + +>>> print(mc.expected_transitions(2)) +[[0.0850, 0.2975, 0.0000, 0.0425] + [0.0000, 0.3450, 0.1725, 0.0575] + [0.0000, 0.0000, 0.7000, 0.0000] + [0.1500, 0.0000, 0.1500, 0.0000]] + +>>> print(mc.first_passage_probabilities(5, 3)) +[[0.5000, 0.0000, 0.5000, 0.0000] + [0.0000, 0.3500, 0.0000, 0.0500] + [0.0000, 0.0700, 0.1300, 0.0450] + [0.0000, 0.0315, 0.1065, 0.0300] + [0.0000, 0.0098, 0.0761, 0.0186]] + +>>> print(mc.hitting_probabilities([0, 1])) +[1.0, 1.0, 0.0, 0.5] + +>>> print(mc.mean_absorption_times()) +[4.56603774, 3.32075472, 3.28301887] + +>>> print(mc.mean_number_visits()) +[[0.50943396, 2.64150943, INF, 0.41509434] + [0.18867925, 1.83018868, INF, 0.30188679] + [0.00000000, 0.00000000, INF, 0.00000000] + [0.75471698, 1.32075472, INF, 0.20754717]] + +>>> print(mc.simulate(10, seed=32)) +['D', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C'] +``` + +```console +>>> sequence = ["A"] +>>> for i in range(1, 11): +... current_state = sequence[-1] +... next_state = mc.next(current_state, seed=32) +... print((' ' if i < 10 else '') + f'{i}) {current_state} -> {next_state}') +... sequence.append(next_state) + 1) A -> B + 2) B -> C + 3) C -> C + 4) C -> C + 5) C -> C + 6) C -> C + 7) C -> C + 8) C -> C + 9) C -> C +10) C -> C +``` + +Below a few examples of `MarkovChain` plotting functions; in order to display the output of plots immediately, the [interactive mode](https://matplotlib.org/stable/users/interactive.html#interactive-mode) of [Matplotlib](https://matplotlib.org/) must be turned on: + +```console +>>> plot_eigenvalues(mc, dpi=300) +>>> plot_graph(mc, dpi=300) +>>> plot_sequence(mc, 10, plot_type='histogram', dpi=300) +>>> plot_sequence(mc, 10, plot_type='heatmap', dpi=300) +>>> plot_sequence(mc, 10, plot_type='matrix', dpi=300) +>>> plot_redistributions(mc, 10, plot_type='heatmap', dpi=300) +>>> plot_redistributions(mc, 10, plot_type='projection', dpi=300) +``` + + + +## Usage: HiddenMarkovModel Class + +The `HiddenMarkovModel` class can be instantiated as follows: + +```console +>>> p = [[0.4, 0.6], [0.8, 0.2]] +>>> states = ['A', 'B'] +>>> e = [[0.5, 0.0, 0.0, 0.5], [0.2, 0.2, 0.2, 0.4]] +>>> symbols = ['H1', 'H2', 'H3', 'H4'] +>>> hmm = HiddenMarkovModel(p, e, states, symbols) +>>> print(hmm) + +HIDDEN MARKOV MODEL + STATES: 2 + SYMBOLS: 4 + ERGODIC: NO + REGULAR: NO +``` + +Below a few examples of `HiddenMarkovModel` methods: + +```console +>>> sim_states, sim_symbols = hmm.simulate(12, seed=1488) +>>> print(sim_states) +['B', 'A', 'A', 'A', 'B', 'A', 'A'] +>>> print(sim_symbols) +['H2', 'H4', 'H4', 'H4', 'H3', 'H4', 'H4'] + +>>> est_hmm = hmm.estimate(states, symbols, sim_states, sim_symbols) +>>> print(est_hmm.p) +[[0.75, 0.25] + [1.00, 0.00]] +>>> print(est_hmm.e) +[[0.0, 0.0, 0.0, 1.0] + [0.0, 0.5, 0.5, 0.0]] + +>>> dec_lp, dec_posterior, dec_backward, dec_forward, _ = hmm.decode(sim_symbols) +>>> print(dec_lp) +-8.77549587 +>>> print(dec_posterior) +[[0.00000000, 0.84422968, 0.41785105, 0.84422968, 0.00000000, 0.82089552, 0.52238806] + [1.00000000, 0.15577032, 0.58214895, 0.15577032, 1.00000000, 0.17910448, 0.47761194]] +>>> print(dec_backward) +[[1.50000000, 0.88942581, 1.01307561, 0.79988630, 1.31154065, 0.94776119, 0.98507463, 1.00000000] + [0.50000000, 1.00000000, 0.93462194, 1.21887436, 0.43718022, 1.00000000, 1.07462687, 1.00000000]] +>>> print(dec_forward) +[[0.50000000, 0.00000000, 0.83333333, 0.52238806, 0.64369311, 0.00000000, 0.83333333 0.52238806] + [0.50000000, 1.00000000, 0.16666667, 0.47761194, 0.35630689, 1.00000000, 0.16666667 0.47761194]] + +>>> pre_lp, pre_states = hmm.predict('viterbi', sim_symbols) +>>> print(pre_lp) +-13.24482936 +>>> print(pre_states) +['B', 'A', 'B', 'A', 'B', 'A', 'B'] +``` + +Below a few examples of `HiddenMarkovModel` plotting functions; in order to display the output of plots immediately, the [interactive mode](https://matplotlib.org/stable/users/interactive.html#interactive-mode) of [Matplotlib](https://matplotlib.org/) must be turned on: + +```console +>>> plot_graph(hmm, dpi=300) +>>> plot_sequence(hmm, 10, plot_type='histogram', dpi=300) +>>> plot_sequence(hmm, 10, plot_type='heatmap', dpi=300) +>>> plot_sequence(hmm, 10, plot_type='matrix', dpi=300) +>>> plot_trellis(hmm, 10, dpi=300) +``` + + + + +%prep +%autosetup -n PyDTMC-8.2.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-PyDTMC -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Fri May 05 2023 Python_Bot <Python_Bot@openeuler.org> - 8.2.0-1 +- Package Spec generated @@ -0,0 +1 @@ +226f530ecbd02c2c063108b5ed2ae6f9 PyDTMC-8.2.0.tar.gz |
