Version: 9.12.0
CalciumCouplingPolicy.hxx
Go to the documentation of this file.
1 // Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 
23 // File : CalciumCouplingPolicy.hxx
24 // Author : Eric Fayolle (EDF)
25 // Module : KERNEL
26 // Id : $Id$
27 //
28 #ifndef __CALCIUM_COUPLING_POLICY__
29 #define __CALCIUM_COUPLING_POLICY__
30 
31 #include <vector>
32 #include <map>
33 
34 #include "DisplayPair.hxx"
35 #include "CouplingPolicy.hxx"
36 #include "AdjacentFunctor.hxx"
37 #include <boost/lambda/lambda.hpp>
38 #include <boost/utility/enable_if.hpp>
39 #include <boost/type_traits/is_arithmetic.hpp>
40 #include "CalciumTypes.hxx"
41 #include "CalciumException.hxx"
42 
43 
45 
46 
47 public:
48 
49  template <typename T_TIME, typename T_TAG > class InternalDataIdContainer;
50  template <typename T_TIME, typename T_TAG > friend class InternalDataIdContainer;
51  template <typename DataManipulator,
52  class EnableIf > friend class BoundedDataIdProcessor;
53  template <typename DataManipulator > friend class EraseDataIdProcessor;
54  template <typename DataManipulator > friend class EraseDataIdBeforeOrAfterTagProcessor;
55  template <typename DataManipulator > friend class DisconnectProcessor;
56 
62 
63 private:
64 
66  size_t _storageLevel;
70  double _alpha;
71  double _deltaT;
73 
74 public:
76 
79 
80  void setStorageLevel (size_t storageLevel);
81  size_t getStorageLevel () const;
82 
85 
86  void setAlpha(double alpha);
87  double getAlpha() const ;
88 
89  void setDeltaT(double deltaT );
90  double getDeltaT() const ;
91 
96 
97  // Classe DataId rassemblant les paramètres de la méthode PORT::put
98  // qui identifient l'instance d'une donnée pour Calcium
99  // Rem : Le DataId doit pouvoir être une key dans une map stl
100  typedef double TimeType;
101  typedef long TagType;
102  typedef std::pair< TimeType , TagType > DataId;
104  typedef std::vector< DataId >::iterator iterator;
105 
106  template <typename T_TIME, typename T_TAG >
108 
109  inline TimeType getTime(const DataId &dataId) const { return dataId.first;}
110  inline TagType getTag (const DataId &dataId) const { return dataId.second;}
111 
112  template <typename DataManipulator,
113  class EnableIf = void > struct BoundedDataIdProcessor;
114  //template <typename DataManipulator> struct BoundedDataIdProcessor;
115  template <typename DataManipulator> struct EraseDataIdProcessor;
116  template <typename DataManipulator> struct EraseDataIdBeforeOrAfterTagProcessor;
117  template <typename DataManipulator> struct DisconnectProcessor;
118 
119  // Renvoie isEqual si le dataId attendu est trouvé dans storedDataIds :
120  // - l'itérateur wDataIt1 pointe alors sur ce dataId
121  // Renvoie isBounded si le dataId attendu n'est pas trouvé mais encadrable et
122  // que la politique de couplage gére ce cas de figure
123  // - l'itérateur wDataIt1 est tel que wDataIt1->first < wdataId < (wDataIt1+1)->first
124  // Le container doit être associatif
125  template < typename AssocContainer >
126  bool isDataIdConveniant( AssocContainer & storedDatas,
127  const typename AssocContainer::key_type & expectedDataId,
128  bool & isEqual, bool & isBounded,
129  typename AssocContainer::iterator & wDataIt1) const;
130 
132 
133  void disconnect(bool provideLastGivenValue);
134 
135 }; //Fin de CalciumCouplingPolicy
136 
137 
138 
139 //************* DEFINITION DES METHODES ET OBJETS TEMPLATES *************//
140 
141 
142 
143 // Définition du container de DataId pour répondre au concept
144 // de mode de couplage
145 template <typename T_TIME, typename T_TAG >
146 struct CalciumCouplingPolicy::InternalDataIdContainer : public std::vector< std::pair< T_TIME,T_TAG> > {
147  typedef std::vector < DataId > DataIdVect;
148 
150  const CalciumCouplingPolicy & policy
151  ):std::vector< std::pair< T_TIME,T_TAG> >() {
152  // Ignore les paramètres qui ne sont pas en rapport avec le type de dépendance
153  switch (policy._dependencyType) {
155  this->push_back(DataId(dataId.first,0));
156  break;
158  this->push_back(DataId(0,dataId.second));
159  break;
160  default:
161  throw(CalciumException(CalciumTypes::CPIT,LOC("The dependency type must be set by setDependencyType before calling DataIdContainer contructor")));
162  break;
163  }
164  };
165 };
166 
167 
168 template <typename DataManipulator, class EnableIf >
170  BoundedDataIdProcessor(const CouplingPolicy & /*couplingPolicy*/) {};
171  template < typename Iterator, typename DataId >
172  void inline apply(typename iterator_t<Iterator>::value_type & /*data*/,
173  const DataId & /*dataId*/,
174  const Iterator & /*it1*/) const {
175  typedef typename iterator_t<Iterator>::value_type value_type;
177  std::cout << "-------- Calcium Generic BoundedDataIdProcessor.apply() called " << std::endl;
178  }
179 };
180 
181 
182 template <typename DataManipulator >
184  DataManipulator,
185  typename boost::enable_if< boost::is_float< typename DataManipulator::InnerType> >::type > {
186 
188 
190  _couplingPolicy(couplingPolicy) {};
191 
192  // Méthode implémentant l'interpolation temporelle
193  template < typename MapIterator >
194  void inline apply (typename iterator_t<MapIterator>::value_type & data,
195  const DataId & dataId, const MapIterator & it1) const {
196 
197  typedef typename iterator_t<MapIterator>::value_type value_type;
198  typedef typename DataManipulator::InnerType InnerType;
199  typedef typename DataManipulator::Type Type;
200 
201  MapIterator it2=it1; ++it2;
202  size_t dataSize1 = DataManipulator::size(it1->second);
203 
205  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Taille de donnée dataId1 : " << dataSize1 << std::endl;
206 
207  // Gérer dans calcium la limite de la taille du buffer donnée par
208  // l'utilisateur.
209  size_t dataSize2 = DataManipulator::size(it2->second);
210 
212  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Taille de donnée dataId2 : " << dataSize2 << std::endl;
213 
214  size_t dataSize = std::min< size_t >( dataSize1, dataSize2 );
215  DataId dataId2 = it2->first;
216  DataId dataId1 = it1->first;
217  TimeType t2 = dataId2.first;
218  TimeType t1 = dataId1.first;
219 
221  {
222  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de t1 : " << t1 << std::endl;
223  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de t2 : " << t2 << std::endl;
224  }
225 
226  TimeType t = dataId.first;
228  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de t : " << t << std::endl;
229 
230  TimeType timeDiff = t2-t1;
232  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de timeDiff : " << timeDiff << std::endl;
233 
234  TimeType coeff = (t2-t)/timeDiff;
236  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Valeur de coeff : " << coeff << std::endl;
237 
238  InnerType const * const InIt1 = DataManipulator::getPointer(it1->second);
240  {
241  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Données à t1 : " << std::endl;
242  std::copy(InIt1,InIt1+dataSize1,std::ostream_iterator<InnerType>(std::cout," "));
243  std::cout << std::endl;
244  }
245 
246  InnerType const * const InIt2 = DataManipulator::getPointer(it2->second);
248  {
249  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Données à t2 : " << std::endl;
250  std::copy(InIt2,InIt2+dataSize2,std::ostream_iterator<InnerType>(std::cout," "));
251  std::cout << std::endl;
252  }
253  Type dataOut = DataManipulator::create(dataSize);
254  InnerType * const OutIt = DataManipulator::getPointer(dataOut);
255 
257  {
258  std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : interpolationSchem : " << _couplingPolicy._interpolationSchem << std::endl;
259  std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : alpha : " << _couplingPolicy._alpha << std::endl;
260  std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : datecalschem : " << _couplingPolicy._dateCalSchem << std::endl;
261  std::cerr << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : storageLevel : " << _couplingPolicy._storageLevel << std::endl;
262  }
263 
264  if ( timeDiff == 0.0 || _couplingPolicy._interpolationSchem == CalciumTypes::L0_SCHEM ) {
265  std::copy(InIt1,InIt1+dataSize,OutIt);
266  } else {
267 
268  boost::lambda::placeholder1_type _1;
269  boost::lambda::placeholder2_type _2;
270  // OLD: REM : Pour des buffers de type int
271  // OLD: le compilo indiquera warning: converting to `long int' from `Double'
272  std::transform(InIt1,InIt1+dataSize,InIt2,OutIt,
273  ( _1 - _2 ) * coeff + _2 );
274 // for(size_t i =0; i < dataSize3; ++i) {
275 // OutIt[i]=(InIt1[i] - InIt2[i]) * coeff + InIt2[i];
276 // }
277 
278  }
279 
281  {
282  std::cout << "-------- CalciumCouplingPolicy::BoundedDataIdProcessor : Données calculées à t : " << std::endl;
283  std::copy(OutIt,OutIt+dataSize,std::ostream_iterator<InnerType>(std::cout," "));
284  std::cout << std::endl;
285  }
286  data = dataOut;
287 
288  }
289 };
290 
291 // Renvoie isEqual si le dataId attendu est trouvé dans storedDataIds :
292 // - l'itérateur wDataIt1 pointe alors sur ce dataId
293 // Renvoie isBounded si le dataId attendu n'est pas trouvé mais encadrable et
294 // que la politique de couplage gére ce cas de figure
295 // - l'itérateur wDataIt1 est tel que wDataIt1->first < wdataId < (wDataIt1+1)->first
296 // Le container doit être associatif
297 template < typename AssocContainer >
298 bool CalciumCouplingPolicy::isDataIdConveniant( AssocContainer & storedDatas, const typename AssocContainer::key_type & expectedDataId,
299  bool & isEqual, bool & isBounded, typename AssocContainer::iterator & wDataIt1) const {
300 
301  // Rem : le type key_type == DataId
302  typedef typename AssocContainer::key_type key_type;
303  AdjacentFunctor< key_type > af(expectedDataId);
305  {
307  {
308  std::cout << "-------- time expected : " << expectedDataId.first << std::endl;
309  std::cout << "-------- time expected corrected : " << expectedDataId.first*(1.0-_deltaT) << std::endl;
310  }
311 
312  af.setMaxValue(key_type(expectedDataId.first*(1.0-_deltaT),0));
313  }
314  isBounded = false;
315 
316  // Rem 1 :
317  // L'algo adjacent_find ne peut être utilisé avec l'AdjacentPredicate
318  // - si la table contient un seul élément l'algorithme adjacent_find retourne end()
319  // que se soit l'élément attendu ou non
320  // - si la table contient deux éléments dont le dernier est celui recherché // l'algorithme adjacent_find retourne end() aussi // d'ou la necessité d'effectuer un find avant ou d'écrire un algorithme ad hoc // Rem 2 : // // L'algo find_if ne peut être utilisé car il recopie l'AdjacentFunctor // qui ne peut alors pas mémoriser ses états précédents // // Un codage en reverse serait plus efficace typename AssocContainer::iterator prev = storedDatas.begin(); typename AssocContainer::iterator current = prev; while ( (current != storedDatas.end()) && !af(current->first) ) { if (SALOME::VerbosityActivated()) { std::cerr << "------- stored time : " << current->first << std::endl; } // if ( af(current->first) ) break; prev = current++; } isEqual = af.isEqual(); // On considère qu'il n'est pas possible d'encadrer en dépendance itérative, // on se veut pas calculer d'interpolation. if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY) isBounded = af.isBounded(); if ( isEqual ) wDataIt1 = current; else if (isBounded) wDataIt1 = prev; else wDataIt1 = storedDatas.end(); if (SALOME::VerbosityActivated()) std::cout << "-------- isDataIdConvenient : isEqual : " << isEqual << " , isBounded " << isBounded << std::endl; return isEqual || isBounded; } //Remove DataId before or after a given time or tag template < typename DataManipulator > struct CalciumCouplingPolicy::EraseDataIdBeforeOrAfterTagProcessor { CalciumCouplingPolicy &_couplingPolicy; EraseDataIdBeforeOrAfterTagProcessor(CalciumCouplingPolicy &couplingPolicy): _couplingPolicy(couplingPolicy) {}; template < typename Container,typename TimeType,typename TagType > void apply(Container & storedDatas, TimeType time, TagType tag, bool before) const { typedef typename Container::iterator iterator; typedef typename Container::reverse_iterator riterator; if(_couplingPolicy._dependencyType == CalciumTypes::TIME_DEPENDENCY) { if(before) { iterator it=storedDatas.begin(); while(it != storedDatas.end() && it->first.first <= time) { DataManipulator::delete_data(it->second); storedDatas.erase(it); it=storedDatas.begin(); } } else { riterator it=storedDatas.rbegin(); while(it != storedDatas.rend() && it->first.first >= time) { DataManipulator::delete_data(it->second); storedDatas.erase(it->first); it=storedDatas.rbegin(); } } } else { if(before) { iterator it=storedDatas.begin(); while(it != storedDatas.end() && it->first.second <= tag) { DataManipulator::delete_data(it->second); storedDatas.erase(it); it=storedDatas.begin(); } } else { riterator it=storedDatas.rbegin(); while(it != storedDatas.rend() && it->first.second >= tag) { DataManipulator::delete_data(it->second); storedDatas.erase(it->first); it=storedDatas.rbegin(); } } } } }; // TODO :PAS ENCORE TESTE AVEC UN NIVEAU POSITIONNE // Supprime les DataId et les données associées // du container associatif quand le nombre // de données stockées dépasse le niveau CALCIUM. // Cette méthode est appelée de GenericPort::get et GenericPort::next // TODO : Elle devrait également être appelée dans GenericPort::Put // mais il faut étudier les interactions avec GenericPort::Get et GenericPort::next template < typename DataManipulator > struct CalciumCouplingPolicy::EraseDataIdProcessor { CalciumCouplingPolicy &_couplingPolicy; EraseDataIdProcessor(CalciumCouplingPolicy &couplingPolicy): _couplingPolicy(couplingPolicy) {}; template < typename Container > void apply(Container & storedDatas, typename Container::iterator & wDataIt1 ) const { typedef typename Container::key_type key_type; typedef typename Container::value_type value_type; typedef typename Container::iterator iterator; if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::eraseDataId, storedDatasSize : " << storedDatas.size() << std::endl; if ( _couplingPolicy._storageLevel == (size_t)CalciumTypes::UNLIMITED_STORAGE_LEVEL ) return; size_t storedDatasSize = storedDatas.size(); long s = storedDatasSize - _couplingPolicy._storageLevel; if (s > 0 ) { size_t dist=distance(storedDatas.begin(),wDataIt1); for (int i=0; i<s; ++i) { //no bug if removed : DataManipulator::delete_data((*storedDatas.begin()).second); DataManipulator::delete_data((*storedDatas.begin()).second); storedDatas.erase(storedDatas.begin()); } // Si l'itérateur pointait sur une valeur que l'on vient de supprimer if (dist < (size_t)s ) { throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "StorageLevel management " << _couplingPolicy._storageLevel << " has just removed the data to send"))); } } if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::eraseDataId, new storedDatasSize : " << storedDatas.size() << std::endl; return; } }; // Lorsque cette méthode est appelée depuis GenericPort::Get // l'expectedDataId n'a pas été trouvé et n'est pas non plus // encadré (en mode temporel). // Si apply n'effectue pas de traitement particulier la méthode renvoie false // Si le port a déjà reçu une directive de deconnexion STOP une exception est levée // Si le port a déjà reçu une directive de deconnexion CONTINUE, // on donne la dernière valeur connu et on renvoie true. template < typename DataManipulator > struct CalciumCouplingPolicy::DisconnectProcessor { const CalciumCouplingPolicy & _couplingPolicy; DisconnectProcessor(const CalciumCouplingPolicy & couplingPolicy): _couplingPolicy(couplingPolicy) {}; template < typename Container, typename DataId > bool apply(Container & storedDatas, const DataId & expectedDataId, typename Container::iterator & wDataIt1 ) const { typedef typename Container::key_type key_type; typedef typename Container::value_type value_type; typedef typename Container::iterator iterator; // Pas de traitement particulier a effectuer if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK1 ("<< _couplingPolicy._disconnectDirective<<") --------" << std::endl; if ( (_couplingPolicy._disconnectDirective) == (CalciumTypes::UNDEFINED_DIRECTIVE) ) return false; if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK2 --------" << std::endl; // TODO : Ds GenericPort::next il faut convertir en CPSTOPSEQ if ( _couplingPolicy._disconnectDirective == CalciumTypes::CP_ARRET ) throw(CalciumException(CalciumTypes::CPINARRET,LOC(OSS()<< "CP_ARRET directive" << " interrupts all further data reading"))); if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK3 --------" << std::endl; // S'il n'y a plus de données indique que l'on a pas pu effectuer de traitement // TODO : Dans la gestion des niveaux il faut peut être interdire un niveau == 0 if ( storedDatas.empty() ) throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "CP_CONT directive" << " is active but no data is available."))); // expectedDataId n'a ni été trouvé dans storedDataIds ni encadré mais il se peut // qu'en mode itératif il ne soit pas plus grand que le plus grand DataId stocké auquel // cas on doit renvoyer une expection car on n'est plus connecté et on ne pourra jamais // fournir de données pour ce dataId. if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK4 " << expectedDataId <<" --------" << std::endl; // >= expectedDataId iterator it1 = storedDatas.lower_bound(expectedDataId); if (SALOME::VerbosityActivated()) { std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK5 " << std::endl; for (iterator it=storedDatas.begin(); it!=storedDatas.end(); ++it) std::cout << " " << (*it).first; std::cout << std::endl; } // TODO : Il faut en fait renvoyer le plus proche cf IT ou DT if (it1 == storedDatas.end()) throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "CP_CONT directive" << " is active but the requested dataId is less or equal to the last one received."))); if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK6 " << std::endl; wDataIt1 = storedDatas.end(); --wDataIt1; if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor, CP_CONT : " << (*wDataIt1).first << std::endl; return true; } }; #endif
321  // l'algorithme adjacent_find retourne end() aussi
322  // d'ou la necessité d'effectuer un find avant ou d'écrire un algorithme ad hoc
323 
324  // Rem 2 :
325  //
326  // L'algo find_if ne peut être utilisé car il recopie l'AdjacentFunctor
327  // qui ne peut alors pas mémoriser ses états précédents
328  //
329 
330  // Un codage en reverse serait plus efficace
331  typename AssocContainer::iterator prev = storedDatas.begin();
332  typename AssocContainer::iterator current = prev;
333  while ( (current != storedDatas.end()) && !af(current->first) )
334  {
336  {
337  std::cerr << "------- stored time : " << current->first << std::endl;
338  }
339 
340  // if ( af(current->first) ) break;
341  prev = current++;
342  }
343 
344  isEqual = af.isEqual();
345 
346  // On considère qu'il n'est pas possible d'encadrer en dépendance itérative,
347  // on se veut pas calculer d'interpolation.
348  if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY) isBounded = af.isBounded();
349 
350  if ( isEqual ) wDataIt1 = current;
351  else
352  if (isBounded) wDataIt1 = prev;
353  else
354  wDataIt1 = storedDatas.end();
355 
357  std::cout << "-------- isDataIdConvenient : isEqual : " << isEqual << " , isBounded " << isBounded << std::endl;
358 
359  return isEqual || isBounded;
360 }
361 
362 //Remove DataId before or after a given time or tag
363 template < typename DataManipulator >
365 {
367 
369  _couplingPolicy(couplingPolicy) {};
370 
371  template < typename Container,typename TimeType,typename TagType >
372  void apply(Container & storedDatas, TimeType time, TagType tag, bool before) const
373  {
374  typedef typename Container::iterator iterator;
375  typedef typename Container::reverse_iterator riterator;
376 
378  {
379  if(before)
380  {
381  iterator it=storedDatas.begin();
382  while(it != storedDatas.end() && it->first.first <= time)
383  {
384  DataManipulator::delete_data(it->second);
385  storedDatas.erase(it);
386  it=storedDatas.begin();
387  }
388  }
389  else
390  {
391  riterator it=storedDatas.rbegin();
392  while(it != storedDatas.rend() && it->first.first >= time)
393  {
394  DataManipulator::delete_data(it->second);
395  storedDatas.erase(it->first);
396  it=storedDatas.rbegin();
397  }
398  }
399  }
400  else
401  {
402  if(before)
403  {
404  iterator it=storedDatas.begin();
405  while(it != storedDatas.end() && it->first.second <= tag)
406  {
407  DataManipulator::delete_data(it->second);
408  storedDatas.erase(it);
409  it=storedDatas.begin();
410  }
411  }
412  else
413  {
414  riterator it=storedDatas.rbegin();
415  while(it != storedDatas.rend() && it->first.second >= tag)
416  {
417  DataManipulator::delete_data(it->second);
418  storedDatas.erase(it->first);
419  it=storedDatas.rbegin();
420  }
421  }
422  }
423  }
424 };
425 
426 // TODO :PAS ENCORE TESTE AVEC UN NIVEAU POSITIONNE
427 // Supprime les DataId et les données associées
428 // du container associatif quand le nombre
429 // de données stockées dépasse le niveau CALCIUM.
430 // Cette méthode est appelée de GenericPort::get et GenericPort::next
431 // TODO : Elle devrait également être appelée dans GenericPort::Put
432 // mais il faut étudier les interactions avec GenericPort::Get et GenericPort::next
433 template < typename DataManipulator >
435 
437 
439  _couplingPolicy(couplingPolicy) {};
440 
441  template < typename Container >
442  void apply(Container & storedDatas,
443  typename Container::iterator & wDataIt1 ) const {
444 
445  typedef typename Container::key_type key_type;
446  typedef typename Container::value_type value_type;
447  typedef typename Container::iterator iterator;
448 
450  std::cout << "-------- CalciumCouplingPolicy::eraseDataId, storedDatasSize : " << storedDatas.size() << std::endl;
451 
453 
454  size_t storedDatasSize = storedDatas.size();
455  long s = storedDatasSize - _couplingPolicy._storageLevel;
456  if (s > 0 ) {
457  size_t dist=distance(storedDatas.begin(),wDataIt1);
458  for (int i=0; i<s; ++i) {
459  //no bug if removed : DataManipulator::delete_data((*storedDatas.begin()).second);
460  DataManipulator::delete_data((*storedDatas.begin()).second);
461  storedDatas.erase(storedDatas.begin());
462  }
463  // Si l'itérateur pointait sur une valeur que l'on vient de supprimer
464  if (dist < (size_t)s ) {
465  throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "StorageLevel management "
467  " has just removed the data to send")));
468  }
469  }
470 
472  std::cout << "-------- CalciumCouplingPolicy::eraseDataId, new storedDatasSize : " << storedDatas.size() << std::endl;
473 
474  return;
475 
476  }
477 };
478 
479 
480 // Lorsque cette méthode est appelée depuis GenericPort::Get
481 // l'expectedDataId n'a pas été trouvé et n'est pas non plus
482 // encadré (en mode temporel).
483 // Si apply n'effectue pas de traitement particulier la méthode renvoie false
484 // Si le port a déjà reçu une directive de deconnexion STOP une exception est levée
485 // Si le port a déjà reçu une directive de deconnexion CONTINUE,
486 // on donne la dernière valeur connu et on renvoie true.
487 template < typename DataManipulator >
489 
491 
493  _couplingPolicy(couplingPolicy) {};
494 
495  template < typename Container, typename DataId >
496  bool apply(Container & storedDatas,
497  const DataId & expectedDataId,
498  typename Container::iterator & wDataIt1 ) const {
499 
500  typedef typename Container::key_type key_type;
501  typedef typename Container::value_type value_type;
502  typedef typename Container::iterator iterator;
503 
504  // Pas de traitement particulier a effectuer
506  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK1 ("<< _couplingPolicy._disconnectDirective<<") --------" << std::endl;
507 
509 
511  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK2 --------" << std::endl;
512 
513  // TODO : Ds GenericPort::next il faut convertir en CPSTOPSEQ
515  throw(CalciumException(CalciumTypes::CPINARRET,LOC(OSS()<< "CP_ARRET directive"
516  << " interrupts all further data reading")));
518  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK3 --------" << std::endl;
519 
520  // S'il n'y a plus de données indique que l'on a pas pu effectuer de traitement
521  // TODO : Dans la gestion des niveaux il faut peut être interdire un niveau == 0
522  if ( storedDatas.empty() )
523  throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "CP_CONT directive"
524  << " is active but no data is available.")));
525 
526  // expectedDataId n'a ni été trouvé dans storedDataIds ni encadré mais il se peut
527  // qu'en mode itératif il ne soit pas plus grand que le plus grand DataId stocké auquel
528  // cas on doit renvoyer une expection car on n'est plus connecté et on ne pourra jamais
529  // fournir de données pour ce dataId.
531  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK4 " << expectedDataId <<" --------" << std::endl;
532 
533  // >= expectedDataId
534  iterator it1 = storedDatas.lower_bound(expectedDataId);
536  {
537  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK5 " << std::endl;
538  for (iterator it=storedDatas.begin(); it!=storedDatas.end(); ++it)
539  std::cout << " " << (*it).first;
540 
541  std::cout << std::endl;
542  }
543 
544  // TODO : Il faut en fait renvoyer le plus proche cf IT ou DT
545  if (it1 == storedDatas.end())
546  throw(CalciumException(CalciumTypes::CPNTNULL,LOC(OSS()<< "CP_CONT directive"
547  << " is active but the requested dataId is less or equal to the last one received.")));
548 
550  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor MARK6 " << std::endl;
551 
552  wDataIt1 = storedDatas.end();
553  --wDataIt1;
554 
556  std::cout << "-------- CalciumCouplingPolicy::DisconnectProcessor, CP_CONT : " << (*wDataIt1).first << std::endl;
557 
558  return true;
559  }
560 };
561 
562 #endif
const EXTRAPOLATION_SCHEM extrapolationSchem
Definition: CorbaTypes2CalciumTypes.cxx:146
const DATE_CAL_SCHEM dateCalSchem
Definition: CorbaTypes2CalciumTypes.cxx:54
const DEPENDENCY_TYPE dependencyType
Definition: CorbaTypes2CalciumTypes.cxx:88
const INTERPOLATION_SCHEM interpolationSchem
Definition: CorbaTypes2CalciumTypes.cxx:117
#define LOC(message)
Definition: DSC_Exception.hxx:55
Definition: CalciumCouplingPolicy.hxx:146
std::vector< DataId > DataIdVect
Definition: CalciumCouplingPolicy.hxx:147
InternalDataIdContainer(const DataId &dataId, const CalciumCouplingPolicy &policy)
Definition: CalciumCouplingPolicy.hxx:149
Definition: CalciumCouplingPolicy.hxx:44
CalciumTypes::DisconnectDirective DisconnectDirective
Definition: CalciumCouplingPolicy.hxx:61
void setExtrapolationSchem(ExtrapolationSchem extrapolationSchem)
Definition: CalciumCouplingPolicy.cxx:85
CalciumTypes::ExtrapolationSchem ExtrapolationSchem
Definition: CalciumCouplingPolicy.hxx:60
void setInterpolationSchem(InterpolationSchem interpolationSchem)
Definition: CalciumCouplingPolicy.cxx:78
std::pair< TimeType, TagType > DataId
Definition: CalciumCouplingPolicy.hxx:102
double TimeType
Definition: CalciumCouplingPolicy.hxx:100
TagType getTag(const DataId &dataId) const
Definition: CalciumCouplingPolicy.hxx:110
InterpolationSchem _interpolationSchem
Definition: CalciumCouplingPolicy.hxx:68
long TagType
Definition: CalciumCouplingPolicy.hxx:101
CalciumTypes::DateCalSchem DateCalSchem
Definition: CalciumCouplingPolicy.hxx:58
void disconnect(bool provideLastGivenValue)
Definition: CalciumCouplingPolicy.cxx:105
friend class BoundedDataIdProcessor
Definition: CalciumCouplingPolicy.hxx:52
friend class EraseDataIdBeforeOrAfterTagProcessor
Definition: CalciumCouplingPolicy.hxx:54
friend class DisconnectProcessor
Definition: CalciumCouplingPolicy.hxx:55
void setStorageLevel(size_t storageLevel)
Definition: CalciumCouplingPolicy.cxx:41
std::vector< DataId >::iterator iterator
Definition: CalciumCouplingPolicy.hxx:104
DependencyType getDependencyType() const
Definition: CalciumCouplingPolicy.cxx:39
void setDependencyType(DependencyType dependencyType)
Definition: CalciumCouplingPolicy.cxx:38
double getAlpha() const
Definition: CalciumCouplingPolicy.cxx:67
double getDeltaT() const
Definition: CalciumCouplingPolicy.cxx:76
bool isDataIdConveniant(AssocContainer &storedDatas, const typename AssocContainer::key_type &expectedDataId, bool &isEqual, bool &isBounded, typename AssocContainer::iterator &wDataIt1) const
Definition: CalciumCouplingPolicy.hxx:298
ExtrapolationSchem _extrapolationSchem
Definition: CalciumCouplingPolicy.hxx:69
size_t _storageLevel
Definition: CalciumCouplingPolicy.hxx:66
InternalDataIdContainer< TimeType, TagType > DataIdContainer
Definition: CalciumCouplingPolicy.hxx:103
CalciumTypes::InterpolationSchem InterpolationSchem
Definition: CalciumCouplingPolicy.hxx:59
DependencyType _dependencyType
Definition: CalciumCouplingPolicy.hxx:65
ExtrapolationSchem getExtrapolationSchem() const
Definition: CalciumCouplingPolicy.cxx:92
InterpolationSchem getInterpolationSchem() const
Definition: CalciumCouplingPolicy.cxx:91
TimeType getTime(const DataId &dataId) const
Definition: CalciumCouplingPolicy.hxx:109
void setDateCalSchem(DateCalSchem dateCalSchem)
Definition: CalciumCouplingPolicy.cxx:48
double _alpha
Definition: CalciumCouplingPolicy.hxx:70
void setDeltaT(double deltaT)
Definition: CalciumCouplingPolicy.cxx:69
DateCalSchem _dateCalSchem
Definition: CalciumCouplingPolicy.hxx:67
CalciumTypes::DependencyType DependencyType
Definition: CalciumCouplingPolicy.hxx:57
double _deltaT
Definition: CalciumCouplingPolicy.hxx:71
TimeType getEffectiveTime(TimeType ti, TimeType tf)
Definition: CalciumCouplingPolicy.cxx:96
CalciumCouplingPolicy()
Definition: CalciumCouplingPolicy.cxx:30
DateCalSchem getDateCalSchem() const
Definition: CalciumCouplingPolicy.cxx:55
size_t getStorageLevel() const
Definition: CalciumCouplingPolicy.cxx:47
DisconnectDirective _disconnectDirective
Definition: CalciumCouplingPolicy.hxx:72
void setAlpha(double alpha)
Definition: CalciumCouplingPolicy.cxx:57
friend class EraseDataIdProcessor
Definition: CalciumCouplingPolicy.hxx:53
Definition: CouplingPolicy.hxx:65
Class OSS is useful when streaming data through a function that expect a string as parameter.
Definition: DSC_Exception.hxx:65
DisconnectDirective
Definition: CalciumTypes.hxx:76
@ UNDEFINED_DIRECTIVE
Definition: CalciumTypes.hxx:76
const int CPINARRET
Definition: CalciumTypes.hxx:186
const int CP_ARRET
Definition: CalciumTypes.hxx:48
DependencyType
Definition: CalciumTypes.hxx:68
@ ITERATION_DEPENDENCY
Definition: CalciumTypes.hxx:69
@ TIME_DEPENDENCY
Definition: CalciumTypes.hxx:68
const int UNLIMITED_STORAGE_LEVEL
Definition: CalciumTypes.hxx:67
const int CPIT
Definition: CalciumTypes.hxx:44
ExtrapolationSchem
Definition: CalciumTypes.hxx:75
InterpolationSchem
Definition: CalciumTypes.hxx:74
@ L0_SCHEM
Definition: CalciumTypes.hxx:74
DateCalSchem
Definition: CalciumTypes.hxx:73
const int CPNTNULL
Definition: CalciumTypes.hxx:127
bool VerbosityActivated()
Called by any log message macros to decide about log output in Release and Debug mode dynamically rel...
Definition: libSALOMELog.cxx:48
def copy(src, dst)
Definition: pythonpath_reduction.py:35
Definition: AdjacentFunctor.hxx:40
bool isEqual() const
Definition: AdjacentFunctor.hxx:106
void setMaxValue(const T &value)
Definition: AdjacentFunctor.hxx:105
bool isBounded() const
Definition: AdjacentFunctor.hxx:107
void apply(typename iterator_t< MapIterator >::value_type &data, const DataId &dataId, const MapIterator &it1) const
Definition: CalciumCouplingPolicy.hxx:194
Definition: CalciumCouplingPolicy.hxx:169
void apply(typename iterator_t< Iterator >::value_type &, const DataId &, const Iterator &) const
Definition: CalciumCouplingPolicy.hxx:172
BoundedDataIdProcessor(const CouplingPolicy &)
Definition: CalciumCouplingPolicy.hxx:170
Definition: CalciumCouplingPolicy.hxx:488
const CalciumCouplingPolicy & _couplingPolicy
Definition: CalciumCouplingPolicy.hxx:490
bool apply(Container &storedDatas, const DataId &expectedDataId, typename Container::iterator &wDataIt1) const
Definition: CalciumCouplingPolicy.hxx:496
DisconnectProcessor(const CalciumCouplingPolicy &couplingPolicy)
Definition: CalciumCouplingPolicy.hxx:492
Definition: CalciumCouplingPolicy.hxx:365
void apply(Container &storedDatas, TimeType time, TagType tag, bool before) const
Definition: CalciumCouplingPolicy.hxx:372
CalciumCouplingPolicy & _couplingPolicy
Definition: CalciumCouplingPolicy.hxx:366
EraseDataIdBeforeOrAfterTagProcessor(CalciumCouplingPolicy &couplingPolicy)
Definition: CalciumCouplingPolicy.hxx:368
Definition: CalciumCouplingPolicy.hxx:434
void apply(Container &storedDatas, typename Container::iterator &wDataIt1) const
Definition: CalciumCouplingPolicy.hxx:442
EraseDataIdProcessor(CalciumCouplingPolicy &couplingPolicy)
Definition: CalciumCouplingPolicy.hxx:438
CalciumCouplingPolicy & _couplingPolicy
Definition: CalciumCouplingPolicy.hxx:436
Definition: CalciumException.hxx:38
value_type1::second_type value_type
Definition: IteratorTraits.hxx:38
int TimeType
Definition: testAdjacentPredicate.cxx:52