toon-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Toon-members] TooN Makefile.in TooN.h numdiff.awk internal/al...


From: Edward Rosten
Subject: [Toon-members] TooN Makefile.in TooN.h numdiff.awk internal/al...
Date: Mon, 28 Sep 2009 08:31:58 +0000

CVSROOT:        /cvsroot/toon
Module name:    TooN
Changes by:     Edward Rosten <edrosten>        09/09/28 08:31:58

Modified files:
        .              : Makefile.in TooN.h numdiff.awk 
        internal       : allocator.hh vbase.hh vector.hh 
        test           : resize_test.cc 

Log message:
        Reworked resizable vectors.
        
        Assignment (except for construction) does not cause a resize: it works 
exactly
        the same as Dynamic vectors.  Resizing is only caused by the .resize() 
method.
        Resize now keeps data where possible, but new elements are 
uninitialized.
        
        Internally the memory is managed by std::vector, so growing repeatedly 
is
        efficient.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/Makefile.in?cvsroot=toon&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/TooN/TooN.h?cvsroot=toon&r1=1.55&r2=1.56
http://cvs.savannah.gnu.org/viewcvs/TooN/numdiff.awk?cvsroot=toon&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/allocator.hh?cvsroot=toon&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vbase.hh?cvsroot=toon&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vector.hh?cvsroot=toon&r1=1.50&r2=1.51
http://cvs.savannah.gnu.org/viewcvs/TooN/test/resize_test.cc?cvsroot=toon&r1=1.1&r2=1.2

Patches:
Index: Makefile.in
===================================================================
RCS file: /cvsroot/toon/TooN/Makefile.in,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- Makefile.in 23 Sep 2009 20:38:09 -0000      1.12
+++ Makefile.in 28 Sep 2009 08:31:58 -0000      1.13
@@ -36,7 +36,7 @@
        doxygen 
 
 
-TESTS=invert slice
+TESTS=invert slice vector_resize
 
 
 TEST_RESULT=$(TESTS:%=regressions/%.result)
@@ -46,6 +46,7 @@
        rm -f $(TEST_FILES)
 
 test:regressions/results
+       @echo -------------- Test Results ---------------
        @cat regressions/results
 
 regressions/results:$(TEST_RESULT)

Index: TooN.h
===================================================================
RCS file: /cvsroot/toon/TooN/TooN.h,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -b -r1.55 -r1.56
--- TooN.h      8 Sep 2009 14:25:09 -0000       1.55
+++ TooN.h      28 Sep 2009 08:31:58 -0000      1.56
@@ -36,6 +36,7 @@
 #include <limits>
 #include <new>
 #include <utility>
+#include <vector>
 #include <TooN/internal/config.hh>
 #include <TooN/internal/typeof.hh>
 #include <TooN/internal/deprecated.hh>

Index: numdiff.awk
===================================================================
RCS file: /cvsroot/toon/TooN/numdiff.awk,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- numdiff.awk 23 Sep 2009 13:43:55 -0000      1.1
+++ numdiff.awk 28 Sep 2009 08:31:58 -0000      1.2
@@ -9,8 +9,36 @@
        return x<0?-x:x
 }
 
+function ignore_and_process(line,       a)
+{
+       if(line ~ /^[[:space:]]*$/)
+               return 1
+       else if (line ~ /^[[:space:]]*#>/)
+       {
+               split(line, a)
+               if(a[2] == "t")
+                       t = a[3]
+
+               return 1
+       }
+       else if (line ~ /^[[:space:]]*#/)
+               return 1
+       else
+               return 0
+}
+
 BEGIN{
        
+       #This program compares two files to see if they are the same
+       #Whitespace is ignored
+       #Numbers must match to within a given threshold.
+
+       #Lines starting with a # are also ignored.
+       #If a # is *not* the first non-whitespace, then it is not ignored.
+       #Lines starting with #> are directives and are processed further
+       #Directives are
+       #   #> t xx                 Set t to xx
+
        if(t == "")
                t = 1e-6
 
@@ -19,11 +47,11 @@
                #Get the next non blank line from the two files
                do
                 status1 = (getline s1 < f1)
-               while(status1 && s1 ~ /^[[:space:]]*$/)
+               while(status1 && ignore_and_process(s1))
 
                do
                 status2 = (getline s2 < f2)
-               while(status2 && s2 ~ /^[[:space:]]*$/)
+               while(status2 && ignore_and_process(s2))
                
                #Check to see if the files have both ended
                if(status1 != status2)

Index: internal/allocator.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/allocator.hh,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- internal/allocator.hh       7 Sep 2009 11:13:15 -0000       1.34
+++ internal/allocator.hh       28 Sep 2009 08:31:58 -0000      1.35
@@ -58,6 +58,15 @@
                debug_initialize(my_data, Size);        
        }
 
+       Precision *data()
+       {
+               return my_data;
+       };
+
+       const Precision *data() const
+       {
+               return my_data;
+       };
        Precision my_data[Size];
 };
 
@@ -69,6 +78,16 @@
                debug_initialize(my_data, Size);        
        }
 
