1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2021 CEA/DEN, EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 if sys.platform == "win32":
24 from MEDCouplingCompat import *
26 from medcoupling import *
28 if MEDCouplingHasNumPyBindings():
32 from platform import architecture
33 from sys import getrefcount
35 import os,gc,weakref,unittest
37 class MEDCouplingNumPyTest(unittest.TestCase):
39 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
42 a=array(0,dtype=int32)
45 self.assertEqual(getrefcount(a),2)
46 a=a.cumsum(dtype=int32)
47 a=array(a,dtype=int64) ; a=array(a,dtype=int32)
48 self.assertEqual(getrefcount(a),2)
52 e=DataArrayInt32(sz) ; e.fillWithValue(2)
53 self.assertTrue(d.isEqual(e))
55 a[:]=4 ; e.fillWithValue(4)
56 self.assertTrue(d.isEqual(e))
59 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
62 a=array(0,dtype=int32)
64 self.assertEqual(getrefcount(a),2)
66 self.assertEqual(getrefcount(a),3)
67 self.assertEqual(getrefcount(b),2)
71 e=DataArrayInt32(sz*2) ; e.fillWithValue(5)
72 self.assertTrue(d.isEqual(e))
75 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
78 a=array(0,dtype=int32)
85 self.assertTrue(d.isEqual(DataArrayInt32([6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,6,6,6])))
87 a=zeros((10,2),dtype=int32)
93 self.assertTrue(d.isEqual(DataArrayInt32([0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10])))
96 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
98 a=zeros(20,dtype=int32)
100 self.assertRaises(InterpKernelException,DataArrayInt.New,b) # b is not contiguous in memory
103 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
105 a=arange(20,dtype=int32)
106 self.assertEqual(weakref.getweakrefcount(a),0)
108 self.assertEqual(weakref.getweakrefcount(a),1)
109 self.assertTrue(not a.flags["OWNDATA"])
110 self.assertTrue(d.isIota(20))
111 a[:]=2 # modifying a and d because a and d share the same chunk of data
112 self.assertTrue(d.isUniform(2))
113 del d # d is destroyed, a retrieves its ownership of its initial chunk of data
114 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
117 self.assertTrue(a.flags["OWNDATA"])
118 a[:]=4 # a can be used has usual
119 self.assertTrue(DataArrayInt32(a).isUniform(4))
122 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
124 a=arange(20,dtype=int32)
125 d=DataArrayInt32(a) # d owns data of a
126 e=DataArrayInt32(a) # a not owned -> e only an access to chunk of a
127 self.assertTrue(d.isIota(d.getNumberOfTuples()))
128 self.assertTrue(e.isIota(e.getNumberOfTuples()))
130 self.assertTrue(d.isUniform(6))
131 self.assertTrue(e.isUniform(6))
132 del a # a destroyed -> d no change because owned and e array is has no more data set
133 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
136 self.assertTrue(d.isUniform(6))
137 self.assertTrue(not e.isAllocated())
140 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
142 a=array(0,dtype=int32) ; a.resize(10,2)
145 d=DataArrayInt32(b) # d owns data of a
146 e=DataArrayInt32(b) # a not owned -> e only an access to chunk of a
147 f=DataArrayInt32(b) # a not owned -> e only an access to chunk of a
148 del d # d removed -> a ownes again data
149 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
152 self.assertTrue(e.isUniform(0))
154 self.assertTrue(e.isUniform(6))
155 self.assertTrue(f.isUniform(6))
156 self.assertEqual(b.tolist(),[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6])
157 self.assertEqual(a.tolist(),[[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6]])
159 del b # no impact on e and f because a is the base of a.
160 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
162 self.assertTrue(f.isIota(f.getNumberOfTuples()))
163 self.assertTrue(e.isIota(e.getNumberOfTuples()))
164 del a # a destroyed, but as c has its base set to a, a exists -> e and f not allocated
165 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
167 self.assertTrue(f.isIota(f.getNumberOfTuples()))
168 self.assertTrue(e.isIota(e.getNumberOfTuples()))
169 del c # c killed -> a killed -> e and d are put into not allocated state
170 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
172 self.assertTrue(not e.isAllocated())
173 self.assertTrue(not f.isAllocated())
176 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
178 a=arange(20,dtype=int32)
179 self.assertTrue(a.flags["OWNDATA"])
180 d=DataArrayInt32(a) # d owns data of a
181 self.assertTrue(not a.flags["OWNDATA"])
182 d.pushBackSilent(20)# d pushBack so release of chunk of data -> a becomes owner of its data again
183 self.assertTrue(a.flags["OWNDATA"])
184 self.assertTrue(d.isEqual(DataArrayInt32([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])))
185 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
188 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
191 a=array(0,dtype=float64)
194 self.assertEqual(getrefcount(a),2)
195 a=a.cumsum(dtype=float64)
196 self.assertEqual(getrefcount(a),2)
200 e=DataArrayDouble(sz) ; e.fillWithValue(2)
201 self.assertTrue(d.isEqual(e,1e-14))
203 a[:]=4 ; e.fillWithValue(4)
204 self.assertTrue(d.isEqual(e,1e-14))
207 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
210 a=array(0,dtype=float64)
212 self.assertEqual(getrefcount(a),2)
214 self.assertEqual(getrefcount(a),3)
215 self.assertEqual(getrefcount(b),2)
219 e=DataArrayDouble(sz*2) ; e.fillWithValue(5)
220 self.assertTrue(d.isEqual(e,1e-14))
223 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
226 a=array(0,dtype=float64)
233 self.assertTrue(d.isEqual(DataArrayDouble([6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,6,6,6]),1e-14))
235 a=zeros((10,2),dtype=float64)
241 self.assertTrue(d.isEqual(DataArrayDouble([0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]),1e-14))
244 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
246 a=zeros(20,dtype=float64)
248 self.assertRaises(InterpKernelException,DataArrayDouble.New,b) # b is not contiguous in memory
251 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
253 a=arange(20,dtype=float64)
254 self.assertEqual(weakref.getweakrefcount(a),0)
256 self.assertEqual(weakref.getweakrefcount(a),1)
257 self.assertTrue(not a.flags["OWNDATA"])
258 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
259 self.assertEqual(len(d),20)
260 a[:]=2 # modifying a and d because a and d share the same chunk of data
261 self.assertTrue(d.isUniform(2,1e-14))
262 del d # d is destroyed, a retrieves its ownership of its initial chunk of data
263 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
266 self.assertTrue(a.flags["OWNDATA"])
267 a[:]=4 # a can be used has usual
268 self.assertTrue(DataArrayDouble(a).isUniform(4,1e-14))
271 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
273 a=arange(20,dtype=float64)
274 d=DataArrayDouble(a) # d owns data of a
275 e=DataArrayDouble(a) # a not owned -> e only an access to chunk of a
276 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
277 self.assertTrue(e.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
279 self.assertTrue(d.isUniform(6,1e-14))
280 self.assertTrue(e.isUniform(6,1e-14))
281 del a # a destroyed -> d no change because owned and e array is has no more data set
282 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
285 self.assertTrue(d.isUniform(6,1e-14))
286 self.assertTrue(not e.isAllocated())
289 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
291 a=array(0,dtype=float64) ; a.resize(10,2)
294 d=DataArrayDouble(b) # d owns data of a
295 e=DataArrayDouble(b) # a not owned -> e only an access to chunk of a
296 f=DataArrayDouble(b) # a not owned -> e only an access to chunk of a
297 del d # d removed -> a ownes again data
298 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
301 self.assertTrue(e.isUniform(0,1e-14))
303 self.assertTrue(e.isUniform(6,1e-14))
304 self.assertTrue(f.isUniform(6,1e-14))
305 self.assertEqual(b.tolist(),[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6])
306 self.assertEqual(a.tolist(),[[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6]])
308 del b # no impact on e and f because a is the base of a.
309 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
311 self.assertTrue(f.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
312 self.assertTrue(e.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
313 del a # a destroyed, but as c has its base set to a, a exists -> e and f not allocated
314 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
316 self.assertTrue(f.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
317 self.assertTrue(e.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-14))
318 del c # c killed -> a killed -> e and d are put into not allocated state
319 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
321 self.assertTrue(not e.isAllocated())
322 self.assertTrue(not f.isAllocated())
325 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
327 a=arange(20,dtype=float64)
328 self.assertTrue(a.flags["OWNDATA"])
329 d=DataArrayDouble(a) # d owns data of a
330 self.assertTrue(not a.flags["OWNDATA"])
331 d.pushBackSilent(20)# d pushBack so release of chunk of data -> a becomes owner of its data again
332 self.assertTrue(a.flags["OWNDATA"])
333 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]),1e-14))
334 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
337 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
339 d=DataArrayInt.Range(0,20,1)
341 self.assertTrue(not a.flags["OWNDATA"])
343 self.assertTrue(d.isEqual(DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,100,100])))
344 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,100,100])
346 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
349 self.assertTrue(d.isEqual(DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,100,100])))
353 self.assertTrue(not a.flags["OWNDATA"])
355 self.assertTrue(d.isEqual(DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,200,200,200,200],10,2)))
356 self.assertEqual(a.tolist(),[[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[200,200],[200,200]])
358 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
360 self.assertTrue(d.isEqual(DataArrayInt([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,200,200,200,200],10,2)))
363 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
365 d=DataArrayInt.Range(0,20,1)
366 d=d.convertToDblArr()
368 self.assertTrue(not a.flags["OWNDATA"])
370 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,100,100]),1e-14))
371 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,100,100])
373 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
376 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,100,100]),1e-14))
380 self.assertTrue(not a.flags["OWNDATA"])
382 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,200,200,200,200],10,2),1e-14))
383 self.assertEqual(a.tolist(),[[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15],[200,200],[200,200]])
385 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
387 self.assertTrue(d.isEqual(DataArrayDouble([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,200,200,200,200],10,2),1e-14))
390 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
393 a=array(0,dtype=int32)
396 self.assertEqual(getrefcount(a),2)
398 self.assertEqual(10,d.getNumberOfTuples())
399 self.assertEqual(2,d.getNumberOfComponents())
400 self.assertEqual(sz,d.getNbOfElems())
401 self.assertTrue(d.isEqual(DataArrayInt32([(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4),(4,4)])))
403 self.assertTrue(d.isEqual(DataArrayInt32([(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7),(7,7)])))
406 self.assertRaises(InterpKernelException,DataArrayInt.New,b) # b has not dimension in [0,1] !
409 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
412 a=array(0,dtype=float64)
415 self.assertEqual(getrefcount(a),2)
417 self.assertEqual(10,d.getNumberOfTuples())
418 self.assertEqual(2,d.getNumberOfComponents())
419 self.assertEqual(sz,d.getNbOfElems())
420 self.assertTrue(d.isEqual(DataArrayDouble([(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.)]),1e-14))
422 self.assertTrue(d.isEqual(DataArrayDouble([(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.)]),1e-14))
425 self.assertRaises(InterpKernelException,DataArrayDouble.New,b) # b has not dimension in [0,1] !
428 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
430 #tests that only DataArray*(npArray) constructor is available
431 a=array(0,dtype=int32)
434 self.assertRaises(InterpKernelException,DataArrayInt.New,a,20)
435 self.assertRaises(InterpKernelException,DataArrayInt.New,a,20,1)
436 a=array(0,dtype=float64)
439 self.assertRaises(InterpKernelException,DataArrayDouble.New,a,20)
440 self.assertRaises(InterpKernelException,DataArrayDouble.New,a,20,1)
443 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
445 d=DataArrayDouble(10)
448 self.assertTrue(not a.flags["OWNDATA"])
451 self.assertTrue(a.flags["OWNDATA"])
452 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
457 self.assertTrue(not a.flags["OWNDATA"])
460 self.assertTrue(a.flags["OWNDATA"])
461 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
464 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
466 d=DataArrayDouble(10)
471 self.assertTrue(not a.flags["OWNDATA"])
472 self.assertTrue(not b.flags["OWNDATA"])
473 self.assertTrue(not c.flags["OWNDATA"])
474 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
475 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
476 self.assertEqual(c.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
479 self.assertTrue(a.flags["OWNDATA"])
480 self.assertTrue(not b.flags["OWNDATA"])
481 self.assertTrue(not c.flags["OWNDATA"])
482 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
483 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
484 self.assertEqual(c.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
491 self.assertTrue(not a.flags["OWNDATA"])
492 self.assertTrue(not b.flags["OWNDATA"])
493 self.assertTrue(not c.flags["OWNDATA"])
494 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
495 self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
496 self.assertEqual(c.tolist(),[0,1,2,3,4,5,6,7,8,9])
499 self.assertTrue(a.flags["OWNDATA"])
500 self.assertTrue(not b.flags["OWNDATA"])
501 self.assertTrue(not c.flags["OWNDATA"])
502 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
503 self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
504 self.assertEqual(c.tolist(),[0,1,2,3,4,5,6,7,8,9])
507 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
509 d=DataArrayDouble(10)
512 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
513 self.assertTrue(not a.flags["OWNDATA"])
514 self.assertTrue(a.base is None)
518 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
519 self.assertTrue(not a.flags["OWNDATA"])
520 self.assertTrue(a.base is None)
522 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
523 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
524 self.assertTrue(not a.flags["OWNDATA"])
525 self.assertTrue(not b.flags["OWNDATA"])
526 self.assertTrue(b.base is a)
529 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
530 self.assertTrue(not b.flags["OWNDATA"])
533 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
534 self.assertTrue(not b.flags["OWNDATA"])
539 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
540 self.assertTrue(not a.flags["OWNDATA"])
541 self.assertTrue(a.base is None)
545 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
546 self.assertTrue(not a.flags["OWNDATA"])
547 self.assertTrue(a.base is None)
549 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
550 self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
551 self.assertTrue(not a.flags["OWNDATA"])
552 self.assertTrue(not b.flags["OWNDATA"])
553 self.assertTrue(b.base is a)
556 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
557 self.assertTrue(not b.flags["OWNDATA"])
560 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
561 self.assertTrue(not b.flags["OWNDATA"])
564 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
566 a=arange(10,dtype=int32)
570 self.assertTrue(b.isIota(10))
571 self.assertTrue(c.isIota(10))
572 self.assertTrue(d.isIota(10))
573 c.pushBackSilent(10) # c and a,b are dissociated
574 self.assertTrue(b.isIota(10))
575 self.assertTrue(c.isIota(11))
576 self.assertTrue(d.isIota(10))
579 self.assertTrue(b.isIota(10))
580 self.assertTrue(c.isIota(11))
581 self.assertTrue(not d.isAllocated())
584 self.assertTrue(c.isIota(11))
586 a=arange(10,dtype=int32)
589 self.assertTrue(b.isIota(10))
590 self.assertTrue(c.isIota(10))
591 b.pushBackSilent(10) # c and a,b are dissociated
592 self.assertTrue(b.isIota(11))
593 self.assertTrue(c.isIota(10))
596 self.assertTrue(b.isIota(11))
597 self.assertTrue(not c.isAllocated())
600 self.assertTrue(not c.isAllocated())
602 a=float64(arange(5,dtype=int32))
606 self.assertTrue(b.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
607 self.assertTrue(c.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
608 self.assertTrue(d.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
609 c.pushBackSilent(10.) # c and a,b are dissociated
610 self.assertTrue(b.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
611 self.assertTrue(c.isEqual(DataArrayDouble([0.,1.,2.,3.,4.,10.]),1e-12))
612 self.assertTrue(d.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
615 self.assertTrue(b.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
616 self.assertTrue(c.isEqual(DataArrayDouble([0.,1.,2.,3.,4.,10.]),1e-12))
617 self.assertTrue(not d.isAllocated())
620 self.assertTrue(c.isEqual(DataArrayDouble([0.,1.,2.,3.,4.,10.]),1e-12))
622 a=float64(arange(5,dtype=int32))
625 self.assertTrue(b.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
626 self.assertTrue(c.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
627 b.pushBackSilent(10.) # c and a,b are dissociated
628 self.assertTrue(b.isEqual(DataArrayDouble([0.,1.,2.,3.,4.,10.]),1e-12))
629 self.assertTrue(c.isEqual(DataArrayDouble([0.,1.,2.,3.,4.]),1e-12))
632 self.assertTrue(b.isEqual(DataArrayDouble([0.,1.,2.,3.,4.,10.]),1e-12))
633 self.assertTrue(not c.isAllocated())
636 self.assertTrue(not c.isAllocated())
639 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
641 d=DataArrayInt(15) ; d.iota()
644 self.assertEqual(a.ndim,2)
645 self.assertEqual(a.size,15)
646 self.assertEqual(a.shape,(5,3))
647 self.assertEqual(a.strides,(3*MEDCouplingSizeOfIDs()//8,MEDCouplingSizeOfIDs()//8))
648 self.assertEqual(a.nbytes,15*MEDCouplingSizeOfIDs()//8)
649 self.assertEqual(a.itemsize,MEDCouplingSizeOfIDs()//8)
650 self.assertEqual(a.tolist(),[[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])
652 d2=d.convertToDblArr()
654 self.assertEqual(a2.ndim,2)
655 self.assertEqual(a2.size,15)
656 self.assertEqual(a2.shape,(5,3))
657 self.assertEqual(a2.strides,(24,8))
658 self.assertEqual(a2.nbytes,120)
659 self.assertEqual(a2.itemsize,8)
660 self.assertEqual(a2.tolist(),[[0.,1.,2.],[3.,4.,5.],[6.,7.,8.],[9.,10.,11.],[12.,13.,14.]])
663 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
665 m0=DenseMatrix(DataArrayDouble([2,3,4,5,1,6]),2,3)
666 m0np=m0.toNumPyMatrix()
667 self.assertEqual(m0np.shape,(2,3))
668 self.assertEqual(m0np.tolist(),[[2.0,3.0,4.0],[5.0,1.0,6.0]])
671 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
673 """Test on DataArrayBytes"""
676 for i in range(len(d)):
680 for i in range(len(d)):
681 self.assertEqual(int(arr[i]),-128+i)
684 self.assertEqual(int(arr[0]),7)
686 self.assertEqual(int(d.getIJ(0,0)),8)
693 for i in range(len(d)):
697 for i in range(len(d)):
698 self.assertEqual(int(arr[i]),-128+i)
706 for i in range(len(d)):
709 arr1=d.toNumPyArray()
710 arr2=d.toNumPyArray()
711 arr3=d.toNumPyArray()
713 self.assertEqual(int(arr1[0]),10) ; self.assertEqual(int(arr2[0]),10) ; self.assertEqual(int(arr3[0]),10)
714 arr2[0]=15 ; self.assertEqual(int(d.getIJ(0,0)),15) ; self.assertEqual(int(arr1[0]),15) ; self.assertEqual(int(arr3[0]),15)
716 for i in range(len(d)):
717 self.assertEqual(int(arr1[i]),-128+i)
718 self.assertEqual(int(arr2[i]),-128+i)
719 self.assertEqual(int(arr3[i]),-128+i)
723 for i in range(len(d)):
724 self.assertEqual(int(arr1[i]),-128+i)
725 self.assertEqual(int(arr3[i]),-128+i)
729 for i in range(len(d)):
730 self.assertEqual(int(arr3[i]),-128+i)
735 arr=array(0,dtype=int8)
742 self.assertEqual(int(d.getIJ(i,0)),-128+i)
749 arr=array(0,dtype=int8)
756 self.assertEqual(int(d.getIJ(i,0)),-128+i)
764 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
766 """Same as test9 with float32"""
768 a=array(0,dtype=float32)
771 self.assertEqual(getrefcount(a),2)
772 a=a.cumsum(dtype=float32)
773 self.assertEqual(getrefcount(a),2)
777 e=DataArrayFloat(sz) ; e.fillWithValue(2)
778 self.assertTrue(d.isEqual(e,1e-7))
780 a[:]=4 ; e.fillWithValue(4)
781 self.assertTrue(d.isEqual(e,1e-7))
784 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
786 """Same as test10 with float32"""
788 a=array(0,dtype=float32)
790 self.assertEqual(getrefcount(a),2)
792 self.assertEqual(getrefcount(a),3)
793 self.assertEqual(getrefcount(b),2)
797 e=DataArrayFloat(sz*2) ; e.fillWithValue(5)
798 self.assertTrue(d.isEqual(e,1e-7))
801 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
803 """Same as test11 with float32"""
805 a=array(0,dtype=float32)
812 self.assertTrue(d.isEqual(DataArrayFloat([6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,6,6,6]),1e-7))
814 a=zeros((10,2),dtype=float32)
820 self.assertTrue(d.isEqual(DataArrayFloat([0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]),1e-7))
823 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
825 """Same as test12 with float32"""
826 a=zeros(20,dtype=float32)
828 self.assertRaises(InterpKernelException,DataArrayFloat.New,b) # b is not contiguous in memory
831 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
833 """Same as test13 with float32"""
834 a=arange(20,dtype=float32)
835 self.assertEqual(weakref.getweakrefcount(a),0)
837 self.assertEqual(weakref.getweakrefcount(a),1)
838 self.assertTrue(not a.flags["OWNDATA"])
839 self.assertTrue(d.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
840 self.assertEqual(len(d),20)
841 a[:]=2 # modifying a and d because a and d share the same chunk of data
842 self.assertTrue(d.isUniform(2,1e-7))
843 del d # d is destroyed, a retrieves its ownership of its initial chunk of data
844 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
847 self.assertTrue(a.flags["OWNDATA"])
848 a[:]=4 # a can be used has usual
849 self.assertTrue(DataArrayFloat(a).isUniform(4,1e-7))
852 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
854 """Same as test14 with float32"""
855 a=arange(20,dtype=float32)
856 d=DataArrayFloat(a) # d owns data of a
857 e=DataArrayFloat(a) # a not owned -> e only an access to chunk of a
858 self.assertTrue(d.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
859 self.assertTrue(e.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
861 self.assertTrue(d.isUniform(6,1e-7))
862 self.assertTrue(e.isUniform(6,1e-7))
863 del a # a destroyed -> d no change because owned and e array is has no more data set
864 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
867 self.assertTrue(d.isUniform(6,1e-7))
868 self.assertTrue(not e.isAllocated())
871 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
873 """Same as test15 with float32"""
874 a=array(0,dtype=float32) ; a.resize(10,2)
877 d=DataArrayFloat(b) # d owns data of a
878 e=DataArrayFloat(b) # a not owned -> e only an access to chunk of a
879 f=DataArrayFloat(b) # a not owned -> e only an access to chunk of a
880 del d # d removed -> a ownes again data
881 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
884 self.assertTrue(e.isUniform(0,1e-7))
886 self.assertTrue(e.isUniform(6,1e-7))
887 self.assertTrue(f.isUniform(6,1e-7))
888 self.assertEqual(b.tolist(),[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6])
889 self.assertEqual(a.tolist(),[[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6]])
891 del b # no impact on e and f because a is the base of a.
892 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
894 self.assertTrue(f.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
895 self.assertTrue(e.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
896 del a # a destroyed, but as c has its base set to a, a exists -> e and f not allocated
897 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
899 self.assertTrue(f.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
900 self.assertTrue(e.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),1e-7))
901 del c # c killed -> a killed -> e and d are put into not allocated state
902 ##@@ Ensure a pass of the garbage collector so that the de-allocator of d is called
904 self.assertTrue(not e.isAllocated())
905 self.assertTrue(not f.isAllocated())
908 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
910 """Same as test16 with float32"""
911 a=arange(20,dtype=float32)
912 self.assertTrue(a.flags["OWNDATA"])
913 d=DataArrayFloat(a) # d owns data of a
914 self.assertTrue(not a.flags["OWNDATA"])
915 d.pushBackSilent(20)# d pushBack so release of chunk of data -> a becomes owner of its data again
916 self.assertTrue(a.flags["OWNDATA"])
917 self.assertTrue(d.isEqual(DataArrayFloat([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]),1e-7))
918 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
921 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
923 """Same as test20 with float32"""
925 a=array(0,dtype=float32)
928 self.assertEqual(getrefcount(a),2)
930 self.assertEqual(10,d.getNumberOfTuples())
931 self.assertEqual(2,d.getNumberOfComponents())
932 self.assertEqual(sz,d.getNbOfElems())
933 self.assertTrue(d.isEqual(DataArrayFloat([(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.),(4.,4.)]),1e-7))
935 self.assertTrue(d.isEqual(DataArrayFloat([(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.),(7.,7.)]),1e-7))
938 self.assertRaises(InterpKernelException,DataArrayFloat.New,b) # b has not dimension in [0,1] !
941 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
943 """Same as test22 with float32"""
947 self.assertTrue(not a.flags["OWNDATA"])
950 self.assertTrue(a.flags["OWNDATA"])
951 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
956 self.assertTrue(not a.flags["OWNDATA"])
959 self.assertTrue(a.flags["OWNDATA"])
960 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
963 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
965 """Same as test23 with float32"""
971 self.assertTrue(not a.flags["OWNDATA"])
972 self.assertTrue(not b.flags["OWNDATA"])
973 self.assertTrue(not c.flags["OWNDATA"])
974 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
975 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
976 self.assertEqual(c.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
979 self.assertTrue(a.flags["OWNDATA"])
980 self.assertTrue(not b.flags["OWNDATA"])
981 self.assertTrue(not c.flags["OWNDATA"])
982 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
983 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
984 self.assertEqual(c.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
991 self.assertTrue(not a.flags["OWNDATA"])
992 self.assertTrue(not b.flags["OWNDATA"])
993 self.assertTrue(not c.flags["OWNDATA"])
994 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
995 self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
996 self.assertEqual(c.tolist(),[0,1,2,3,4,5,6,7,8,9])
999 self.assertTrue(a.flags["OWNDATA"])
1000 self.assertTrue(not b.flags["OWNDATA"])
1001 self.assertTrue(not c.flags["OWNDATA"])
1002 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
1003 self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
1004 self.assertEqual(c.tolist(),[0,1,2,3,4,5,6,7,8,9])
1007 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
1009 """Same as test24 with float32"""
1010 d=DataArrayFloat(10)
1013 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1014 self.assertTrue(not a.flags["OWNDATA"])
1015 self.assertTrue(a.base is None)
1019 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1020 self.assertTrue(not a.flags["OWNDATA"])
1021 self.assertTrue(a.base is None)
1023 self.assertEqual(a.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1024 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1025 self.assertTrue(not a.flags["OWNDATA"])
1026 self.assertTrue(not b.flags["OWNDATA"])
1027 self.assertTrue(b.base is a)
1030 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1031 self.assertTrue(not b.flags["OWNDATA"])
1034 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1035 self.assertTrue(not b.flags["OWNDATA"])
1040 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
1041 self.assertTrue(not a.flags["OWNDATA"])
1042 self.assertTrue(a.base is None)
1046 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
1047 self.assertTrue(not a.flags["OWNDATA"])
1048 self.assertTrue(a.base is None)
1050 self.assertEqual(a.tolist(),[0,1,2,3,4,5,6,7,8,9])
1051 self.assertEqual(b.tolist(),[0,1,2,3,4,5,6,7,8,9])
1052 self.assertTrue(not a.flags["OWNDATA"])
1053 self.assertTrue(not b.flags["OWNDATA"])
1054 self.assertTrue(b.base is a)
1057 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1058 self.assertTrue(not b.flags["OWNDATA"])
1061 self.assertEqual(b.tolist(),[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
1062 self.assertTrue(not b.flags["OWNDATA"])
1065 @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy")
1067 """ This non regression test is focused on a numpy subarray of a bigger numpy array. Typically a 1D array coming from a 2D array. When medcoupling takes the ownership, medcoupling must store an offset to deallocate correctly the pointer. The pointer of medcoupling array is NOT the pointer to be transmited to free. The offset is typically the distance between the start of the main 2D array and the start of 1D array medcouplingized."""
1069 array = np.array([[1,2,3,10],[4,5,6,20],[7,8,9,30]],dtype=np.float64) # create a 2D array
1070 b = array[2] # b data pointer starts at array+2*4*sizeof(float64) so offset is expected to be equal to -2*4*sizeof(float64)=-64
1071 self.assertTrue(array.flags["OWNDATA"])
1072 self.assertTrue(not b.flags["OWNDATA"])
1073 d=DataArrayDouble(b)
1074 self.assertTrue(not array.flags["OWNDATA"])
1075 self.assertTrue(not b.flags["OWNDATA"])
1076 del b ; gc.collect()
1077 del array ; gc.collect()
1078 del d ; gc.collect() # important : destroy d after b and array to be sure to let the ownership to d.
1085 #gc.set_debug(gc.DEBUG_LEAK)