@@ -76,6 +76,35 @@ n = 5 # should be odd
76
76
@test logabsdet (x)[1 ] ≈ logabsdet (X)[1 ]
77
77
@test logabsdet (x)[2 ] ≈ logabsdet (X)[2 ]
78
78
end
79
+
80
+ @testset " det with nonstandard Number type" begin
81
+ struct MyDual{T<: Real } <: Real
82
+ val:: T
83
+ eps:: T
84
+ end
85
+ Base.:+ (x:: MyDual , y:: MyDual ) = MyDual (x. val + y. val, x. eps + y. eps)
86
+ Base.:* (x:: MyDual , y:: MyDual ) = MyDual (x. val * y. val, x. eps * y. val + y. eps * x. val)
87
+ Base.:/ (x:: MyDual , y:: MyDual ) = x. val / y. val
88
+ Base.:(== )(x:: MyDual , y:: MyDual ) = x. val == y. val && x. eps == y. eps
89
+ Base. zero (:: MyDual{T} ) where {T} = MyDual (zero (T), zero (T))
90
+ Base. zero (:: Type{MyDual{T}} ) where {T} = MyDual (zero (T), zero (T))
91
+ Base. one (:: MyDual{T} ) where {T} = MyDual (one (T), zero (T))
92
+ Base. one (:: Type{MyDual{T}} ) where {T} = MyDual (one (T), zero (T))
93
+ # the following line is required for BigFloat, IDK why it doesn't work via
94
+ # promote_rule like for all other types
95
+ Base. promote_type (:: Type{MyDual{BigFloat}} , :: Type{BigFloat} ) = MyDual{BigFloat}
96
+ Base. promote_rule (:: Type{MyDual{T}} , :: Type{S} ) where {T,S<: Real } =
97
+ MyDual{promote_type (T, S)}
98
+ Base. promote_rule (:: Type{MyDual{T}} , :: Type{MyDual{S}} ) where {T,S} =
99
+ MyDual{promote_type (T, S)}
100
+ Base. convert (:: Type{MyDual{T}} , x:: MyDual ) where {T} =
101
+ MyDual (convert (T, x. val), convert (T, x. eps))
102
+ if elty <: Real
103
+ @show elty
104
+ @show istriu (triu (MyDual .(A, zero (A))))
105
+ @test det (triu (MyDual .(A, zero (A)))) isa MyDual
106
+ end
107
+ end
79
108
end
80
109
81
110
@testset " diag" begin
0 commit comments