+       double *data()
+       {
+               return my_data;
+       };
+
+       const double *data() const
+       {
+               return my_data;
+       };
+
        double my_data[Size] TOON_ALIGN8 ;
 };
 
@@ -90,6 +109,16 @@
 
                Precision *my_data;
        
+               Precision *data()
+               {
+                       return my_data;
+               };
+
+               const Precision *data() const
+               {
+                       return my_data;
+               };
+       
                StackOrHeap(const StackOrHeap& from)
                :my_data(new Precision[Size])
                {
@@ -129,10 +158,6 @@
                return Size;
        }
 
-       void try_resize(int)
-       {}
-       template<class Op> void try_resize(const Operator<Op>&)
-       {}
 };
 
 template<class Precision> struct VectorAlloc<Dynamic, Precision> {
@@ -167,81 +192,61 @@
                delete[] my_data;
        }
 
-       void try_resize(int)
-       {}
+       Precision *data()
+       {
+               return my_data;
+       };
+
+       const Precision *data() const
+       {
+               return my_data;
+       };
 
-       template<class Op> void try_resize(const Operator<Op>&)
-       {}
 };
 
 
 template<class Precision> struct VectorAlloc<Resizable, Precision> {
        protected: 
-               Precision * my_data;
-               int my_size;
-
+               std::vector<Precision> numbers;
        
        public:
 
-               VectorAlloc(const VectorAlloc& v)
-               :my_data(new Precision[v.my_size]), my_size(v.my_size)
-               { 
-                       for(int i=0; i < my_size; i++)
-                               my_data[i] = v.my_data[i];
-               }
-
                VectorAlloc()
-               :my_data(0), my_size(0)
                { 
                }
 
                VectorAlloc(int s)
-               :my_data(new Precision[s]), my_size(s)
+               :numbers(s)
                { 
-                       debug_initialize(my_data, my_size);     
+                       debug_initialize(data(), size());       
                }
 
                template <class Op>
                VectorAlloc(const Operator<Op>& op) 
-               : my_data(new Precision[op.size()]), my_size(op.size()) 
+               :numbers(op.size()) 
                {
-                       debug_initialize(my_data, my_size);     
+                       debug_initialize(data(), size());       
                }
 
                int size() const {
-                       return my_size;
-               }
-
-               ~VectorAlloc(){
-                       delete[] my_data;
+                       return numbers.size();
                }
 
-               void resize(int s)
-               {
-                       if(s != my_size)
-                       {
-                               //First, invalidate the old data
-                               my_size=0;
-                               delete[] my_data;
-                               
-                               my_data = new Precision[s];
-                               my_size = s;
+               Precision* data() {
+                       return &numbers[0];
                        }
 
-                       debug_initialize(my_data, my_size);
+               const Precision* data()const  {
+                       return &numbers[0];
                }
 
-               void try_resize(int s)
-               {
-                       resize(s);
-               }
-
-
-               template<class Op> void try_resize(const Operator<Op>& op)
+               void resize(int s)
                {
-                       resize(op.size());
+                       int old_size = size();
+                       numbers.resize(s);
+                       if(s > old_size)
+                               debug_initialize(data()+old_size, s-old_size);
                }
-
 };
 
 template<int S, class Precision> struct VectorSlice
@@ -262,11 +267,15 @@
        template<class Op>
        VectorSlice(const Operator<Op>& op) : my_data(op.data()) {}
 
-       void try_resize(int)
-       {}
+       Precision *data()
+       {
+               return my_data;
+       };
 
-       template<class Op> void try_resize(const Operator<Op>&)
-       {}
+       const Precision *data() const
+       {
+               return my_data;
+       };
 };
 
 template<class Precision> struct VectorSlice<-1, Precision>
@@ -285,11 +294,15 @@
                return my_size;
        }
 
