Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added continuous time Markov chain #17163

Merged
merged 12 commits into from
Jul 21, 2019
15 changes: 15 additions & 0 deletions sympy/core/tests/test_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -1567,12 +1567,22 @@ def test_sympy__stats__stochastic_process_types__DiscreteTimeStochasticProcess()
from sympy.stats.stochastic_process_types import DiscreteTimeStochasticProcess
assert _test_args(DiscreteTimeStochasticProcess("Y", [1, 2, 3]))

def test_sympy__stats__stochastic_process_types__ContinuousTimeStochasticProcess():
from sympy.stats.stochastic_process_types import ContinuousTimeStochasticProcess
assert _test_args(ContinuousTimeStochasticProcess("Y", [1, 2, 3]))

def test_sympy__stats__stochastic_process_types__TransitionMatrixOf():
from sympy.stats.stochastic_process_types import TransitionMatrixOf, DiscreteMarkovChain
from sympy import MatrixSymbol
DMC = DiscreteMarkovChain("Y")
assert _test_args(TransitionMatrixOf(DMC, MatrixSymbol('T', 3, 3)))

def test_sympy__stats__stochastic_process_types__GeneratorMatrixOf():
from sympy.stats.stochastic_process_types import GeneratorMatrixOf, ContinuousMarkovChain
from sympy import MatrixSymbol
DMC = ContinuousMarkovChain("Y")
assert _test_args(GeneratorMatrixOf(DMC, MatrixSymbol('T', 3, 3)))

def test_sympy__stats__stochastic_process_types__StochasticStateSpaceOf():
from sympy.stats.stochastic_process_types import StochasticStateSpaceOf, DiscreteMarkovChain
from sympy import MatrixSymbol
Expand All @@ -1584,6 +1594,11 @@ def test_sympy__stats__stochastic_process_types__DiscreteMarkovChain():
from sympy import MatrixSymbol
assert _test_args(DiscreteMarkovChain("Y", [0, 1, 2], MatrixSymbol('T', 3, 3)))

def test_sympy__stats__stochastic_process_types__ContinuousMarkovChain():
from sympy.stats.stochastic_process_types import ContinuousMarkovChain
from sympy import MatrixSymbol
assert _test_args(ContinuousMarkovChain("Y", [0, 1, 2], MatrixSymbol('T', 3, 3)))

def test_sympy__core__symbol__Dummy():
from sympy.core.symbol import Dummy
assert _test_args(Dummy('t'))
Expand Down
5 changes: 4 additions & 1 deletion sympy/stats/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,13 @@
from . import stochastic_process_types
from .stochastic_process_types import (
StochasticProcess,
ContinuousTimeStochasticProcess,
DiscreteTimeStochasticProcess,
DiscreteMarkovChain,
TransitionMatrixOf,
StochasticStateSpaceOf
StochasticStateSpaceOf,
ContinuousMarkovChain,
GeneratorMatrixOf
)
__all__.extend(stochastic_process_types.__all__)

Expand Down
14 changes: 10 additions & 4 deletions sympy/stats/rv.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

from sympy import (Basic, S, Expr, Symbol, Tuple, And, Add, Eq, lambdify,
Equality, Lambda, sympify, Dummy, Ne, KroneckerDelta,
DiracDelta, Mul, Indexed)
DiracDelta, Mul, Indexed, Function)
from sympy.core.compatibility import string_types
from sympy.core.relational import Relational
from sympy.logic.boolalg import Boolean
Expand Down Expand Up @@ -275,13 +275,19 @@ def free_symbols(self):
class RandomIndexedSymbol(RandomSymbol):

def __new__(cls, idx_obj, pspace=None):
if not isinstance(idx_obj, Indexed):
raise TypeError("An indexed object is expected not %s"%(idx_obj))
if not isinstance(idx_obj, (Indexed, Function)):
raise TypeError("An Function or Indexed object is expected not %s"%(idx_obj))
return Basic.__new__(cls, idx_obj, pspace)

symbol = property(lambda self: self.args[0])
name = property(lambda self: str(self.args[0]))
key = property(lambda self: self.symbol.args[1])

@property
def key(self):
if isinstance(self.symbol, Indexed):
return self.symbol.args[1]
elif isinstance(self.symbol, Function):
return self.symbol.args[0]

class ProductPSpace(PSpace):
"""
Expand Down
Loading