From f3b48019472d603780bd6972aceebb86e3a2fece Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 22 May 2025 22:22:21 -0400 Subject: [PATCH] end of day blah --- amsmathutil25.code-workspace | 6 + build/make.linux64.lib.py | 2 +- build/make.linux64.test.py | 2 +- build_linux64/libamsmathutil25.linux64.a | Bin 2212 -> 88860 bytes build_linux64/objstore/amsmathtuil25_test1.o | Bin 0 -> 54728 bytes .../objstore/amsmathutil25_amsarray.o | Bin 0 -> 3800 bytes .../objstore/amsmathutil25_amsarray_sort.o | Bin 0 -> 19920 bytes build_linux64/tests | Bin 900352 -> 900352 bytes include/amsmathutil25/amsmathutil25.hpp | 26 + .../math/amsmathutil25_complex128.hpp | 14 + .../math/amsmathutil25_complex64.hpp | 14 + .../amsmathutil25/math/amsmathutil25_math.hpp | 22 + .../math/amsmathutil25_mathfns1.hpp | 11 + .../amsmathutil25/math/amsmathutil25_vec2.hpp | 36 + .../math/amsmathutil25_vec2f.hpp | 11 + .../amsmathutil25/math/amsmathutil25_vec3.hpp | 11 + .../math/amsmathutil25_vec3f.hpp | 11 + .../amsmathutil25/math/amsmathutil25_vec4.hpp | 11 + .../math/amsmathutil25_vec4f.hpp | 11 + .../random/amsmathutil25_random.hpp | 13 + .../testing/amsmathutil25_testing.hpp | 16 + .../util/amsmathutil25_amsarray.hpp | 116 +++ .../util/amsmathutil25_amsarray_impl.hpp | 747 ++++++++++++++++++ .../util/amsmathutil25_amsarray_sortimpl.hpp | 90 +++ .../util/amsmathutil25_bufferops.hpp | 26 + .../util/amsmathutil25_bufferops_impl.hpp | 161 ++++ .../amsmathutil25/util/amsmathutil25_util.hpp | 38 + .../util/amsmathutil25_utilimpl.hpp | 71 ++ .../testing/amsmathtuil25_test1.cpp | 96 +++ .../util/amsmathutil25_amsarray.cpp | 84 ++ .../util/amsmathutil25_amsarray_sort.cpp | 62 ++ src/main.cpp | 3 + 32 files changed, 1709 insertions(+), 2 deletions(-) create mode 100644 build_linux64/objstore/amsmathtuil25_test1.o create mode 100644 build_linux64/objstore/amsmathutil25_amsarray.o create mode 100644 build_linux64/objstore/amsmathutil25_amsarray_sort.o create mode 100644 include/amsmathutil25/math/amsmathutil25_complex128.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_complex64.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_math.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_mathfns1.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_vec2.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_vec2f.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_vec3.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_vec3f.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_vec4.hpp create mode 100644 include/amsmathutil25/math/amsmathutil25_vec4f.hpp create mode 100644 include/amsmathutil25/random/amsmathutil25_random.hpp create mode 100644 include/amsmathutil25/testing/amsmathutil25_testing.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_amsarray.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_amsarray_sortimpl.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_bufferops.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_bufferops_impl.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_util.hpp create mode 100644 include/amsmathutil25/util/amsmathutil25_utilimpl.hpp create mode 100644 src/amsmathutil25/testing/amsmathtuil25_test1.cpp create mode 100644 src/amsmathutil25/util/amsmathutil25_amsarray.cpp create mode 100644 src/amsmathutil25/util/amsmathutil25_amsarray_sort.cpp diff --git a/amsmathutil25.code-workspace b/amsmathutil25.code-workspace index 8f4183e..a39253d 100644 --- a/amsmathutil25.code-workspace +++ b/amsmathutil25.code-workspace @@ -2,6 +2,12 @@ "folders": [ { "path": "." + }, + { + "path": "../../sourceprojs23/amsmathutil2" + }, + { + "path": "../amscppnarray" } ] } diff --git a/build/make.linux64.lib.py b/build/make.linux64.lib.py index 8014d2a..1f915db 100644 --- a/build/make.linux64.lib.py +++ b/build/make.linux64.lib.py @@ -16,7 +16,7 @@ builddir = "./build_linux64" doinstall = False #copies the build_output to the install dir when finished cc = "g++" #compiler -cflags = "-fPIC" +cflags = "-O3 -fPIC" libraries = "-l{}".format(libname) libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir) linkerflags = "-static -static-libgcc -Wl,-rpath=." diff --git a/build/make.linux64.test.py b/build/make.linux64.test.py index d8c1b14..7fef03e 100644 --- a/build/make.linux64.test.py +++ b/build/make.linux64.test.py @@ -16,7 +16,7 @@ builddir = "./build_linux64" doinstall = False #copies the build_output to the install dir when finished cc = "g++" #compiler -cflags = "-fPIC" +cflags = "-O3 -fPIC" libraries = "-l{}".format(libname) libdirs = "-L{} -L{}/lib -L{}/lib".format(builddir,commondir,depdir) linkerflags = "-static -static-libgcc -Wl,-rpath=." diff --git a/build_linux64/libamsmathutil25.linux64.a b/build_linux64/libamsmathutil25.linux64.a index c7a6dc57fdceb69251d45985df523465daca1661..30a862c3b6b113e2d64d024df4ed327a491cff49 100644 GIT binary patch literal 88860 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 ZEJG^0{ivBc(dWsBU>lV{DZx(ve*nu3T6NR diff --git a/build_linux64/objstore/amsmathtuil25_test1.o b/build_linux64/objstore/amsmathtuil25_test1.o new file mode 100644 index 0000000000000000000000000000000000000000..2fbeb0066bba562f3b6348e15bf9b6a07b2f07c0 GIT binary patch literal 54728 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 literal 0 HcmV?d00001 diff --git a/build_linux64/objstore/amsmathutil25_amsarray.o b/build_linux64/objstore/amsmathutil25_amsarray.o new file mode 100644 index 0000000000000000000000000000000000000000..aefbb24eadf0a12ef897e5971dd766bf62c3b48b GIT binary patch literal 3800 zcmbtXT})g>6rP2pUAuS}4T(gmtWgvrz1hp3S`)hqEWNY@8w>uR&3b{|E@A(?dpCl{ z(m-oMRuU55un#`zYfVhk_yQK6e9%UX*477~jK4A37>Q!=oY@&T%-+Q{o@DNs`OZ1t zoik@_93mcv@J;sfprB<~4=nJ%jxks^aWoYr+ReY_nW-hFI zL@b0Xo!BxTy*~Gqd46r~zSUR3gWIC#el8p_7e4eocPjFHNN=l7UPe!m48yxRri({SB{pJQ$orw}v@y-N=rG75ZXoayM$LtPIF7&kQYLTi9l z2kq$aD63&?4Y68iD2*k>JTE`VJTncR=KB4ar_t{=t(+bysKd*9$DU~TaE?)NQR+#~STKRHfEUh_KYq#9PhjqN3)N;ST z_fru14+*?p!9xPaJwb(Emat3ipdj=QL%W^KlkWwS_vEfc|e?*21PDQ(O_Eg4+j!&^%!I?-}HjBkLl!#3vr^_Q!B%+Kiv6pd@ z7%>ZWCx4dCCw_!Bw@T6@a7-J|sKlQVIG$bn6ieJDIOVw@aOA-l>HiM#r#$Zxobvoo z0pBO;h5Wc%CI15gSLfMBaLS(|Jo^aG4DqM)oF_QtdA|bw1>wgtBIo%R@u&RFV!z@1 zDSuetsCD;4ld0!KyXd4u><{yzv#`45VV9nEx}?E+Wp(nD~{^AW_O zsO#`1SvTsRuP~n{D)0w6JHzi0Z(_*soe-{OzFW)b9 zSYRQ=@1mFx&X0{OI= T*ll2Ri@zr3kN-2NsPX>*!}sb~ literal 0 HcmV?d00001 diff --git a/build_linux64/objstore/amsmathutil25_amsarray_sort.o b/build_linux64/objstore/amsmathutil25_amsarray_sort.o new file mode 100644 index 0000000000000000000000000000000000000000..389530e44802f68aa38b2a5fe173fe0b4e1f796b GIT binary patch literal 19920 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 literal 0 HcmV?d00001 diff --git a/build_linux64/tests b/build_linux64/tests index 125e77e08867b53181f4480abbf3a3eebfbe32a7..1b1d8d664156161ef13f5507d0590ce7e8875de5 100644 GIT binary patch delta 53083 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%0Db!D@RE;v!nB$wPQ|mfg+Wu!~e*{9GwUg_o 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%0ALbGVgK%U+soxLD3U^wt<@trXiw(@ag1Sb9H= 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�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 diff --git a/include/amsmathutil25/amsmathutil25.hpp b/include/amsmathutil25/amsmathutil25.hpp index 5f927ab..c059954 100644 --- a/include/amsmathutil25/amsmathutil25.hpp +++ b/include/amsmathutil25/amsmathutil25.hpp @@ -4,11 +4,37 @@ #include #include #include +#include +#include +#include +#include namespace ams { +//return values used for this library +static const int amsmathutil25_success = 1; +static const int amsmathutil25_failure = -1; + +//maximum number of threads to use +static const int amsmathutil25_maxthreads = 50; + +//problem size at which to begin using multi-threading +static const int amsmathutil25_threadpsz = 5000; + + }; +//Library subsections +#include +#include +#include + + +//... +// Testing +#include + + #endif \ No newline at end of file diff --git a/include/amsmathutil25/math/amsmathutil25_complex128.hpp b/include/amsmathutil25/math/amsmathutil25_complex128.hpp new file mode 100644 index 0000000..54e9c78 --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_complex128.hpp @@ -0,0 +1,14 @@ +#ifndef __AMSMATHUTIL25_COMPLEX128_HPP__ +#define __AMSMATHUTIL25_COMPLEX128_HPP__ + +namespace ams +{ +namespace cmp +{ + + +}; //end namespace cmp +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_complex64.hpp b/include/amsmathutil25/math/amsmathutil25_complex64.hpp new file mode 100644 index 0000000..cd1f22a --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_complex64.hpp @@ -0,0 +1,14 @@ +#ifndef __AMSMATHUTIL25_COMPLEX64_HPP__ +#define __AMSMATHUTIL25_COMPLEX64_HPP__ + +namespace ams +{ +namespace cmp +{ + + +}; //end namespace cmp +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_math.hpp b/include/amsmathutil25/math/amsmathutil25_math.hpp new file mode 100644 index 0000000..c64d798 --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_math.hpp @@ -0,0 +1,22 @@ +#ifndef __AMSMATHUTIL25_MATH_HPP__ +#define __AMSMATHUTIL25_MATH_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_mathfns1.hpp b/include/amsmathutil25/math/amsmathutil25_mathfns1.hpp new file mode 100644 index 0000000..27c6cb4 --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_mathfns1.hpp @@ -0,0 +1,11 @@ +#ifndef __AMSMATHUTIL25_MATHFNS1_HPP__ +#define __AMSMATHUTIL25_MATHFNS1_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_vec2.hpp b/include/amsmathutil25/math/amsmathutil25_vec2.hpp new file mode 100644 index 0000000..189b42f --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_vec2.hpp @@ -0,0 +1,36 @@ +#ifndef __AMSMATHUTIL25_VEC2_HPP__ +#define __AMSMATHUTIL25_VEC2_HPP__ + +namespace ams +{ + +class vec2 +{ +public: + double x; + double y; + + vec2(); + vec2(double _x, double _y); + vec2 operator=(vec2 rhs); + + +}; + +class mat2 +{ +public: + double data[4]; + + mat2(); + mat2(double _xx, double _xy, double _yx, double _yy); + mat2(const double *_data); + mat2(mat2 &rhs); + + +}; + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_vec2f.hpp b/include/amsmathutil25/math/amsmathutil25_vec2f.hpp new file mode 100644 index 0000000..00ef248 --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_vec2f.hpp @@ -0,0 +1,11 @@ +#ifndef __AMSMATHUTIL25_VEC2F_HPP__ +#define __AMSMATHUTIL25_VEC2F_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_vec3.hpp b/include/amsmathutil25/math/amsmathutil25_vec3.hpp new file mode 100644 index 0000000..3fca66e --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_vec3.hpp @@ -0,0 +1,11 @@ +#ifndef __AMSMATHUTIL25_VEC3_HPP__ +#define __AMSMATHUTIL25_VEC3_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_vec3f.hpp b/include/amsmathutil25/math/amsmathutil25_vec3f.hpp new file mode 100644 index 0000000..4d95651 --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_vec3f.hpp @@ -0,0 +1,11 @@ +#ifndef __AMSMATHUTIL25_VEC3F_HPP__ +#define __AMSMATHUTIL25_VEC3F_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_vec4.hpp b/include/amsmathutil25/math/amsmathutil25_vec4.hpp new file mode 100644 index 0000000..21264e1 --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_vec4.hpp @@ -0,0 +1,11 @@ +#ifndef __AMSMATHUTIL25_VEC4_HPP__ +#define __AMSMATHUTIL25_VEC4_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/math/amsmathutil25_vec4f.hpp b/include/amsmathutil25/math/amsmathutil25_vec4f.hpp new file mode 100644 index 0000000..631840e --- /dev/null +++ b/include/amsmathutil25/math/amsmathutil25_vec4f.hpp @@ -0,0 +1,11 @@ +#ifndef __AMSMATHUTIL25_VEC4F_HPP__ +#define __AMSMATHUTIL25_VEC4F_HPP__ + +namespace ams +{ + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/random/amsmathutil25_random.hpp b/include/amsmathutil25/random/amsmathutil25_random.hpp new file mode 100644 index 0000000..9389861 --- /dev/null +++ b/include/amsmathutil25/random/amsmathutil25_random.hpp @@ -0,0 +1,13 @@ +#ifndef __AMSMATHUTIL25_RANDOM_HPP__ +#define __AMSMATHUTIL25_RANDOM_HPP__ + +namespace ams +{ +namespace rand +{ + +}; //end namespace rand +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/testing/amsmathutil25_testing.hpp b/include/amsmathutil25/testing/amsmathutil25_testing.hpp new file mode 100644 index 0000000..7ffaa92 --- /dev/null +++ b/include/amsmathutil25/testing/amsmathutil25_testing.hpp @@ -0,0 +1,16 @@ +#ifndef __AMSMATHUTIL25_TESTING_HPP__ +#define __AMSMATHUTIL25_TESTING_HPP__ + +namespace ams +{ +namespace amsmathutil25 +{ + + void test_amsarray1(); + void test_amsarray2(); + +}; //end namespace amsmathutil25 +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/util/amsmathutil25_amsarray.hpp b/include/amsmathutil25/util/amsmathutil25_amsarray.hpp new file mode 100644 index 0000000..c3c89c3 --- /dev/null +++ b/include/amsmathutil25/util/amsmathutil25_amsarray.hpp @@ -0,0 +1,116 @@ +#ifndef __AMSMATHUTIL25_AMSARRAY_HPP__ +#define __AMSMATHUTIL25_AMSARRAY_HPP__ + +namespace ams +{ + typedef int64_t amsarray_size_t; + static const int amsarray_success = amsmathutil25_success; + static const int amsarray_failure = amsmathutil25_failure; + + template class amsarray + { + public: + amsarray_size_t length; + T *data; + + //Rule of 5 boilerplate + amsarray(); + ~amsarray(); + amsarray(const amsarray& other); + amsarray(amsarray&& other) noexcept; + amsarray& operator=(const amsarray &other); + amsarray& operator=(amsarray &&other) noexcept; + + //other initializers + amsarray& operator=(const std::vector& other); + amsarray(const std::initializer_list initlist); + amsarray& operator=(const std::initializer_list initlist); + + //casting datatypes + template operator amsarray() const; //casting datatypes + + //resizing operator + // returns: + // amsarray_success on successfully allocating new memory, else + // amsarray_failure. + int resize(amsarray_size_t _newlen); + + //returns the array length for routines that expect size() to be present + const amsarray_size_t size() const; + + T& operator[](amsarray_size_t ind); + const T& operator[](amsarray_size_t ind) const; + T& at(amsarray_size_t ind); + const T& at(amsarray_size_t ind) const; + + int setall(const T &val); + + //Comparators + bool operator==(const amsarray& other) const; + bool operator!=(const amsarray& other) const; + + //inserts a value at (before) index ind + //insert(0,val) would give {val, oldval0, oldval1, ...} + //insert(N,val) + int insert(amsarray_size_t ind, const T& val); + + //removes the value at index ind, and reduces array size by 1 + int erase(amsarray_size_t ind); + + //aliases to insert/erase operations + int append(const T& val); + int prepend(const T& val); + int push_back(const T& val); + int push_front(const T& val); + T pop_back(); + T pop_front(); + + //finds the first instance of val in the array + amsarray_size_t find(const T& val); + + //finds the next instance of val, starting consideration at indstart + amsarray_size_t findnext(amsarray_size_t indstart, const T& val); + + //finds where to insert a particular value such that the list remains ordered + amsarray_size_t find_insert_ordered(const T& val); + + //subarray operations + amsarray subarray(amsarray_size_t ind1, amsarray_size_t ind2) const; + + //returns an array that is {thisarray[inds[0]],thisarray[inds[1]],...} + amsarray select(amsarray inds); + + //returns an array of indices that is a permutation which will sort + //this array in ascending order + amsarray sort_permutation(); + + //returns an array that is this array in reverse order + amsarray reverse(); + + + //C++11 iterators + // (magic boilerplate I don't really understand yet) + typedef T* iterator; + typedef const T* const_iterator; + iterator begin() {return data;} + iterator end() {return data + length;} + const_iterator begin() const {return data;} + const_iterator end() const {return data + length;} + const_iterator cbegin() const { return data; } + const_iterator cend() const { return data+length;} + + //template specialized for particular array types + void print(bool newline=0, int printstyle=0); + }; + +// {0, 1, 2, .... N} +amsarray permutation_identity(amsarray_size_t _length); + + +}; //end namespace ams + +#include +#include + +#endif + diff --git a/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp b/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp new file mode 100644 index 0000000..70fc738 --- /dev/null +++ b/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp @@ -0,0 +1,747 @@ +#ifndef __AMSMATHUTIL25_AMSARRAY_IMPL_HPP__ +#define __AMSMATHUTIL25_AMSARRAY_IMPL_HPP__ + +namespace ams +{ + + template amsarray::amsarray() + { + length = 0; + data = NULL; + return; + } + + template amsarray::~amsarray() + { + length = 0; + if(data!=NULL) {delete[] data; data = NULL;} + return; + } + + template const amsarray_size_t amsarray::size() const + { + return this->length; + } + + template int amsarray::resize(amsarray_size_t _newlen) + { + int ret = amsarray_success; + T *newdata = NULL; + amsarray_size_t lmin; + T defval = T(); + + if(_newlen<=0) + { + length = 0; + if(data!=NULL) {delete[] data; data = NULL;} + ret = amsarray_success; + return ret; + } + + newdata = new(std::nothrow) T[_newlen]; + if(newdata==NULL) + { + ret = amsarray_failure; + return ret; + } + + if(data!=NULL) + { + lmin = (_newlen>=length) ? length : _newlen; + ams::buffer_cast_copy(newdata,data,lmin); + } + ams::buffer_set(newdata,length,_newlen,defval); + + if(data!=NULL) {delete[] data; data = NULL;} + data = newdata; + length = _newlen; + + return ret; + } + + template amsarray::amsarray(const amsarray& other) + { + int res = amsarray_success; + length = 0; + data = NULL; + if(this!=&other) + { + res = this->resize(other.length); + if(res==amsarray_success) + { + buffer_cast_copy(this->data,other.data,length); + } + } + return; + } + + template amsarray::amsarray(amsarray&& other) noexcept + { + length = 0; + data = NULL; + if(this!=&other) + { + if(data!=NULL) {delete[] data; data = NULL;} + length = other.length; + data = other.data; + other.length = 0; + other.data = NULL; + } + return; + } + + template amsarray& amsarray::operator=(const amsarray &other) + { + int res = amsarray_success; + if(this!=&other) + { + res = this->resize(other.length); + if(res==amsarray_success) + { + buffer_cast_copy(this->data,other.data,length); + } + } + return *this; + } + + template amsarray& amsarray::operator=(amsarray &&other) noexcept + { + if(this!=&other) + { + if(data!=NULL) {delete[] data; data = NULL;} + length = other.length; + data = other.data; + other.length = 0; + other.data = NULL; + } + return *this; + } + + template amsarray& amsarray::operator=(const std::vector& other) + { + amsarray_size_t I; + int res; + + if(this!=&other) + { + res = this->resize(other.size()); + if(res!=amsarray_success) + { + return *this; + } + else + { + for(I=0;I amsarray::amsarray(const std::initializer_list initlist) + { + amsarray_size_t I; + int res; + length = 0; + data = NULL; + + res = this->resize(initlist.size()); + if(res!=amsarray_success) + { + return; + } + else + { + I = 0; + for(T elem : initlist) + { + data[I] = elem; + if(I amsarray& amsarray::operator=(const std::initializer_list initlist) + { + amsarray_size_t I; + int res; + + res = this->resize(initlist.size()); + if(res!=amsarray_success) + { + this->length = 0; + if(this->data != NULL) {delete[] this->data; this->data=NULL;} + return *this; + } + else + { + I = 0; + for(T elem : initlist) + { + data[I] = elem; + if(I template amsarray::operator amsarray() const + { + //casting datatypes + amsarray ret; + int res; + + res = ret.resize(this->length); + if(res!=amsarray_success) + { + ret.resize(0); + return ret; + } + else + { + buffer_cast_copy(ret.data,data,length); + } + + return ret; + } + + + + template T& amsarray::operator[](amsarray_size_t ind) + { + return data[ind]; + } + template const T& amsarray::operator[](amsarray_size_t ind) const + { + return data[ind]; + } + template T& amsarray::at(amsarray_size_t ind) + { + return data[ind]; + } + template const T& amsarray::at(amsarray_size_t ind) const + { + return data[ind]; + } + + template int amsarray::setall(const T &val) + { + int ret = amsarray_success; + int res; + res = buffer_set(data,length,val); + if(res!=amsmathutil25_success) + { + ret = amsarray_failure; + } + return ret; + } + + + + template amsarray amsarray::subarray(amsarray_size_t ind1, amsarray_size_t ind2) const + { + int res; + amsarray ret; + T defval = T(); + amsarray_size_t I,J; + + int nl = ind2-ind1; + + if(nl<=0) + { + ret.resize(0); + return ret; + } + + ret.resize(nl); + for(I=0;I=this->length) + { + ret.data[I] = defval; + } + else + { + ret.data[I] = this->data[J]; + } + } + + return ret; + } + +//inserts a value at (before) index ind +//insert(0,val) would give {val, oldval0, oldval1, ...} +//insert(N,val) +template int amsarray::insert(amsarray_size_t ind, const T& val) +{ + int ret = amsarray_success; + int res; + amsarray narr; + amsarray_size_t I; + + if(ind<0) + { + ret = amsarray_failure; + return ret; + } + else if(ind<=this->length) + { + res = narr.resize(this->length+1); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + + if(this->data!=NULL) + { + for(I=0;Ilength;I++) + { + narr.data[I] = this->data[I]; + } + } + narr.data[ind] = val; + if(this->data!=NULL) + { + for(I=ind+1;Idata[I-1]; + } + } + + //steal data from narr + if(this->data!=NULL) {delete[] this->data; this->data=NULL;} + this->length = narr.length; + this->data = narr.data; + narr.length = 0; + narr.data = NULL; + } + else + { + //inserting past the end of the array + res = narr.resize(ind+1); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + + if(this->data!=NULL) + { + for(I=0;Ilength;I++) + { + narr.data[I] = this->data[I]; + } + } + narr.data[ind] = val; + + //steal data from narr + if(this->data!=NULL) {delete[] this->data; this->data=NULL;} + this->length = narr.length; + this->data = narr.data; + narr.length = 0; + narr.data = NULL; + } + + return ret; +} + +//removes the value at index ind, and reduces array size by 1 +template int amsarray::erase(amsarray_size_t ind) +{ + int ret = amsarray_success; + int res; + amsarray narr; + amsarray_size_t I; + + if(ind<0 || ind>=this->length) + { + ret = amsarray_failure; + return ret; + } + + res = narr.resize(this->length-1); + if(res!=amsarray_success) + { + ret = amsarray_failure; + return ret; + } + + if(this->data!=NULL) + { + for(I=0;Ilength && Idata[I]; + } + for(I=ind+1;Ilength && (I-1)data[I]; + } + } + + //steal data from narr (should be similar to what std::move would do?) + if(this->data!=NULL) {delete[] this->data; this->data=NULL;} + this->length = narr.length; + this->data = narr.data; + narr.length = 0; + narr.data = NULL; + + return ret; +} + +//finds the first instance of val in the array +template amsarray_size_t amsarray::find(const T& val) +{ + amsarray_size_t ret = -1; + amsarray_size_t I; + + for(I=0;Ilength;I++) + { + if(this->data[I]==val) + { + ret = I; + break; + } + } + + return ret; +} + +//finds the next instance of val, starting consideration at indstart +template amsarray_size_t amsarray::findnext(amsarray_size_t indstart, const T& val) +{ + amsarray_size_t ret = -1; + amsarray_size_t I; + + for(I=indstart;Ilength;I++) + { + if(this->data[I]==val) + { + ret = I; + break; + } + } + + return ret; +} + +//finds where to insert a particular value such that the list remains ordered +template amsarray_size_t amsarray::find_insert_ordered(const T& val) +{ + amsarray_size_t ret = -1; + amsarray_size_t I; + + ret = 0; + for(I=0;Ilength;I++) + { + ret = I+1; + if(this->data[I]>val) + { + ret = I; + break; + } + } + ret = (ret<0) ? 0 : ret; + ret = (ret>this->length) ? this->length : ret; + + + return ret; +} + + +template void amsarray_operator_comp_tf( + const amsarray *a, + const amsarray *b, + amsarray *cmp, + int threadnum, int nthreads +) +{ + int I0,I1,Is,I; + + + Is = (nthreads<=1) ? a->length : a->length/nthreads; + I0 = Is*threadnum; + I1 = (threadnum>=(nthreads-1))? a->length: Is*(threadnum+1); + + cmp->data[threadnum] = 1; + for(I=I0;Idata[I]!=b->data[I]) + { + cmp->data[threadnum] = 0; + break; + } + } + return; +} + +template bool amsarray::operator==(const amsarray& other) const +{ + bool ret = 1; + amsarray cmp; + amsarray_size_t I; + int J; + int nthreads; + std::vector threads; + + if(this->length != other.length) + { + ret = 0; + return ret; + } + if(this->length == 0) + { + ret = 1; + return ret; + } + if(this->length < amsmathutil25_threadpsz) + { + for(I=0;Ilength;I++) + { + if(this->data[I]!=other.data[I]) + { + ret = 0; + break; + } + } + } + else + { + //threaded operation + nthreads = std::thread::hardware_concurrency(); + nthreads = (nthreads<1) ? 1 : nthreads; + nthreads = (nthreads>amsmathutil25_maxthreads) ? amsmathutil25_maxthreads : nthreads; + //if(nthreads<1) nthreads=1; + //if(nthreads>narray_max_threads) nthreads = narray_max_threads; + threads.resize(nthreads); + cmp.resize(nthreads); + for(J=0;J, + this, + &other, + &cmp, + J,nthreads + ); + } + for(J=0;Jjoin(); + delete threads[J]; + threads[J]= NULL; + } + } + + ret = 1; + for(J=0;J bool amsarray::operator!=(const amsarray& other) const +{ + return !(*this==other); +} + +//aliases to insert/erase operations +template int amsarray::append(const T& val) +{ + int ret = amsarray_success; + ret = insert(val,length); + return ret; +} + +template int amsarray::prepend(const T& val) +{ + int ret = amsarray_success; + ret = insert(val,0); + return ret; +} + +template int amsarray::push_back(const T& val) +{ + return append(val); +} + +template int amsarray::push_front(const T& val) +{ + return prepend(val); +} + +template T amsarray::pop_back() +{ + T ret = data[length-1]; + erase(length-1); + return ret; +} + +template T amsarray::pop_front() +{ + T ret = data[0]; + erase(0); + return ret; +} + +template void amsarray_select_tf( + int threadnum, + int nthreads, + amsarray *array, + amsarray *inds, + amsarray *ret +) +{ + amsarray_size_t I,I0,I1,Is,N; + amsarray_size_t ind, N2; + T defval = T(); + N = inds->length; + N2 = array->length; + N = (N<=0) ? 0 : N; + Is = (nthreads>=1) ? N/nthreads : N; + I0 = Is*(threadnum); + I1 = (threadnumat(I); + if(ind<0 || ind >=N2) + { + ret->data[I] = defval; + } + else + { + ret->data[I] = array->data[ind]; + } + } + return; +} + +//returns an array that is {thisarray[inds[0]],thisarray[inds[1]],...} +template amsarray amsarray::select(amsarray inds) +{ + int res; + amsarray ret; + amsarray_size_t psize = inds.length; + amsarray_size_t I, ind; + T defval = T(); + + res = ret.resize(psize); + if(res!=amsarray_success) + { + ret.resize(0); + return ret; + } + + if(psize=length) + { + ret[I] = defval; + } + else + { + ret[I] = data[ind]; + } + } + } + else + { + threaded_execute( + &amsarray_select_tf, + inds.length, + this, + &inds, + &ret + ); + } + + return ret; +} + +template void amsarray_reverse_tf( + int threadnum, + int nthreads, + amsarray *array, + amsarray *ret +) +{ + amsarray_size_t I,I0,I1,Is,N; + T defval = T(); + N = array->length; + N = (N<=0) ? 0 : N; + Is = (nthreads>=1) ? N/nthreads : N; + I0 = Is*(threadnum); + I1 = (threadnumdata[I] = array->data[N-I-1]; + } + + return; +} + +//returns an array that is this array in reverse order +template amsarray amsarray::reverse() +{ + int res; + amsarray ret; + amsarray_size_t psize = length; + amsarray_size_t I; + T defval = T(); + + res = ret.resize(psize); + if(res!=amsarray_success) + { + ret.resize(0); + return ret; + } + + if(psize int amsarray_quicksort_round( + amsarray *array, + amsarray *permarray, + ams::pair range, + amsarray_size_t *pivot_index, + ams::pair *leftrange, + ams::pair *rightrange +) +{ + int ret = 0; + bool b1,b2; + amsarray_size_t I,J,P; + T v1,v2; + amsarray_size_t tmp; + + b1 = range.a < 0 || range.b < 0; + b2 = (range.b - range.a) < 2; + if((b1 || b2) + { + //there is no more work to be done within this range + *pivot_index = -1; + *leftrange = ams::pair(-1,-1); + *rightrange = ams::pair(-1,-1); + ret = -1; + return ret; + } + if((range.b - range.a) == 2) + { + //two element range - sort directly + v1 = array->data[permarray->data[range.a]]; + v2 = array->data[permarray->data[range.b]]; + if(v2data[range.a]; + permarray->data[range.a] = permarray->data[range.b]; + permarray->data[range.b] = tmp; + } + //there is no more work to be done within this range + *pivot_index = -1; + *leftrange = ams::pair(-1,-1); + *rightrange = ams::pair(-1,-1); + ret = -1; + return ret; + } + else + { + //perform quicksort iteration + + //choose midpoint pivot + P = (range.a + range.b)/2; + P = (P=range.b) ? range.b-1 : P; + + + + } + + + + + return ret; +} + + +//returns an array of indices that is a permutation which will sort +//this array in ascending order +template amsarray amsarray::sort_permutation() +{ + int res; + amsarray ret; + + return ret; +} + + + + + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/util/amsmathutil25_bufferops.hpp b/include/amsmathutil25/util/amsmathutil25_bufferops.hpp new file mode 100644 index 0000000..d272583 --- /dev/null +++ b/include/amsmathutil25/util/amsmathutil25_bufferops.hpp @@ -0,0 +1,26 @@ +#ifndef __AMSMATHUTIL25_BUFFEROPS_HPP__ +#define __AMSMATHUTIL25_BUFFEROPS_HPP__ + +namespace ams +{ + typedef int64_t buffer_size_t; + + //threaded set - sets N elements of bufffer to val + template int buffer_set(T* buffer, buffer_size_t N, const T val); + + //threaded set - sets N elements of bufffer to val + template int buffer_set(T* buffer, buffer_size_t indstart, buffer_size_t indstop, const T val); + + //threaded copy of bufferfrom[offsetfrom + I] to bufferto[offsetto+I] I = [0,N) + template int buffer_cast_copy(T1* bufferto, const T2* bufferfrom, + buffer_size_t offsetto, buffer_size_t offsetfrom, buffer_size_t N); + + //threaded copy of bufferfrom to bufferto + template int buffer_cast_copy(T1* bufferto, const T2* bufferfrom, buffer_size_t N); + +}; //end namespace ams + +#include + +#endif + diff --git a/include/amsmathutil25/util/amsmathutil25_bufferops_impl.hpp b/include/amsmathutil25/util/amsmathutil25_bufferops_impl.hpp new file mode 100644 index 0000000..4768370 --- /dev/null +++ b/include/amsmathutil25/util/amsmathutil25_bufferops_impl.hpp @@ -0,0 +1,161 @@ +#ifndef __AMSMATHUTIL25_BUFFEROPS_IMPL_HPP__ +#define __AMSMATHUTIL25_BUFFEROPS_IMPL_HPP__ + +namespace ams +{ + + template void buffer_set_tf( + int threadnum, + int nthread, + T *buffer, + buffer_size_t indstart, + buffer_size_t indstop, + const T val + ) + { + buffer_size_t I,I0,I1,Is,N; + + N = indstop-indstart; + N = (N<0) ? 0 : N; + //Is = N/nthread; + + Is = (nthread<=0) ? N : N/nthread; + I0 = Is*(threadnum); + I1 = (threadnum>=(nthread-1)) ? N : Is*(threadnum+1); + + // I0 = (I0<=0) ? 0 : I0; + // I1 = (I1<=0) ? 0 : I1; + I0 = (I0>N) ? N : I0; + I1 = (I1>N) ? N : I1; + + for(I=I0;I int buffer_set(T* buffer, buffer_size_t indstart, buffer_size_t indstop, const T val) + { + int ret = amsmathutil25_success; + buffer_size_t psize; + buffer_size_t I; + + indstart = (indstart<0) ? 0 : indstart; + indstop = (indstop<0) ? 0 : indstop; + indstop = (indstop,(int64_t) psize, + buffer,indstart,indstop,val + ); + + } + return ret; + } + + //threaded set - sets N elements of bufffer to val + template int buffer_set(T* buffer, buffer_size_t N, const T val) + { + int ret = amsmathutil25_success; + buffer_size_t I; + + if(N(buffer,0,N,val); + } + return ret; + } + + template void buffer_cast_copy_tf( + int threadnum, + int nthread, + T1 *bufferto, + const T2 *bufferfrom, + buffer_size_t offsetto, + buffer_size_t offsetfrom, + buffer_size_t N + ) + { + buffer_size_t I,I0,I1,Is; + + // Is = N/(nthread-1); + // Is = (Is<=0) ? 1 : Is; + // I0 = Is*(threadnum); + // I1 = Is*(threadnum+1); + // I0 = (I0<=0) ? 0 : I0; + // I1 = (I1<=0) ? 0 : I1; + // I0 = (I0>N) ? N : I0; + // I1 = (I1>N) ? N : I1; + + Is = (nthread<=0) ? N : N/nthread; + I0 = Is*(threadnum); + I1 = (threadnum>=(nthread-1)) ? N : Is*(threadnum+1); + + // I0 = (I0<=0) ? 0 : I0; + // I1 = (I1<=0) ? 0 : I1; + I0 = (I0>N) ? N : I0; + I1 = (I1>N) ? N : I1; + + for(I=I0;I int buffer_cast_copy(T1* bufferto, const T2* bufferfrom, + buffer_size_t offsetto, buffer_size_t offsetfrom, buffer_size_t N) + { + int ret = amsmathutil25_success; + + ams::threaded_execute( + &buffer_cast_copy_tf,(int64_t) N, + bufferto,bufferfrom,offsetto,offsetfrom,N + ); + + return ret; + } + + //threaded copy of bufferfrom to bufferto + template int buffer_cast_copy(T1* bufferto, const T2* bufferfrom, buffer_size_t N) + { + int ret = amsmathutil25_success; + buffer_size_t I; + + if(N(bufferto,bufferfrom,0,0,N); + } + + return ret; + } + +}; //end namespace ams + +#endif + diff --git a/include/amsmathutil25/util/amsmathutil25_util.hpp b/include/amsmathutil25/util/amsmathutil25_util.hpp new file mode 100644 index 0000000..3041858 --- /dev/null +++ b/include/amsmathutil25/util/amsmathutil25_util.hpp @@ -0,0 +1,38 @@ +#ifndef __AMSMATHUTIL25_UTIL_HPP__ +#define __AMSMATHUTIL25_UTIL_HPP__ + +namespace ams +{ + +//A template function that takes as input a function pointer and a series of arguments +//The function is executed with fptr(threadnum, nthreads, otherargs...) with a certain number of threads +//psize must be supplied to determine whether to execute in threaded mode or not. +template int threaded_execute(callable &&fptr, int64_t psize, argst&&... args); + +template struct pair +{ +public: + T1 a; + T2 b; + pair() {a = T1(); b = T2();} + pair(const T1 &_a, const T2& _b) {a = _a; b = _b;} +}; + +template struct triple +{ +public: + T1 a; + T2 b; + T3 c; + triple() {a = T1(); b = T2(); c = T3();} + triple(const T1 &_a, const T2& _b, const T3& _c) {a = _a; b = _b; c = _c;} +}; + +}; //end namespace ams + +#include +#include +#include + +#endif + diff --git a/include/amsmathutil25/util/amsmathutil25_utilimpl.hpp b/include/amsmathutil25/util/amsmathutil25_utilimpl.hpp new file mode 100644 index 0000000..0bce248 --- /dev/null +++ b/include/amsmathutil25/util/amsmathutil25_utilimpl.hpp @@ -0,0 +1,71 @@ +#ifndef __AMSMATHUTIL25_UTILIMPL_HPP__ +#define __AMSMATHUTIL25_UTILIMPL_HPP__ + +namespace ams +{ + +//A template function that takes as input a function pointer and a series of arguments +//The function is executed with fptr(threadnum, nthreads, otherargs...) with a certain number of threads +//psize must be supplied to determine whether to execute in threaded mode or not. +template int threaded_execute(callable &&fptr, int64_t psize, argst&&... args) +{ + int ret = amsmathutil25_success; + int nthreads; + int I; + std::vector threads; + + if(psize(fptr), + I, + nthreads, + std::forward(args)... + ); + } + else + { + nthreads = std::thread::hardware_concurrency(); //number of cpu cores the system thinks you have + nthreads = (nthreads<=0) ? 1 : nthreads; + nthreads = (nthreads>amsmathutil25_maxthreads) ? amsmathutil25_maxthreads : nthreads; + threads.resize(nthreads); + for(I=0;I(fptr), + I, + nthreads, + std::forward(args)... + ); + } + for(I=0;Ijoin(); + delete threads[I]; + threads[I] = NULL; + } + } + } + + return ret; +} + +}; //end namespace ams + + +#endif + diff --git a/src/amsmathutil25/testing/amsmathtuil25_test1.cpp b/src/amsmathutil25/testing/amsmathtuil25_test1.cpp new file mode 100644 index 0000000..696873f --- /dev/null +++ b/src/amsmathutil25/testing/amsmathtuil25_test1.cpp @@ -0,0 +1,96 @@ +#include + +namespace ams +{ +namespace amsmathutil25 +{ + +void test_amsarray1() +{ + amsarray a,b,c,q; + int64_t I; + + printf("Tests for amsarray...\n"); + q.resize(10); + q[0] = 1; + q[9] = 5; + for(I=0;I<10;I++) + { + printf("q[%ld] = %1.3f\n",I,q[I]); + } + + q.resize(12); + a = q; + a = b = q; + for(I=0;I<12;I++) + { + printf("a[%ld] = %1.3f\n",I,a[I]); + } + + q.resize(8); + a = q; + a = b = q; + for(I=0;I<8;I++) + { + printf("a[%ld] = %1.3f\n",I,a[I]); + } + + a.resize(amsmathutil25_threadpsz + 10); + a.setall(55); + printf("a.length=%ld\n",a.length); + + b = a; + for(I=amsmathutil25_threadpsz;I a,b,c; + amsarray q; + int64_t I; + + printf("Tests for amsarray...\n"); + + a.resize(0); + b = a; + a.resize(-10); + b = a; + + printf("a==b?%d\n",a==b); + + a.resize(10); + b = a; + + printf("a==b?%d\n",a==b); + + a.resize(10000); + b = a; + + printf("a==b?%d\n",a==b); + + a.setall(55); + b = a; + + printf("a==b?%d\n",a==b); + + a[0] = 1; + + printf("a==b?%d\n",a==b); + + q = (amsarray)a; + for(I=q.length-10;I + +namespace ams +{ + +template<> void amsarray::print(bool newline,int printstyle) +{ + amsarray_size_t I; + + printf("{"); + if(data!=NULL) + { + for(I=0;I0) printf("%d",data[length-1]); + } + printf("}"); + if(newline==1) printf("\n"); + + return; +} + +template<> void amsarray::print(bool newline,int printstyle) +{ + amsarray_size_t I; + + printf("{"); + if(data!=NULL) + { + for(I=0;I0) printf("%ld",data[length-1]); + } + printf("}"); + if(newline==1) printf("\n"); + + return; +} + +template<> void amsarray::print(bool newline,int printstyle) +{ + amsarray_size_t I; + + printf("{"); + if(data!=NULL) + { + for(I=0;I0) printf("%1.3f",data[length-1]); + } + printf("}"); + if(newline==1) printf("\n"); + + return; +} + +template<> void amsarray::print(bool newline,int printstyle) +{ + amsarray_size_t I; + + printf("{"); + if(data!=NULL) + { + for(I=0;I0) printf("%1.3f",data[length-1]); + } + printf("}"); + if(newline==1) printf("\n"); + + return; +} + + + +}; \ No newline at end of file diff --git a/src/amsmathutil25/util/amsmathutil25_amsarray_sort.cpp b/src/amsmathutil25/util/amsmathutil25_amsarray_sort.cpp new file mode 100644 index 0000000..8b7af57 --- /dev/null +++ b/src/amsmathutil25/util/amsmathutil25_amsarray_sort.cpp @@ -0,0 +1,62 @@ +#include + +namespace ams +{ + +void amsarray_permutation_identity_tf( + int threadnum, + int nthreads, + amsarray *ret +) +{ + amsarray_size_t I,I0,I1,Is,N; + N = ret->length; + N = (N<=0) ? 0 : N; + Is = (nthreads>=1) ? N/nthreads : N; + I0 = Is*(threadnum); + I1 = (threadnumdata[I] = I; + } + + + return; +} + +// {0, 1, 2, .... N} +amsarray permutation_identity(amsarray_size_t _length) +{ + amsarray ret; + int res; + amsarray_size_t psize = _length; + amsarray_size_t I; + + res = ret.resize(psize); + if(res!=amsarray_success) + { + ret.resize(0); + return ret; + } + + if(psize