summaryrefslogtreecommitdiffstats
path: root/polymatrix/expression/op.py
blob: 612a2db9eba2690df5d85e9b66278f4ff83d104c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import polymatrix.expression.init

from polymatrix.utils.getstacklines import get_stack_lines
from polymatrix.expression.mixins.expressionbasemixin import ExpressionBaseMixin


def diff(
    expression: ExpressionBaseMixin, 
    variables: ExpressionBaseMixin,
    introduce_derivatives: bool = None,
) -> ExpressionBaseMixin:
            
    if not isinstance(variables, ExpressionBaseMixin):
        variables=polymatrix.expression.init.init_from_expr(variables)

    if introduce_derivatives is None:
        introduce_derivatives = False

    return polymatrix.expression.impl.DerivativeExprImpl(
		underlying=expression,
		variables=variables,
		introduce_derivatives=introduce_derivatives,
		stack=get_stack_lines(),
	)


def filter_(
        underlying: ExpressionBaseMixin,
        predicator: ExpressionBaseMixin,
        inverse: bool = None,
) -> ExpressionBaseMixin:
    
    if inverse is None:
        inverse = False
          
    return polymatrix.expression.impl.FilterExprImpl(
        underlying=underlying,
        predicator=predicator,
        inverse=inverse,
    )


def integrate(
    expression: ExpressionBaseMixin, 
    variables: ExpressionBaseMixin,
    from_: tuple[float, ...],
    to: tuple[float, ...],
) -> ExpressionBaseMixin:
            
    if not isinstance(variables, ExpressionBaseMixin):
        variables=polymatrix.expression.init.init_from_expr(variables)

    assert len(from_) == len(to)

    return polymatrix.expression.impl.IntegrateExprImpl(
		underlying=expression,
		variables=variables,
		from_=from_,
        to=to,
		stack=get_stack_lines(),
	)


def legendre(
    expression: ExpressionBaseMixin,
    degrees: tuple[int, ...] = None,
) -> ExpressionBaseMixin:
    
    return polymatrix.expression.impl.LegendreSeriesImpl(
        underlying=expression,
        degrees=degrees,
        stack=get_stack_lines(),
    )
    

def linear_in(
    expression: ExpressionBaseMixin, 
    variables: ExpressionBaseMixin, 
    monomials: ExpressionBaseMixin = None,
    ignore_unmatched: bool = None,    
) -> ExpressionBaseMixin:
    
    if monomials is None:
        monomials = linear_monomials(
            expression=expression,
            variables=variables,
        )

    return polymatrix.expression.impl.LinearInExprImpl(
        underlying=expression,
        monomials=monomials,
        variables=variables,
        ignore_unmatched = ignore_unmatched,
    )

def linear_monomials(
    expression: ExpressionBaseMixin, 
    variables: ExpressionBaseMixin,
) -> ExpressionBaseMixin:
    
    return polymatrix.expression.impl.LinearMonomialsExprImpl(
        underlying=expression,
        variables=variables,
    )

def degree(
        underlying: ExpressionBaseMixin,
):
    return polymatrix.expression.impl.DegreeExprImpl(
        underlying=underlying,
        stack=get_stack_lines(),
    )