PLearn 0.1
VVec.h
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // PLearn (A C++ Machine Learning Library)
00004 // Copyright (C) 1998 Pascal Vincent
00005 // Copyright (C) 1999-2001 Pascal Vincent, Yoshua Bengio, Rejean Ducharme and University of Montreal
00006 // Copyright (C) 2002 Pascal Vincent, Julien Keable, Xavier Saint-Mleux
00007 //
00008 // Redistribution and use in source and binary forms, with or without
00009 // modification, are permitted provided that the following conditions are met:
00010 //
00011 //  1. Redistributions of source code must retain the above copyright
00012 //     notice, this list of conditions and the following disclaimer.
00013 //
00014 //  2. Redistributions in binary form must reproduce the above copyright
00015 //     notice, this list of conditions and the following disclaimer in the
00016 //     documentation and/or other materials provided with the distribution.
00017 //
00018 //  3. The name of the authors may not be used to endorse or promote
00019 //     products derived from this software without specific prior written
00020 //     permission.
00021 //
00022 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
00023 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00024 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
00025 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00026 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00027 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00028 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00029 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00030 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00031 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00032 //
00033 // This file is part of the PLearn library. For more information on the PLearn
00034 // library, go to the PLearn Web site at www.plearn.org
00035 
00036 
00037 /* *******************************************************
00038  * $Id: VVec.h 8239 2007-11-09 15:35:34Z nouiz $
00039  ******************************************************* */
00040 
00041 
00044 #ifndef VVec_INC
00045 #define VVec_INC
00046 
00047 #include <plearn/base/Object.h>
00048 #include "VMatrix.h"
00049 
00050 namespace PLearn {
00051 
00053 
00054 class VVec : public Object
00055 {
00056     typedef Object inherited;
00057 
00058 public:
00059     // We leave the actual representation choice to some
00060     // underlying virtual matrix. A VVec simply references a subRow of a VMatrix
00061     PP<VMatrix> data;
00062     int row_index;
00063     int col_index;
00064     int length_;
00065 
00066     VVec()
00067         :row_index(0), col_index(0), length_(0) {}
00068 
00069     VVec(const PP<VMatrix>& m, int i)
00070         :data(m), row_index(i), col_index(0), length_(m->width()) {}
00071 
00072     VVec(const PP<VMatrix>& m, int i, int j, int l)
00073         :data(m), row_index(i), col_index(j), length_(l) {}
00074 
00078     VVec(const Vec& v);
00079 
00080     inline int length() const { return length_; }
00081     inline int size() const { return length_; }
00082 
00083     // to keep compatibility with most current code,
00084     // VVec's can be converted to Vec's
00085     inline void toVec(const Vec& v) const
00086     {
00087 #ifdef BOUNDCHECK
00088         if(v.length()!=length_)
00089             PLERROR("In VVec::toVec length of Vec and VVec differ!");
00090 #endif
00091         data->getSubRow(row_index,col_index,v);
00092     }
00093 
00095     inline void copyFrom(const Vec& v) const
00096     {
00097 #ifdef BOUNDCHECK
00098         if(v.length()!=length_)
00099             PLERROR("In VVec::copyFrom length of Vec and VVec differ!");
00100 #endif
00101         data->putSubRow(row_index,col_index,v);
00102     }
00103 
00104 
00105     inline VVec subVec(int j, int len)
00106     { return VVec(data, row_index, col_index+j, len); }
00107 
00109     operator Vec() const
00110     {
00111         Vec v(length_);
00112         data->getSubRow(row_index,col_index,v);
00113         return v;
00114     }
00115 
00116     virtual void newwrite(PStream& out) const
00117     {
00118         switch(out.outmode)
00119         {
00120         case PStream::raw_ascii:
00121         case PStream::pretty_ascii:
00122         {
00123             out << ((Vec)*this) << flush;
00124             break;
00125         }
00126         default:
00127             inherited::newwrite(out);
00128         }
00129     }
00130 
00131     PLEARN_DECLARE_OBJECT(VVec);
00132     static void declareOptions(OptionList &ol);
00133 
00134     virtual void build();
00135 private:
00136     void build_();
00137 };
00138 
00139 inline void operator>>(const VVec& vv, const Vec& v)
00140 { vv.toVec(v); }
00141 
00142 inline void operator<<(const VVec& vv, const Vec& v)
00143 { vv.copyFrom(v); }
00144 
00145 inline void operator<<(const Vec& v, const VVec& vv)
00146 { vv.toVec(v); }
00147 
00148 inline void operator>>(const Vec& v, const VVec& vv)
00149 { vv.copyFrom(v); }
00150 
00151 } // end of namespace PLearn
00152 
00153 #endif
00154 
00155 
00156 /*
00157   Local Variables:
00158   mode:c++
00159   c-basic-offset:4
00160   c-file-style:"stroustrup"
00161   c-file-offsets:((innamespace . 0)(inline-open . 0))
00162   indent-tabs-mode:nil
00163   fill-column:79
00164   End:
00165 */
00166 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines