template int32_t get_vector_sum(svector &vec) { T total=0; auto ii_s=vec.begin(),ii_e=vec.end(); for(;ii_s int32_t get_random_biased_index(svector &chance) { if(chance.size()==0) { errorlog_string("Empty biased index vector"); return -1; } T roll=trandom(get_vector_sum(chance)); auto ii_s=chance.begin(),ii_e=chance.end(); auto ii_b=ii_s; for(;ii_s void zero_vector(svector &vc) { //NOTE: vector MEMORY IS GUARANTEED TO BE CONTIGUOUS, AND THIS IS FASTER THAN GOING THROUGH ONE BY ONE //apparently this gives linux a headache though, so back to the slower way //int32_t sz=vc.size(); //if(sz==0)return; //memset(&(vc[0]),0,sizeof(T)*sz); auto ii_s=vc.begin(),ii_e=vc.end(); for(;ii_s bool positive_vector(svector &vc) { auto ii_s=vc.begin(),ii_e=vc.end(); for(;ii_s0)return true; } return false; } template void add_unique_to_vector(T nl,svector &vc) { auto ii_s=vc.begin(),ii_e=vc.end(); for(;ii_s void add_dual_unique_to_vectors(T nl,T2 nl2,svector &vc,svector &vc2) { auto ii_s=vc.begin(),ii_e=vc.end(); auto ii_s2=vc2.begin(),ii_e2=vc2.end(); for(;ii_s void add_quad_unique_to_vectors(T nl,T2 nl2,T3 nl3,T4 nl4, svector &vc,svector &vc2,svector &vc3,svector &vc4) { auto ii_s=vc.begin(),ii_e=vc.end(); auto ii_s2=vc2.begin(),ii_e2=vc2.end(); auto ii_s3=vc3.begin(),ii_e3=vc3.end(); auto ii_s4=vc4.begin(),ii_e4=vc4.end(); for(;ii_s void remove_all_from_vector(T nl,svector &vc) { int32_t i; for(i=(int32_t)vc.size()-1;i>=0;i--) { if(vc[i]==nl)vc.erase(i); } } template void remove_all_from_dual_vectors(T nl,T2 nl2,svector &vc,svector &vc2) { int32_t i; for(i=(int32_t)vc.size()-1;i>=0;i--) { if(vc[i]==nl&& vc2[i]==nl2) { vc.erase(i); vc2.erase(i); } } } template int32_t get_vector_index(T a,svector &v) { auto ii_s=v.begin(),ii_e=v.end(); auto ii_b=ii_s; for(;ii_s int32_t get_dual_vector_index(T a1,T2 a2,svector &vc,svector &vc2) { auto ii_s=vc.begin(),ii_e=vc.end(); auto ii_s2=vc2.begin(),ii_e2=vc2.end(); auto ii_b=ii_s; for(;ii_s int32_t get_quad_vector_index(T a1,T2 a2,T3 a3,T4 a4, svector &vc,svector &vc2, svector &vc3,svector &vc4) { auto ii_s=vc.begin(),ii_e=vc.end(); auto ii_s2=vc2.begin(),ii_e2=vc2.end(); auto ii_s3=vc3.begin(),ii_e3=vc3.end(); auto ii_s4=vc4.begin(),ii_e4=vc4.end(); auto ii_b=ii_s; for(;ii_s void merge_vectors(T &master, T &merger) { auto ii_s=merger.begin(),ii_e=merger.end(); for(;ii_s=ii_e2) { master.push_back((*ii_s)); } } } template int32_t get_common_element_vector_index(T &master, T &merger) { auto ii_s=merger.begin(),ii_e=merger.end(); auto ii_s2=master.begin(),ii_e2=master.end(); auto ii_b2=ii_s2; for(;ii_s void merge_dual_vectors(T &master, T2 &master2, T &merger, T2 &merger2) { auto ii_s=merger.begin(),ii_e=merger.end(); auto ii_s2=merger2.begin(),ii_e2=merger2.end(); for(;ii_s=ii_e3) { master.push_back((*ii_s)); master2.push_back((*ii_s2)); } } } template void merge_quad_vectors(T &master, T2 &master2, T3 &master3, T4 &master4, T &merger, T2 &merger2, T3 &merger3, T4 &merger4) { auto ii_s=merger.begin(),ii_e=merger.end(); auto ii_s2=merger2.begin(),ii_e2=merger2.end(); auto ii_s3=merger3.begin(),ii_e3=merger3.end(); auto ii_s4=merger4.begin(),ii_e4=merger4.end(); for(;ii_s=ii_e5) { master.push_back((*ii_s)); master2.push_back((*ii_s2)); master3.push_back((*ii_s3)); master4.push_back((*ii_s4)); } } } template void cull_vectors(T &master,T &cull) { int32_t i,i2; for(i=(int32_t)cull.size()-1;i>=0;i--) { for(i2=(int32_t)master.size()-1;i2>=0;i2--) { if(cull[i]==master[i2]) { master.erase(i2); break; } } } } template void push_on_vector(T &master,T &new_stuff) { auto ii_s=new_stuff.begin(),ii_e=new_stuff.end(); for(;ii_s VIndex add_to_global_id_vector(T ptr,svector &vect) { int32_t size=vect.size(); if(size==0) { vect.push_back(ptr); return 1; } if(vect[size-1]->global_idglobal_id) { vect.push_back(ptr); return size; } int32_t start=0; int32_t end=size-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->global_id==ptr->global_id)return -1; if(start==end) { if(cptr->global_idglobal_id) { if(start+1>=size)return -1;//push_back() FOR UNIQUE ALREADY HANDLED else { vect.insert(start+1,ptr); return start+1; } } else if(cptr->global_id>ptr->global_id) { vect.insert(start,ptr); return start; } return -1; } if(cptr->global_id>ptr->global_id)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr->global_idglobal_id) { if(start+1>=size)return -1;//push_back() FOR UNIQUE ALREADY HANDLED else { vect.insert(start+1,ptr); return start+1; } } else if(cptr->global_id>ptr->global_id) { vect.insert(start,ptr); return start; } } else if(endglobal_idglobal_id) { if(end+1>=size)return -1;//push_back() FOR UNIQUE ALREADY HANDLED else { vect.insert(end+1,ptr); return end+1; } } else if(cptr->global_id>ptr->global_id) { vect.insert(end,ptr); return end; } } return -1;//push_back() FOR UNIQUE ALREADY HANDLED SO NO else } template void remove_from_global_id_vector(T ptr,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr==ptr) { vect.erase(mid); return; } if(cptr->global_id>ptr->global_id)end=mid-1; else start=mid+1; } } template void remove_from_global_id_vector_by_id(int32_t id,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->global_id==id) { vect.erase(mid); return; } if(cptr->global_id>id)end=mid-1; else start=mid+1; } } template T get_from_global_id_vector(int32_t id,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->global_id==id)return cptr; else if(cptr->global_id>id)end=mid-1; else start=mid+1; } return NULL; } template int32_t get_index_from_global_id_vector(int32_t id,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->global_id==id)return mid; else if(cptr->global_id>id)end=mid-1; else start=mid+1; } return -1; } template VIndex add_to_binary_vector(T ptr,svector &vect) { int32_t size=vect.size(); if(size==0) { vect.push_back(ptr); return 0; } if(vect[size-1]>1; cptr=vect[mid]; if(cptr==ptr) { vect.insert(mid,ptr);//INSERT A COPY HERE SINCE THIS IS A NON-UNIQUE VECTOR return mid; } if(start==end) { if(cptr=size)vect.push_back(ptr); else vect.insert(start+1,ptr); return start+1; } else { vect.insert(start,ptr); return start; } } if(cptr>ptr)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr=size)vect.push_back(ptr); else vect.insert(start+1,ptr); return start+1; } else { vect.insert(start,ptr); return start; } } else if(end=size)vect.push_back(ptr); else vect.insert(end+1,ptr); return end+1; } else { vect.insert(end,ptr); return end; } } else vect.push_back(ptr); return end; } //NOTE: RETURNS -1 IF ALREADY PRESENT, NOT THE INDEX template VIndex add_unique_to_binary_vector(T ptr,svector &vect) { int32_t size=vect.size(); if(size==0) { vect.push_back(ptr); return 0; } if(vect[size-1]>1; cptr=vect[mid]; if(cptr==ptr)return -1;//ALREADY IN VECTOR if(start==end) { if(cptr=(int32_t)vect.size())return -1;//push_back() CASE ALREADY HANDLED vect.insert(start+1,ptr); return start+1; } else if(cptr>ptr) { vect.insert(start,ptr); return start; } return -1; } if(cptr>ptr)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr=size)return -1;//push_back() CASE ALREADY HANDLED vect.insert(start+1,ptr); return start+1; } else if(cptr>ptr) { vect.insert(start,ptr); return start; } } else if(end=size)return -1;//push_back() CASE ALREADY HANDLED vect.insert(end+1,ptr); return end+1; } else if(cptr>ptr) { vect.insert(end,ptr); return end; } } return -1;//push_back() CASE ALREADY HANDLED SO NO else } //NOTE: RETURNS INDEX IF ALREADY PRESENT template VIndex add_unique_to_binary_vector_always_index(T ptr,svector &vect,bool &was_present) { was_present=false; int32_t size=vect.size(); if(size==0) { vect.push_back(ptr); return 0; } if(vect[size-1]>1; cptr=vect[mid]; if(cptr==ptr){was_present=true;return mid;}//ALREADY IN VECTOR if(start==end) { if(cptr=(int32_t)vect.size())return -1;//push_back() CASE ALREADY HANDLED vect.insert(start+1,ptr); return start+1; } else if(cptr>ptr) { vect.insert(start,ptr); return start; } return -1; } if(cptr>ptr)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr=size)return -1;//push_back() CASE ALREADY HANDLED vect.insert(start+1,ptr); return start+1; } else if(cptr>ptr) { vect.insert(start,ptr); return start; } if(cptr==ptr){was_present=true;return start;}//ALREADY IN VECTOR } else if(end=size)return -1;//push_back() CASE ALREADY HANDLED vect.insert(end+1,ptr); return end+1; } else if(cptr>ptr) { vect.insert(end,ptr); return end; } if(cptr==ptr){was_present=true;return end;}//ALREADY IN VECTOR } return -1;//push_back() CASE ALREADY HANDLED SO NO else } template void remove_from_binary_vector(T ptr,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; int32_t mid; T cptr; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr==ptr) { vect.erase(mid); return; } if(cptr>ptr)end=mid-1; else start=mid+1; } } template int32_t get_index_from_binary_vector(T id,svector &vect) { int32_t size=vect.size(); if(size==0||id==-1)return -1; int32_t start=0; int32_t end=size-1; int32_t mid; T cptr; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr==id) { return mid; } if(cptr>id)end=mid-1; else start=mid+1; } return -1; } template int32_t get_floor_index_from_binary_vector(T ptr,svector &vect) { int32_t size=vect.size(); if(size==0)return -1; if(vect[size-1]>1; cptr=vect[mid]; if(cptr==ptr) { while(mid>0) { if(vect[mid-1]=size)return start; else return start; } //NOTE: cptr>ptr as == is already handled above else { if(start<=0)return 0; else return start-1; } } if(cptr>ptr)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr=size)return start; else return start; } else if(cptr>ptr) { if(start<=0)return 0; else return start-1; } } else if(end=size)return end; else return end; } else if(cptr>ptr) { if(end<=0)return 0; else return end-1; } } return start; } template void fixed_array_push_back(T ptr,T *vect,int32_t &size,int32_t max) { if(size>=max)return; vect[size]=ptr; size++; } template void fixed_array_insert(int32_t index,T ptr,T *vect,int32_t &size,int32_t max) { if(size>=max)return; if(size>0) { T *ptr1=vect+size; T *ptr2=vect+(size-1); T *stop=vect+index; while(ptr2>=stop) { (*ptr1)=(*ptr2); --ptr1; --ptr2; } (*ptr1)=ptr; return; } else { vect[index]=ptr; ++size; } } template void add_to_fixed_binary_array(T ptr,T *vect,int32_t &size,int32_t max) { if(size==0) { fixed_array_push_back(ptr,vect,size,max); return; } if(vect[size-1]>1; cptr=vect[mid]; if(cptr==ptr) { fixed_array_insert(mid,ptr,vect,size,max);//INSERT A COPY SINCE THIS IS NON-UNIQUE CASE return; } if(start==end) { if(cptr=size)fixed_array_push_back(ptr,vect,size,max); else fixed_array_insert(start+1,ptr,vect,size,max); } else fixed_array_insert(start,ptr,vect,size,max); return; } if(cptr>ptr)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr=size)fixed_array_push_back(ptr,vect,size,max); else fixed_array_insert(start+1,ptr,vect,size,max); } else fixed_array_insert(start,ptr,vect,size,max); } else if(end=size)fixed_array_push_back(ptr,vect,size,max); else fixed_array_insert(end+1,ptr,vect,size,max); } else fixed_array_insert(end,ptr,vect,size,max); } else fixed_array_push_back(ptr,vect,size,max); } template void add_unique_to_fixed_binary_array(T ptr,T *vect,int32_t &size,int32_t max) { if(size==0) { fixed_array_push_back(ptr,vect,size,max); return; } if(vect[size-1]>1; cptr=vect[mid]; if(cptr==ptr)return; if(start==end) { if(cptr=size)return;//WAS push_back() else fixed_array_insert(start+1,ptr,vect,size,max); } else if(cptr>ptr)fixed_array_insert(start,ptr,vect,size,max); return; } if(cptr>ptr)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr=size)return;//WAS push_back() else fixed_array_insert(start+1,ptr,vect,size,max); } else if(cptr>ptr)fixed_array_insert(start,ptr,vect,size,max); } else if(end=size)return;//WAS push_back() else fixed_array_insert(end+1,ptr,vect,size,max); } else if(cptr>ptr)fixed_array_insert(end,ptr,vect,size,max); } //NOTE: NO else CASE HERE BECAUSE IN THE NON-UNIQUE VERSION IT JUST PUSHED BACK //AND PUSHING BACK IS HANDLED IN THE OPENING FUNCTION } template void add_to_local_id_vector(T ptr,svector &vect) { int32_t size=vect.size(); if(size==0) { vect.push_back(ptr); return; } if(vect[size-1]->local_idlocal_id) { vect.push_back(ptr); return; } int32_t start=0; int32_t end=size-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->local_id==ptr->local_id)return; if(start==end) { if(cptr->local_idlocal_id) { if(start+1>=size)return;//push_back() FOR UNIQUE ALREADY HANDLED else vect.insert(start+1,ptr); } else if(cptr->local_id>ptr->local_id)vect.insert(start,ptr); return; } if(cptr->local_id>ptr->local_id)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr->local_idlocal_id) { if(start+1>=size)return;//push_back() FOR UNIQUE ALREADY HANDLED else vect.insert(start+1,ptr); } else if(cptr->local_id>ptr->local_id)vect.insert(start,ptr); } else if(endlocal_idlocal_id) { if(end+1>=size)return;//push_back() FOR UNIQUE ALREADY HANDLED else vect.insert(end+1,ptr); } else if(cptr->local_id>ptr->local_id)vect.insert(end,ptr); } } template void remove_from_local_id_vector(T ptr,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr==ptr) { vect.erase(mid); return; } if(cptr->local_id>ptr->local_id)end=mid-1; else start=mid+1; } } template T get_from_local_id_vector(int32_t id,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->local_id==id)return cptr; else if(cptr->local_id>id)end=mid-1; else start=mid+1; } return NULL; } template int32_t get_index_from_local_id_vector(int32_t id,svector &vect) { int32_t start=0; int32_t end=(int32_t)vect.size()-1; T cptr; int32_t mid; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->local_id==id)return mid; else if(cptr->local_id>id)end=mid-1; else start=mid+1; } return -1; } template void add_to_short_id_vector(T ptr,svector &vect) { int16_t size=vect.size(); if(size==0) { vect.push_back(ptr); return; } if(vect[size-1]->short_idshort_id) { vect.push_back(ptr); return; } int16_t start=0; int16_t end=size-1; int16_t mid; T cptr; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->short_id==ptr->short_id)return; if(start==end) { if(cptr->short_idshort_id) { if(start+1>=size)return;//push_back() FOR UNIQUE ALREADY HANDLED else vect.insert(start+1,ptr); } else if(cptr->short_id>ptr->short_id)vect.insert(start,ptr); return; } if(cptr->short_id>ptr->short_id)end=mid-1; else start=mid+1; } if(end<0) { T cptr=vect[start]; if(cptr->short_idshort_id) { if(start+1>=size)return;//push_back() FOR UNIQUE ALREADY HANDLED else vect.insert(start+1,ptr); } else if(cptr->short_id>ptr->short_id)vect.insert(start,ptr); } else if(endshort_idshort_id) { if(end+1>=size)return;//push_back() FOR UNIQUE ALREADY HANDLED else vect.insert(end+1,ptr); } else if(cptr->short_id>ptr->short_id)vect.insert(end,ptr); } } template void remove_from_short_id_vector(T ptr,svector &vect) { int16_t start=0; int16_t end=(int16_t)vect.size()-1; T cptr; while(start<=end) { int16_t mid=(start+end)>>1; T cptr=vect[mid]; if(cptr==ptr) { vect.erase(mid); return; } if(cptr->short_id>ptr->short_id)end=mid-1; else start=mid+1; } } template T get_from_short_id_vector(int16_t id,svector &vect) { int16_t start=0; int16_t end=(int16_t)vect.size()-1; int16_t mid; T cptr; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->short_id==id) { return cptr; } if(cptr->short_id>id)end=mid-1; else start=mid+1; } return NULL; } template int16_t get_index_from_short_id_vector(int16_t id,svector &vect) { int16_t start=0; int16_t end=(int16_t)vect.size()-1; int16_t mid; T cptr; while(start<=end) { mid=(start+end)>>1; cptr=vect[mid]; if(cptr->short_id==id) { return mid; } if(cptr->short_id>id)end=mid-1; else start=mid+1; } return -1; }