-       void try_resize(int)
-       {}
+       Precision *data()
+       {
+               return my_data;
+       };
 
-       template<class Op> void try_resize(const Operator<Op>&)
-       {}
+       const Precision *data() const
+       {
+               return my_data;
+       };
 };
 
 

Index: internal/vbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vbase.hh,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- internal/vbase.hh   27 Aug 2009 17:29:31 -0000      1.39
+++ internal/vbase.hh   28 Sep 2009 08:31:58 -0000      1.40
@@ -107,30 +107,30 @@
        template<class Op>
        GenericVBase(const Operator<Op> & op) : Mem(op), 
StrideHolder<Stride>(op) {}
 
-       using Mem::my_data;
+       using Mem::data;
        using Mem::size;
 
        Precision& operator[](int i) {
                Internal::check_index(size(), i);
-               return my_data[i * stride()];
+               return data()[i * stride()];
        }
 
        const Precision& operator[](int i) const {
                Internal::check_index(size(), i);
-               return my_data[i * stride()];
+               return data()[i * stride()];
        }
 
        //Completely generic Vector slice operations below:
        template<int Start, int Length> 
        Vector<Length, Precision, SliceVBase<Stride> > slice(int start, int 
length){
                Internal::CheckSlice<Size, Start, Length>::check(size(), start, 
length);        
-               return Vector<Length, Precision, SliceVBase<Stride> >(my_data + 
stride() * (Start==Dynamic?start:Start), Length==Dynamic?length:Length, 
stride(), Slicing());
+               return Vector<Length, Precision, SliceVBase<Stride> >(data() + 
stride() * (Start==Dynamic?start:Start), Length==Dynamic?length:Length, 
stride(), Slicing());
        }
 
        template<int Start, int Length> 
        const Vector<Length, Precision, SliceVBase<Stride> > slice(int start, 
int length) const{
                Internal::CheckSlice<Size, Start, Length>::check(size(), start, 
length);        
-               return Vector<Length, Precision, SliceVBase<Stride> 
>(const_cast<Precision*>(my_data) + stride() * (Start==Dynamic?start:Start), 
Length==Dynamic?length:Length, stride(), Slicing());
+               return Vector<Length, Precision, SliceVBase<Stride> 
>(const_cast<Precision*>(data()) + stride() * (Start==Dynamic?start:Start), 
Length==Dynamic?length:Length, stride(), Slicing());
        }
 
        
@@ -217,37 +217,37 @@
 
        //Other slices below
        const Matrix<1, Size, Precision, Slice<1,Stride> > as_row() const{
-               return Matrix<1, Size, Precision, Slice<1,Stride> 
>(const_cast<Precision*>(my_data), 1, size(), 1, stride(), Slicing());
+               return Matrix<1, Size, Precision, Slice<1,Stride> 
>(const_cast<Precision*>(data()), 1, size(), 1, stride(), Slicing());
        }
 
        Matrix<1, Size, Precision, Slice<1,Stride> > as_row(){
-               return Matrix<1, Size, Precision, Slice<1,Stride> >(my_data, 1, 
size(), 1, stride(), Slicing());
+               return Matrix<1, Size, Precision, Slice<1,Stride> >(data(), 1, 
size(), 1, stride(), Slicing());
        }
 
        const Matrix<Size, 1, Precision, Slice<Stride,1> > as_col() const{
-               return Matrix<Size, 1, Precision, Slice<Stride,1> 
>(const_cast<Precision*>(my_data), size(), 1, stride(), 1, Slicing());
+               return Matrix<Size, 1, Precision, Slice<Stride,1> 
>(const_cast<Precision*>(data()), size(), 1, stride(), 1, Slicing());
        }
 
        Matrix<Size, 1, Precision, Slice<Stride,1> > as_col(){
-               return Matrix<Size, 1, Precision, Slice<Stride,1> >(my_data, 
size(), 1, stride(), 1, Slicing());
+               return Matrix<Size, 1, Precision, Slice<Stride,1> >(data(), 
size(), 1, stride(), 1, Slicing());
        }
 
        typedef Vector<Size, Precision, SliceVBase<Stride> > as_slice_type;
        
        Vector<Size, Precision, SliceVBase<Stride> > as_slice(){                
 
-               return Vector<Size, Precision, SliceVBase<Stride> >(my_data, 
size(), stride(), Slicing());         
+               return Vector<Size, Precision, SliceVBase<Stride> >(data(), 
size(), stride(), Slicing());         
        }
 
        const Vector<Size, Precision, SliceVBase<Stride> > as_slice() const {   
              
-               return Vector<Size, Precision, SliceVBase<Stride> 
>(const_cast<Precision*>(my_data), size(), stride(), Slicing());         
+               return Vector<Size, Precision, SliceVBase<Stride> 
>(const_cast<Precision*>(data()), size(), stride(), Slicing());         
        }
 
        DiagonalMatrix<Size,Precision, SliceVBase<Stride> > as_diagonal() {
-               return DiagonalMatrix<Size, Precision, SliceVBase<Stride> > 
(my_data, size(), stride(), Slicing());
+               return DiagonalMatrix<Size, Precision, SliceVBase<Stride> > 
(data(), size(), stride(), Slicing());
        }
 
        const DiagonalMatrix<Size,Precision, SliceVBase<Stride> > as_diagonal() 
