-
-
Notifications
You must be signed in to change notification settings - Fork 216
/
Copy pathextra_functions.jl
77 lines (70 loc) · 2.76 KB
/
extra_functions.jl
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
@register Base.getindex(x,i::Integer) false
@register Base.getindex(x,i) false
@register Base.binomial(n,k)
@register Base.signbit(x)
ModelingToolkit.derivative(::typeof(signbit), args::NTuple{1,Any}, ::Val{1}) = 0
ModelingToolkit.derivative(::typeof(abs), args::NTuple{1,Any}, ::Val{1}) = IfElse.ifelse(signbit(args[1]),-one(args[1]),one(args[1]))
function ModelingToolkit.derivative(::typeof(min), args::NTuple{2,Any}, ::Val{1})
x, y = args
IfElse.ifelse(x < y, one(x), zero(x))
end
function ModelingToolkit.derivative(::typeof(min), args::NTuple{2,Any}, ::Val{2})
x, y = args
IfElse.ifelse(x < y, zero(y), one(y))
end
function ModelingToolkit.derivative(::typeof(max), args::NTuple{2,Any}, ::Val{1})
x, y = args
IfElse.ifelse(x > y, one(x), zero(x))
end
function ModelingToolkit.derivative(::typeof(max), args::NTuple{2,Any}, ::Val{2})
x, y = args
IfElse.ifelse(x > y, zero(y), one(y))
end
IfElse.ifelse(x::Num,y,z) = Num(Term{Real}(IfElse.ifelse, [value(x), value(y), value(z)]))
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{1}) = 0
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{2}) = IfElse.ifelse(args[1],1,0)
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{3}) = IfElse.ifelse(args[1],0,1)
ModelingToolkit.@register Base.rand(x)
ModelingToolkit.@register Base.randn(x)
ModelingToolkit.@register Distributions.pdf(dist,x)
ModelingToolkit.@register Distributions.logpdf(dist,x)
ModelingToolkit.@register Distributions.cdf(dist,x)
ModelingToolkit.@register Distributions.logcdf(dist,x)
ModelingToolkit.@register Distributions.quantile(dist,x)
ModelingToolkit.@register Distributions.Uniform(mu,sigma) false
ModelingToolkit.@register Distributions.Normal(mu,sigma) false
@register ∈(x::Num, y::AbstractArray)
@register ∪(x, y)
@register ∩(x, y)
@register ∨(x, y)
@register ∧(x, y)
@register ⊆(x, y)
function LinearAlgebra.det(A::AbstractMatrix{<:Num}; laplace=true)
if laplace
n = LinearAlgebra.checksquare(A)
if n == 1
return A[1, 1]
elseif n == 2
return A[1, 1] * A[2, 2] - A[1, 2] * A[2, 1]
else
temp = 0
# Laplace expansion along the first column
M′ = A[:, 2:end]
for i in axes(A, 1)
M = M′[(1:n) .!= i, :]
d′ = A[i, 1] * det(M)
if iseven(i)
temp = iszero(temp) ? d′ : temp - d′
else
temp = iszero(temp) ? d′ : temp + d′
end
end
end
return temp
else
if istriu(A) || istril(A)
return det(UpperTriangular(A))
end
return det(lu(A; check = false))
end
end