SlowDown Algorithmic Regularization (SDAR)
Algorithmic Regularization with slowdown method for integrating few-body motions
list.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Common/Float.h"
4 
5 namespace COMM {
6 
8 
13  enum class ListMode {copy, local, link ,none};
14 
16 
18  template <class Ttype>
19  class List{
20  protected:
21  int num_;
22  int nmax_;
23  Ttype* data_;
24  Ttype** adr_;
26 
27  //flag
29  public:
30 
32 
34  List(): num_(0), nmax_(0), data_(NULL), adr_(NULL), mode_(ListMode::none), modified_flag_(false) {};
35 
37 
39  void setMode(const ListMode _mode) {
40  ASSERT(mode_==ListMode::none);
41  mode_ = _mode;
42  }
43 
45 
48  void reserveMem(const int _nmax) {
49  ASSERT(nmax_==0);
50  ASSERT(_nmax>0);
51  ASSERT(adr_==NULL);
52  ASSERT(data_==NULL);
53  ASSERT(mode_!=ListMode::none);
54 
55  switch(mode_) {
56  case ListMode::copy:
57  data_=new Ttype[_nmax];
58  adr_=new Ttype*[_nmax];
59  nmax_ = _nmax;
60  break;
61  case ListMode::local:
62  data_=new Ttype[_nmax];
63  nmax_ = _nmax;
64  break;
65  case ListMode::link:
66  break;
67  case ListMode::none:
68  break;
69  }
70  }
71 
72 
74 
76  void clear() {
77  switch(mode_) {
78  case ListMode::copy:
79  ASSERT(data_!=NULL);
80  ASSERT(adr_!=NULL);
81  delete[] data_;
82  delete[] adr_;
83  num_ = 0;
84  nmax_ =0;
85  data_= NULL;
86  adr_ = NULL;
87  break;
88  case ListMode::local:
89  ASSERT(data_!=NULL);
90  ASSERT(adr_==NULL);
91  delete[] data_;
92  num_ = 0;
93  nmax_ =0;
94  data_=NULL;
95  break;
96  case ListMode::link:
97  ASSERT(adr_==NULL);
98  num_ = 0;
99  nmax_ = 0;
100  data_=NULL;
101  break;
102  case ListMode::none:
103  ASSERT(num_==0);
104  ASSERT(nmax_==0);
105  ASSERT(data_==NULL);
106  ASSERT(adr_==NULL);
107  break;
108  }
110  modified_flag_ = false;
111  }
112 
114  /* Copy function will remove the local data and also copy the member data or the link
115  */
116  List& operator = (const List& _list) {
117  clear();
118  mode_ = _list.mode_;
119  switch(mode_) {
120  case ListMode::copy:
121  reserveMem(_list.nmax_, mode_);
122  num_ = _list.num_;
123  for(int i=0; i<num_; i++) data_[i] = _list.data_[i];
124  for(int i=0; i<num_; i++) adr_[i] = _list.adr_[i];
125  break;
126  case ListMode::local:
127  reserveMem(_list.nmax_, mode_);
128  num_ = _list.num_;
129  for(int i=0; i<num_; i++) data_[i] = _list.data_[i];
130  break;
131  case ListMode::link:
132  num_ = _list.num_;
133  nmax_ = _list.nmax_;
134  data_ = _list.data_;
135  break;
136  case ListMode::none:
137  break;
138  }
140  return *this;
141  }
142 
144  ~List() {
145  clear();
146  }
147 
149 
151  int getSize() const {
152  return num_;
153  }
154 
155  ListMode getMode() const {
156  return mode_;
157  }
158 
160 
163  Ttype& getMember(const int _index) {
164  ASSERT(_index<num_);
165  ASSERT(_index>=0);
166  return data_[_index];
167  }
168 
170  Ttype* getDataAddress() const {
171  return data_;
172  }
173 
175  Ttype** getOriginAddressArray() const {
176  return adr_;
177  }
178 
180  Ttype& getLastMember() {
181  return data_[num_-1];
182  }
183 
185 
188  Ttype& operator [](const int _index) const {
189  ASSERT(_index<num_);
190  ASSERT(_index>=0);
191  return data_[_index];
192  }
193 
195 
198  Ttype* getMemberOriginAddress(const int _index) const{
199  ASSERT(mode_==ListMode::copy);
200  ASSERT(_index<num_);
201  ASSERT(_index<nmax_);
202  ASSERT(_index>=0);
203  return adr_[_index];
204  }
205 
207 
209  int getSizeMax() const {
210  return nmax_;
211  }
212 
214 
218  template <class T>
219  void addMemberAndAddress(T &_member) {
220  ASSERT(mode_==ListMode::copy);
221  ASSERT(num_<nmax_);
222  data_[num_] = _member;
223  adr_[num_] = (Ttype*)&_member;
224  num_++;
225  modified_flag_ = true;
226  }
227 
229 
233  template <class T>
234  void addMember(const T &_member) {
235  ASSERT(mode_==ListMode::local);
236  ASSERT(num_<nmax_);
237  data_[num_] = _member;
238  num_++;
239  modified_flag_ = true;
240  }
241 
243 
246  void increaseSizeNoInitialize(const int _n) {
248  ASSERT(num_+_n<=nmax_);
249  num_ += _n;
250  modified_flag_ = true;
251  }
252 
254 
257  void decreaseSizeNoInitialize(const int _n) {
259  ASSERT(num_-_n>=0);
260  num_ -= _n;
261  modified_flag_ = true;
262  }
263 
265 
268  void resizeNoInitialize(const int _n) {
270  ASSERT(_n<=nmax_);
271  num_ = _n;
272  modified_flag_ = true;
273  }
274 
276 
280  void linkMemberArray(Ttype _member[], const int _n_member) {
281  ASSERT(mode_==ListMode::link);
282  ASSERT(nmax_==0);
283  ASSERT(num_==0);
284  ASSERT(data_==NULL);
285  data_= _member;
286  num_ = _n_member;
287  nmax_= _n_member;
288  modified_flag_ = true;
289  }
290 
292 
298  static void createRemoveTable(const int* _index, const int _n_index, const int _n_member, int* _remove_table) {
299  ASSERT(_n_index>0);
300  ASSERT(_n_member>=_n_index);
301 
302  // last member index
303  int ilast = _n_member-1;
304  const int n_new = _n_member - _n_index; // new ptcl number
305  // initial table
306  for (int i=0; i<_n_member; i++) _remove_table[i] = -1;
307 
308  for (int i=0; i<_n_index; i++) {
309  int k=_index[i];
310 
311  int idel = k;
312 
313  // set ilast >= idel for safety.
314  ilast = std::max(ilast, idel);
315 
316  // check whether position is already moved, if so, check the moved new position and set current to delete
317  if(_remove_table[k]>=0) {
318  idel=_remove_table[k];
319  _remove_table[k]=_n_member;
320  }
321 
322  ASSERT(k<_n_member);
323  ASSERT(idel<_n_member);
324 
325  // check the last avaiable member that can be moved to idel
326  // If the ilast is already moved, check whether the new moved position _remove_table[ilast] is before the current idel.
327  // If _remove_table[ilast] is after the current idel, update the _remove_table[ilast] to idel and set _remove_table[ilast] as new idel to check, until _remove_table[ilast]=-1 or idel >= ilast
328  while (idel>=0) {
329  int itrlast = -1;
330  //cond: last is moved && ( moved pos before new n_ptcl || last is del ) && ilast > idel
331  while(_remove_table[ilast]>=0 && (_remove_table[ilast]<n_new || _remove_table[ilast]==_n_member) && ilast>idel) ilast--;
332 
333  // if ilast is not yet moved or (new pos of ilast > idel and ilast is not del, move ilast to idel)
334  if(_remove_table[ilast]<0||(idel<_remove_table[ilast]&&_remove_table[ilast]<_n_member)) {
335  itrlast=_remove_table[ilast];
336  _remove_table[ilast]=idel;
337  }
338  // idel is already at last, remove it
339  _remove_table[idel]=_n_member;
340  idel = itrlast;
341  }
342  }
343  }
344 
346 
350  void removeMember(const int _index, const bool _shift_last_only_flag) {
351  ASSERT(_index>=0);
352  ASSERT(_index<num_);
353 
354  int ilast = num_-1;
355  if (_index<ilast) {
356  if (_shift_last_only_flag) {
357  data_[_index] = data_[ilast];
358  if(mode_==ListMode::copy) adr_[_index] = adr_[ilast];
359  }
360  else {
361  if(mode_==ListMode::copy) {
362  for (int j=_index; j<ilast; j++) {
363  data_[j] = data_[j+1];
364  adr_[j] = adr_[j+1];
365  }
366  }
367  else {
368  for (int j=_index; j<ilast; j++) data_[j] = data_[j+1];
369  }
370  }
371  }
372  num_--;
373  modified_flag_ = true;
374  }
375 
376 
378 
381  void removeMemberTable(const int* remove_table) {
382  const int num_org = num_;
383  if (mode_==ListMode::copy) {
384  for (int i=0; i<num_org; i++) {
385  ASSERT(remove_table[i]<=num_org);
386  // no change case
387  if(remove_table[i]<0) continue;
388  // move case
389  else if(remove_table[i]<num_org) {
390  const int inew = remove_table[i];
391  data_[inew] = data_[i];
392  adr_[inew] = adr_[i];
393  }
394  // remove count
395  else num_--;
396  }
397  }
398  else {
399  for (int i=0; i<num_org; i++) {
400  ASSERT(remove_table[i]<=num_org);
401  // no change case
402  if(remove_table[i]<0) continue;
403  // move case
404  else if(remove_table[i]<num_org) {
405  const int inew = remove_table[i];
406  data_[inew] = data_[i];
407  }
408  // remove count
409  else num_--;
410  }
411  }
412  modified_flag_ = true;
413  }
414 
416 
420  void removeMemberList(const int* _index, const int _n_index) {
421  ASSERT(_n_index<=num_);
422  const int num_org = num_;
423  int remove_table[num_];
424  createRemoveTable(_index, _n_index, num_, remove_table);
425  removeMemberTable(remove_table);
426  ASSERT(num_+_n_index==num_org);
427  }
428 
430 
432  template <class T>
434  ASSERT(mode_==ListMode::copy);
435  ASSERT(nmax_>0);
436  for (int i=0; i<num_; i++) {
437  if(adr_[i]!=NULL) *(T*)adr_[i] = data_[i];
438  }
439  }
440 
442 
446  template <class T>
447  void writeBackMemberList(const int* _index, const int _n) {
448  ASSERT(mode_==ListMode::copy);
449  ASSERT(nmax_>0);
450  for (int i=0; i<_n; i++) {
451  int k=_index[i];
452  if(adr_[k]!=NULL) *(T*)adr_[k] = data_[k];
453  }
454  }
455 
457  bool isModified() const {
458  return modified_flag_;
459  }
460 
463  modified_flag_ = false;
464  }
465 
466  };
467 }
COMM::List::getDataAddress
Ttype * getDataAddress() const
return member data array address
Definition: list.h:170
COMM
Definition: binary_tree.h:8
COMM::List::isModified
bool isModified() const
Get modified status.
Definition: list.h:457
COMM::List::removeMemberList
void removeMemberList(const int *_index, const int _n_index)
remove a list of member based on an index list
Definition: list.h:420
COMM::List::data_
Ttype * data_
member array to store the data, or a link to existed member array (not allocated)
Definition: list.h:23
COMM::List::operator=
List & operator=(const List &_list)
operator = is copy
Definition: list.h:116
COMM::List::getOriginAddressArray
Ttype ** getOriginAddressArray() const
return member original address array
Definition: list.h:175
COMM::List::removeMemberTable
void removeMemberTable(const int *remove_table)
remove a list of member based on remove table
Definition: list.h:381
COMM::List::getMemberOriginAddress
Ttype * getMemberOriginAddress(const int _index) const
return one member original address
Definition: list.h:198
Float.h
COMM::List::nmax_
int nmax_
maximum number of members allocated in memory
Definition: list.h:22
COMM::List::operator[]
Ttype & operator[](const int _index) const
return one member data reference operator
Definition: list.h:188
COMM::ListMode
ListMode
list mode identification
Definition: list.h:13
COMM::List::~List
~List()
destructor
Definition: list.h:144
COMM::List::getMode
ListMode getMode() const
Definition: list.h:155
COMM::List::clear
void clear()
Clear function.
Definition: list.h:76
COMM::List::List
List()
Constructor.
Definition: list.h:34
COMM::List::addMember
void addMember(const T &_member)
copy one member and its address
Definition: list.h:234
COMM::List::mode_
ListMode mode_
mode indicator
Definition: list.h:25
COMM::List::linkMemberArray
void linkMemberArray(Ttype _member[], const int _n_member)
link a member array
Definition: list.h:280
COMM::List::getMember
Ttype & getMember(const int _index)
return one member data reference
Definition: list.h:163
COMM::List::increaseSizeNoInitialize
void increaseSizeNoInitialize(const int _n)
increase size without initialization
Definition: list.h:246
COMM::List::setModifiedFalse
void setModifiedFalse()
Reset modified status to false.
Definition: list.h:462
COMM::List::getSize
int getSize() const
get current member number
Definition: list.h:151
COMM::List::createRemoveTable
static void createRemoveTable(const int *_index, const int _n_index, const int _n_member, int *_remove_table)
create remove table for removing a list of members
Definition: list.h:298
COMM::List::num_
int num_
number of current members in the list
Definition: list.h:21
COMM::ListMode::link
@ link
COMM::List
list class to store and manage a group of member
Definition: list.h:19
COMM::List::resizeNoInitialize
void resizeNoInitialize(const int _n)
increase size without initialization
Definition: list.h:268
COMM::ListMode::local
@ local
COMM::List::modified_flag_
bool modified_flag_
true: member list is modified; used for safety checking
Definition: list.h:28
COMM::List::removeMember
void removeMember(const int _index, const bool _shift_last_only_flag)
remove one member
Definition: list.h:350
COMM::List::setMode
void setMode(const ListMode _mode)
set mode
Definition: list.h:39
COMM::List::writeBackMemberList
void writeBackMemberList(const int *_index, const int _n)
copy a list of member data back to original address
Definition: list.h:447
COMM::List::getSizeMax
int getSizeMax() const
Get maximum member number allow to store.
Definition: list.h:209
COMM::List::addMemberAndAddress
void addMemberAndAddress(T &_member)
copy one member and its address
Definition: list.h:219
COMM::List::getLastMember
Ttype & getLastMember()
return last member
Definition: list.h:180
COMM::ListMode::none
@ none
COMM::List::decreaseSizeNoInitialize
void decreaseSizeNoInitialize(const int _n)
increase size without initialization
Definition: list.h:257
COMM::List::writeBackMemberAll
void writeBackMemberAll()
copy all member data back to original address
Definition: list.h:433
COMM::List::reserveMem
void reserveMem(const int _nmax)
Memory allocation for storing members.
Definition: list.h:48
COMM::ListMode::copy
@ copy
COMM::List::adr_
Ttype ** adr_
original member address of member members
Definition: list.h:24