const {
-               return DiagonalMatrix<Size, Precision, SliceVBase<Stride> > 
(const_cast<Precision*>(my_data), size(), stride(), Slicing());
+               return DiagonalMatrix<Size, Precision, SliceVBase<Stride> > 
(const_cast<Precision*>(data()), size(), stride(), Slicing());
        }
 
 };

Index: internal/vector.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vector.hh,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -b -r1.50 -r1.51
--- internal/vector.hh  7 Sep 2009 11:13:15 -0000       1.50
+++ internal/vector.hh  28 Sep 2009 08:31:58 -0000      1.51
@@ -127,7 +127,6 @@
 template<int Size=Dynamic, typename Precision=DefaultPrecision, typename 
Base=Internal::VBase>
 struct Vector : public Base::template VLayout<Size, Precision> {
 protected:
-       using Base::template VLayout<Size, Precision>::try_resize;
 public:
   // sneaky hack: only one of these constructors will work with any given base
   // class but they don't generate errors unless the user tries to use one of 
them
@@ -232,7 +231,6 @@
 
        /// operator = from copy
        inline Vector& operator= (const Vector& from){
-               try_resize(from.size()); //This might do nothing
                SizeMismatch<Size,Size>::test(size(), from.size());
                const int s=size();
                for(int i=0; i<s; i++){
@@ -244,7 +242,6 @@
        /// operator = another Vector
        template<int Size2, typename Precision2, typename Base2>
        Vector<Size,Precision,Base >& operator= (const Vector<Size2, 
Precision2, Base2>& from){
-               try_resize(from.size()); //This might do nothing
                SizeMismatch<Size,Size2>::test(size(), from.size());
                const int s=size();
                for(int i=0; i<s; i++){
@@ -256,7 +253,6 @@
        /// assignment from an Operator object
        template <class Op>
        inline Vector & operator=(const Operator<Op>& op){
-               try_resize(op); //This might do nothing
                op.eval(*this);
                return *this;
        }

Index: test/resize_test.cc
===================================================================
RCS file: /cvsroot/toon/TooN/test/resize_test.cc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- test/resize_test.cc 7 Sep 2009 11:13:15 -0000       1.1
+++ test/resize_test.cc 28 Sep 2009 08:31:58 -0000      1.2
@@ -4,19 +4,25 @@
 
 int main()
 {
-       Vector<Resizable> r;
+       Vector<Resizable> r = makeVector(4);
        Vector<> v1(makeVector(1, 2));
        
+       cout << r << endl;
+       
+       r.resize(v1.size());
        r = v1;
        cout << r << endl;
        Vector<3> v2 = makeVector(2, 3, 4);
+       r.resize(3);
        r = v2;
        cout << r << endl;
        
-       r = Ones(10);
+       r.resize(10);
+       r = Ones;
 
        cout << r << endl;
 
+       r.resize(5);
        r = makeVector(6, 7, 8, 9, 0);
        cout << r << endl;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]