-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathtest_BSplineSpace.jl
More file actions
254 lines (225 loc) · 9.18 KB
/
test_BSplineSpace.jl
File metadata and controls
254 lines (225 loc) · 9.18 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
@testset "BSplineSpace" begin
@testset "constructor" begin
P1 = BSplineSpace{2}(KnotVector(1:8))
P2 = BSplineSpace{2}(P1)
P3 = BSplineSpace{2,Int}(P1)
P4 = BSplineSpace{2,Real}(P1)
P5 = BSplineSpace{2,Float64}(P1)
P6 = BSplineSpace{2,Float64}(KnotVector(1:8))
P7 = BSplineSpace{2,Float64,KnotVector{Float64}}(KnotVector(1:8))
@test P1 == P2 == P3 == P4 == P5 == bsplinespace(P1) == bsplinespace(P2) == bsplinespace(P3) == bsplinespace(P4) == bsplinespace(P5)
@test P5 == P6 == P7
@test typeof(P5) === typeof(P6) === typeof(P7)
@test P1 isa BSplineSpace{2,Int}
@test P2 isa BSplineSpace{2,Int}
@test P3 isa BSplineSpace{2,Int}
@test P4 isa BSplineSpace{2,Real}
@test P5 isa BSplineSpace{2,Float64}
@test P1 === BSplineSpace(P1)
@test_throws MethodError BSplineSpace(KnotVector(1:8))
@test_throws MethodError BSplineSpace{3}(P1)
end
@testset "dimension, dengenerate" begin
P1 = BSplineSpace{2}(KnotVector([1, 3, 5, 6, 8, 9, 9]))
@test bsplinesupport(P1, 2) == 3..8
@test bsplinesupport_R(P1, 2) == 3..8
@test bsplinesupport_I(P1, 2) == 5..8
@test domain(P1) == 5..8
@test dim(P1) == 4
@test exactdim_R(P1) == 4
@test isnondegenerate(P1) == true
@test isdegenerate(P1) == false
P2 = BSplineSpace{1}(KnotVector([1, 3, 3, 3, 8, 9]))
@test isnondegenerate(P2) == false
@test isdegenerate(P2) == true
@test isdegenerate(P2,1) == false
@test isdegenerate(P2,2) == true
@test isdegenerate(P2,3) == false
@test isdegenerate(P2,4) == false
@test isnondegenerate(P2,1) == true
@test isnondegenerate(P2,2) == false
@test isnondegenerate(P2,3) == true
@test isnondegenerate(P2,4) == true
@test dim(P2) == 4
@test exactdim_R(P2) == 3
P3 = BSplineSpace{2}(KnotVector([0,0,0,1,1,1,2]))
@test domain(P3) == 0..1
@test dim(P3) == 4
@test exactdim_R(P3) == 4
@test isnondegenerate(P3) == true
@test isdegenerate(P3) == false
@test isdegenerate(P3,1) == false
@test isdegenerate(P3,2) == false
@test isdegenerate(P3,3) == false
@test isdegenerate(P3,4) == false
@test isnondegenerate(P3,1) == true
@test isnondegenerate(P3,2) == true
@test isnondegenerate(P3,3) == true
@test isnondegenerate(P3,4) == true
@test isnondegenerate_I(P3) == false
@test isdegenerate_I(P3) == true
@test isdegenerate_I(P3,1) == false
@test isdegenerate_I(P3,2) == false
@test isdegenerate_I(P3,3) == false
@test isdegenerate_I(P3,4) == true
@test isnondegenerate_I(P3,1) == true
@test isnondegenerate_I(P3,2) == true
@test isnondegenerate_I(P3,3) == true
@test isnondegenerate_I(P3,4) == false
end
@testset "denegeration with lower degree" begin
k = KnotVector([1, 3, 3, 3, 6, 8, 9])
@test isnondegenerate(BSplineSpace{2}(k))
@test isdegenerate(BSplineSpace{1}(k))
end
@testset "subset" begin
P1 = BSplineSpace{1}(KnotVector([1, 3, 5, 8]))
P2 = BSplineSpace{1}(KnotVector([1, 3, 5, 6, 8, 9]))
P3 = BSplineSpace{2}(KnotVector([1, 1, 3, 3, 5, 5, 8, 8]))
@test P1 ⊆ P1
@test P2 ⊆ P2
@test P3 ⊆ P3
@test P1 ⊆ P2
@test P1 ⋢ P2
@test P1 ⊆ P3
@test P2 ⊈ P3
@test !(P1 ⊊ P1)
@test !(P2 ⊊ P2)
@test !(P3 ⊊ P3)
@test P1 ⊊ P2
@test P1 ⊊ P3
@test !(P1 ⊋ P1)
@test !(P2 ⊋ P2)
@test !(P3 ⊋ P3)
@test P2 ⊋ P1
@test P3 ⊋ P1
end
@testset "sqsubset" begin
P1 = BSplineSpace{3}(KnotVector([2, 2, 2, 3, 3, 4, 4, 4]))
P2 = BSplineSpace{3}(KnotVector([1, 3, 3, 3, 4]))
P3 = BSplineSpace{2}(knotvector"3 3")
P4 = BSplineSpace{3}(knotvector"4 4")
P5 = BSplineSpace{3}(knotvector"414")
@test P1 ⋢ P2
@test P3 ⊑ P4 ⊑ P5
end
@testset "equality" begin
P1 = BSplineSpace{2}(KnotVector([1, 2, 3, 5, 8, 8, 9]))
P2 = BSplineSpace{2}(KnotVector([1, 2, 3, 5, 8, 8, 9]))
P3 = BSplineSpace{1}(KnotVector([1, 2, 3, 5, 8, 8, 9]))
P4 = BSplineSpace{1}(KnotVector([1, 2, 3, 5, 8, 8, 9]))
@test P1 ⊆ P2
@test P2 ⊆ P1
@test P1 == P2
@test hash(P1) == hash(P2)
@test P3 ⊆ P4
@test P4 ⊆ P3
@test P3 == P4
@test hash(P3) == hash(P4)
@test P1 != P3
@test hash(P1) != hash(P3)
end
@testset "expandspace" begin
P1 = BSplineSpace{1}(KnotVector([0,0,0,0,0]))
P2 = BSplineSpace{3}(KnotVector(1:8))
P3 = BSplineSpace{2}(KnotVector(1:8)+3*KnotVector([0]))
P4 = BSplineSpace{2}(KnotVector([0,0,0,1,1,1,2]))
@test P1 == expandspace_R(P1) == expandspace_I(P1) == expandspace(P1)
@test P2 == expandspace_R(P2) == expandspace_I(P2) == expandspace(P2)
@test P3 == expandspace_R(P3) == expandspace_I(P3) == expandspace(P3)
@test P4 == expandspace_R(P4) == expandspace_I(P4) == expandspace(P4)
@test P1 ⊆ @inferred expandspace_R(P1, Val(1))
@test P2 ⊆ @inferred expandspace_R(P2, Val(1))
@test P3 ⊆ @inferred expandspace_R(P3, Val(1))
@test P4 ⊆ @inferred expandspace_R(P4, Val(1))
@test P1 ⊆ expandspace_R(P1, KnotVector([1,2,3]))
@test P2 ⊆ expandspace_R(P2, KnotVector([1,2,3]))
@test P3 ⊆ expandspace_R(P3, KnotVector([1,2,3]))
@test P4 ⊆ expandspace_R(P4, KnotVector([1,2,3]))
@test knotvector(P1) + KnotVector([1,2,3]) ⊆ knotvector(expandspace_R(P1, KnotVector([1,2,3])))
@test knotvector(P2) + KnotVector([1,2,3]) ⊆ knotvector(expandspace_R(P2, KnotVector([1,2,3])))
@test knotvector(P3) + KnotVector([1,2,3]) ⊆ knotvector(expandspace_R(P3, KnotVector([1,2,3])))
@test knotvector(P4) + KnotVector([1,2,3]) ⊆ knotvector(expandspace_R(P4, KnotVector([1,2,3])))
# P1 and P4 is not subset of expandspace_I.
@test P1 ⋢ expandspace_I(P1, Val(1)) == expandspace(P1, Val(1))
@test P2 ⊑ expandspace_I(P2, Val(1)) == expandspace(P2, Val(1))
@test P3 ⊑ expandspace_I(P3, Val(1)) == expandspace(P3, Val(1))
@test P4 ⋢ expandspace_I(P4, Val(1)) == expandspace(P4, Val(1))
# That was because P1 and P4 is not nondegenerate.
@test isdegenerate_I(P1)
@test isdegenerate_I(P4)
# Additional knot vector should be inside the domain
k5 = KnotVector(1:8)
P5 = BSplineSpace{3}(k5)
@test_throws DomainError expandspace_I(P5, KnotVector([9,19]))
@test expandspace_R(P5, KnotVector([9,19])) == expandspace_R(P5, Val(0), KnotVector([9,19]))
end
@testset "sqsubset and lowered B-spline space" begin
P4 = BSplineSpace{1}(KnotVector([1, 2, 3, 4, 5]))
P5 = BSplineSpace{2}(KnotVector([-1, 0.3, 2, 3, 3, 4, 5.2, 6]))
_P4 = BSplineSpace{degree(P4)-1}(knotvector(P4)[2:end-1])
_P5 = BSplineSpace{degree(P5)-1}(knotvector(P5)[2:end-1])
@test P4 ⊑ P4
@test P4 ⊑ P5
@test P5 ⊒ P4
@test P5 ⋢ P4
@test P4 ⋣ P5
@test (P4 ⊑ P4) == (_P4 ⊑ _P4)
@test (P4 ⊑ P5) == (_P4 ⊑ _P5)
@test (P5 ⊑ P4) == (_P5 ⊑ _P4)
end
@testset "subset and sqsubset" begin
P6 = BSplineSpace{2}(knotvector"1111 111")
P7 = BSplineSpace{2}(knotvector"11121111")
@test P6 ⊆ P6
@test P6 ⊆ P7
@test P7 ⊆ P7
@test P6 ⊑ P6
@test P6 ⊑ P7
@test P7 ⊑ P7
@test domain(P6) == domain(P7)
end
@testset "subset but not sqsubset" begin
P6 = BSplineSpace{2}(knotvector"11111111")
P7 = BSplineSpace{2}(knotvector"1111111111")
@test P6 ⊆ P6
@test P7 ⊆ P7
@test P6 ⊆ P7
@test P7 ⊈ P6
@test P6 ⊆ P6
@test P7 ⊆ P7
@test P6 ⊆ P7
@test P7 ⊈ P6
@test domain(P6) ⊆ domain(P7)
end
@testset "sqsubset but not subset" begin
P6 = BSplineSpace{2}(knotvector" 1111111")
P7 = BSplineSpace{2}(knotvector"11 11111")
@test P6 ⊑ P7
@test P7 ⊑ P6
@test P6 ≃ P7
@test P6 ⊈ P7
@test P7 ⊈ P6
@test P6 ⋤ P7
@test P7 ⋤ P6
@test P6 ⋥ P7
@test P7 ⋥ P6
@test domain(P6) == domain(P7)
end
@testset "clamp" begin
P1 = BSplineSpace{2}(knotvector"2132111")
P2 = BSplineSpace{2}(knotvector" 3323")
@test clampknotvector(P1) == P2 == clampknotvector(P2)
@test !isclamped(P1)
@test isclamped(P2)
@test P1 ≠ P2
clampknotvector!(P1)
@test isclamped(P1)
@test P1 == P2
P3 = BSplineSpace{3}(knotvector(0:10))
@test knotvector(P3) isa UniformKnotVector{Int}
@test_throws MethodError clampknotvector!(P3)
@test knotvector(clampknotvector(P3)) isa KnotVector{Int}
@test clampknotvector(P3) == BSplineSpace{3}(knotvector([3,3,3,3,4,5,6,7,7,7,7]))
end
end