]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Addition of MEDCouplingSkyLineArray.thresholdPerPack method V9_5_0b1
authorAnthony Geay <anthony.geay@edf.fr>
Sun, 10 May 2020 22:28:48 +0000 (00:28 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Sun, 10 May 2020 22:28:48 +0000 (00:28 +0200)
src/MEDCoupling/MEDCouplingSkyLineArray.cxx
src/MEDCoupling/MEDCouplingSkyLineArray.hxx
src/MEDCoupling_Swig/MEDCouplingBasicsTest7.py
src/MEDCoupling_Swig/MEDCouplingCommon.i

index 8ab51c2d6ea945b57f465d962887232cc1f2b655..ca2948b99cf6b26dadcc4954745ef059de2b0a91 100755 (executable)
@@ -325,6 +325,36 @@ std::string MEDCouplingSkyLineArray::simpleRepr() const
   return oss.str();
 }
 
+/*!
+ * Returns 2 SkyLineArrays with same number of packs than \a this.
+ * Each pack in \a this is split in 2 parts using \a threshold parameter as cut point.
+ * \a left part contains ids in \a this pack strictly lower than \a threshold
+ * \a right part contains ids in \a this pack greater or equal to \a threshold
+ */
+void MEDCouplingSkyLineArray::thresholdPerPack(mcIdType threshold, MCAuto<MEDCouplingSkyLineArray>& left, MCAuto<MEDCouplingSkyLineArray>& right) const
+{
+  mcIdType nbPacks(this->getNumberOf());
+  MCAuto<DataArrayIdType> lCount(DataArrayIdType::New()); lCount->alloc(nbPacks,1); lCount->fillWithZero();
+  mcIdType *lCountPtr(lCount->getPointerSilent());
+  const mcIdType *valuesPtr(this->_values->begin()),*indexPtr(this->_index->begin());
+  for(mcIdType i = 0 ; i < nbPacks ; ++i, ++lCountPtr)
+  {
+    *lCountPtr = ToIdType(std::count_if(valuesPtr+indexPtr[i],valuesPtr+indexPtr[i+1],[threshold](mcIdType elt) { return elt<threshold; }));
+  }
+  MCAuto<DataArrayIdType> sizeOfPacks(this->_index->deltaShiftIndex());
+  sizeOfPacks->substractEqual(lCount);
+  mcIdType leftNbOfVal(lCount->accumulate(std::size_t(0))),rightNbOfVal(sizeOfPacks->accumulate(std::size_t(0)));
+  lCount->computeOffsetsFull(); sizeOfPacks->computeOffsetsFull();
+  MCAuto<DataArrayIdType> leftValues(DataArrayIdType::New()); leftValues->alloc(leftNbOfVal,1);
+  MCAuto<DataArrayIdType> rightValues(DataArrayIdType::New()); rightValues->alloc(rightNbOfVal,1);
+  mcIdType *rvPtr(rightValues->getPointerSilent()),*lvPtr(leftValues->getPointerSilent());
+  for(mcIdType i = 0 ; i < nbPacks ; ++i)
+  {
+    std::for_each(valuesPtr+indexPtr[i],valuesPtr+indexPtr[i+1],[threshold,&rvPtr,&lvPtr](mcIdType elt) { if(elt<threshold) { *lvPtr++ = elt; } else { *rvPtr++ = elt; } });
+  }
+  left = MEDCouplingSkyLineArray::New(lCount,leftValues); right = MEDCouplingSkyLineArray::New(sizeOfPacks,rightValues);
+}
+
 MEDCouplingSkyLineArray *MEDCouplingSkyLineArray::groupPacks(const DataArrayIdType *indexedPacks) const
 {
   indexedPacks->checkAllocated();
index b4f0d25092c55204a3153d2b048ed4101f31d10d..e2dca0b59fa93520b08d6c345e98642571c59110 100644 (file)
@@ -108,6 +108,8 @@ namespace MEDCoupling
 
     std::string simpleRepr() const;
 
+    void thresholdPerPack(mcIdType threshold, MCAuto<MEDCouplingSkyLineArray>& left, MCAuto<MEDCouplingSkyLineArray>& right) const;
+
     MEDCouplingSkyLineArray *groupPacks(const DataArrayIdType *indexedPacks) const;
     MEDCouplingSkyLineArray *uniqueNotSortedByPack() const;
     static MEDCouplingSkyLineArray *AggregatePacks(const std::vector<const MEDCouplingSkyLineArray *>& sks);
index a0c376146b4b964fd2e82affe620a6d185fc56a1..69e5f13fd1b83071adac9bfc04f4704806225d56 100644 (file)
@@ -875,6 +875,16 @@ class MEDCouplingBasicsTest7(unittest.TestCase):
         self.assertTrue(a)
         self.assertTrue(b.isEqual(DataArrayInt([2,2,2,6,6,2,6,10,10])))
 
+    def testSkyLineArrayThreshold(self):
+        x = DataArrayInt([0, 1, 2, 11, 12, 13, 3, 4, 5, 6, 14, 15, 16, 17, 9, 10, 18, 19])
+        xi = DataArrayInt([0, 6, 14, 18])
+        sk = MEDCouplingSkyLineArray(xi,x)
+        lsk,rsk = sk.thresholdPerPack(11)
+        self.assertTrue(lsk.getValuesArray().isEqual(DataArrayInt([0, 1, 2, 3, 4, 5, 6, 9, 10])))
+        self.assertTrue(lsk.getIndexArray().isEqual(DataArrayInt([0, 3, 7, 9])))
+        self.assertTrue(rsk.getValuesArray().isEqual(DataArrayInt([11, 12, 13, 14, 15, 16, 17, 18, 19])))
+        self.assertTrue(rsk.getIndexArray().isEqual(DataArrayInt([0, 3, 7, 9])))
+
     pass
 
 if __name__ == '__main__':
index 5aedce0e347c385a7519cb99097790f439409566..38f2d0f3c1737744b4c5c0ba25823eab4c757714 100644 (file)
@@ -1420,6 +1420,16 @@ namespace MEDCoupling
            PyTuple_SetItem(ret,1,SWIG_NewPointerObj(SWIG_as_voidptr(d1.retn()),SWIGTITraits<mcIdType>::TI, SWIG_POINTER_OWN | 0 ));
            return ret;
          } 
+
+      PyObject *thresholdPerPack(mcIdType threshold) const
+      {
+        MCAuto<MEDCouplingSkyLineArray> left, right;
+        self->thresholdPerPack(threshold,left,right);
+        PyObject *ret=PyTuple_New(2);
+        PyTuple_SetItem(ret,0,SWIG_NewPointerObj(SWIG_as_voidptr(left.retn()),SWIGTYPE_p_MEDCoupling__MEDCouplingSkyLineArray, SWIG_POINTER_OWN | 0 ));
+        PyTuple_SetItem(ret,1,SWIG_NewPointerObj(SWIG_as_voidptr(right.retn()),SWIGTYPE_p_MEDCoupling__MEDCouplingSkyLineArray, SWIG_POINTER_OWN | 0 ));
+        return ret;
+      }
     }
   };
 }