srvector.hpp

00001 /*
00002 **  CXSC is a C++ library for eXtended Scientific Computing (V 2.5.1)
00003 **
00004 **  Copyright (C) 1990-2000 Institut fuer Angewandte Mathematik,
00005 **                          Universitaet Karlsruhe, Germany
00006 **            (C) 2000-2011 Wiss. Rechnen/Softwaretechnologie
00007 **                          Universitaet Wuppertal, Germany   
00008 **
00009 **  This library is free software; you can redistribute it and/or
00010 **  modify it under the terms of the GNU Library General Public
00011 **  License as published by the Free Software Foundation; either
00012 **  version 2 of the License, or (at your option) any later version.
00013 **
00014 **  This library is distributed in the hope that it will be useful,
00015 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 **  Library General Public License for more details.
00018 **
00019 **  You should have received a copy of the GNU Library General Public
00020 **  License along with this library; if not, write to the Free
00021 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 */
00023 
00024 /* CVS $Id: srvector.hpp,v 1.9 2011/06/07 15:17:42 cxsc Exp $ */
00025 
00026 #ifndef _CXSC_SRVECTOR_HPP_INCLUDED
00027 #define _CXSC_SRVECTOR_HPP_INCLUDED
00028 
00029 #include <real.hpp>
00030 #include <intvector.hpp>
00031 #include <rvector.hpp>
00032 #include <intmatrix.hpp>
00033 #include <vector>
00034 #include <map>
00035 #include <iostream>
00036 #include <except.hpp>
00037 #include <cidot.hpp>
00038 #include <sparsedot.hpp>
00039 #include <sparsevector.hpp>
00040 
00041 namespace cxsc {
00042 
00043 class srvector_slice;
00044 class srmatrix;
00045 class srmatrix_slice;
00046 class srmatrix_subv;
00047 
00048 class scvector;
00049 class sivector;
00050 class sivector_slice;
00051 class scivector;
00052 
00053 class srvector {
00054   private:
00055     std::vector<int> p;
00056     std::vector<real> x;
00057     int lb;
00058     int ub;
00059     int n; 
00060 
00061   public:
00062     srvector() : lb(0), ub(-1) , n(0) {
00063     }
00064 
00065     explicit srvector(const int s) : lb(1), ub(s), n(s) {
00066         p.reserve((int)(s*0.1));
00067         x.reserve((int)(s*0.1));
00068     }
00069 
00070     srvector(const int s, const int b) : lb(1), ub(s), n(s) {
00071         p.reserve(b);
00072         x.reserve(b);
00073     }
00074 
00075     srvector(const rvector& v) : lb(Lb(v)), ub(Ub(v)), n(VecLen(v)) {
00076         for(int i=lb ; i<=ub ; i++) {
00077           if(v[i] != 0.0) {
00078             p.push_back(i-lb);
00079             x.push_back(v[i]);
00080           }
00081         }
00082     }
00083 
00084     srvector(const int n, const int nnz, const intvector& index, const rvector& values) : lb(1), ub(n) {
00085       this->n = n;
00086       for(int i=0 ; i<nnz ; i++) {
00087         if(values[Lb(values)+i] != 0.0) {
00088           p.push_back(index[Lb(index)+i]);
00089           x.push_back(values[Lb(values)+i]);
00090         }
00091       }
00092       
00093     }
00094 
00095     srvector(const int n, const int nnz, const int *index, const real *values) : lb(1), ub(n) {
00096       this->n = n;
00097       for(int i=0 ; i<nnz ; i++) {
00098         if(values[i] != 0.0) {
00099           p.push_back(index[i]);
00100           x.push_back(values[i]);
00101         }
00102       } 
00103     }
00104 
00105     srvector(const srvector_slice&);
00106     srvector(const srmatrix_subv& A);
00107 
00108     std::vector<int>& row_indices() {
00109       return p;
00110     }
00111 
00112     std::vector<real>& values() {
00113       return x;
00114     }
00115 
00116     const std::vector<int>& row_indices() const {
00117       return p;
00118     }
00119 
00120     const std::vector<real>& values() const {
00121       return x;
00122     }
00123 
00124     int get_nnz() const {
00125       return x.size();
00126     }
00127 
00128     real density() const {
00129       return (double)x.size()/n;
00130     }
00131 
00132     void dropzeros() {
00133       for(int i=0 ; i<get_nnz() ; i++) {
00134         if(x[i] == 0.0) {
00135            x.erase(x.begin()+i);
00136            p.erase(p.begin()+i);
00137         }
00138       }
00139     }
00140 
00141     srvector& operator=(const real& v) {
00142       return sp_vs_assign<srvector,real,real>(*this,v);
00143     }
00144 
00145     srvector& operator=(const rvector& v) {
00146       return spf_vv_assign<srvector,rvector,real>(*this,v);
00147     }
00148 
00149     srvector& operator=(const rvector_slice& v) {
00150       return spf_vv_assign<srvector,rvector_slice,real>(*this,v);
00151     }
00152 
00153     srvector& operator=(const srvector_slice&);
00154 
00155     real& operator[](const int i) {
00156 #if(CXSC_INDEX_CHECK)
00157       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector::operator[](const int)"));
00158 #endif
00159       int k;
00160 
00161       for(k=0 ; k<get_nnz() && p[k]<=i-lb ; k++) {
00162         if(p[k] == i-lb) 
00163           return x[k];
00164       }
00165 
00166       p.insert(p.begin() + k, i-lb);
00167       x.insert(x.begin() + k, 0.0);
00168 
00169       return x[k];
00170     }
00171 
00172     real operator[](const int i) const {
00173 #if(CXSC_INDEX_CHECK)
00174       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector::operator[](const int)"));
00175 #endif
00176       return (*this)(i);
00177     }
00178 
00179     real operator()(const int i) const {
00180 #if(CXSC_INDEX_CHECK)
00181       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector::operator()(const int)"));
00182 #endif
00183       real r = 0.0;
00184 
00185       for(int k=0 ; k<get_nnz() && p[k]<=i-lb ; k++) {
00186         if(p[k] == i-lb) 
00187           r = x[k];
00188       }
00189 
00190       return r; 
00191     }
00192 
00193     srvector_slice operator()(const int, const int);
00194 
00195     srvector operator()(const intvector& per) {
00196       srvector v(n,get_nnz());
00197       intvector pinv = perminv(per);
00198 
00199       std::map<int,real> work;
00200       for(int i=0 ; i<get_nnz() ; i++)
00201          work.insert(std::make_pair(pinv[Lb(pinv)+p[i]], x[i]));
00202  
00203       for(std::map<int,real>::iterator it=work.begin() ; it!=work.end() ; it++) {
00204          v.p.push_back(it->first);
00205          v.x.push_back(it->second);
00206       }
00207 
00208       return v;
00209     }
00210 
00211     srvector operator()(const intmatrix& P) {
00212       intvector p = permvec(P);
00213       return (*this)(p);
00214     }
00215 
00216     srvector& operator*=(const real& s) {
00217       return sp_vs_multassign(*this,s);
00218     }
00219 
00220     srvector& operator/=(const real& s) {
00221       return sp_vs_divassign(*this,s);
00222     }
00223 
00224     srvector& operator+=(const rvector& v) 
00225     {
00226       return spf_vv_addassign(*this,v);
00227     }
00228 
00229     srvector& operator+=(const rvector_slice& v) {
00230       return spf_vv_addassign(*this,v);
00231     }
00232 
00233     srvector& operator+=(const srvector& v) {
00234       return spsp_vv_addassign(*this,v);
00235     }
00236 
00237     srvector& operator+=(const srvector_slice&);
00238 
00239     srvector& operator-=(const rvector& v) {
00240       return spf_vv_subassign(*this,v);
00241     }
00242 
00243     srvector& operator-=(const rvector_slice& v) {
00244       return spf_vv_subassign(*this,v);
00245     }
00246 
00247     srvector& operator-=(const srvector& v) {
00248       return spsp_vv_subassign(*this,v);
00249     }
00250 
00251     srvector& operator-=(const srvector_slice&);
00252 
00253     friend int Lb(const srvector&);
00254     friend int Ub(const srvector&);
00255     friend void SetLb(srvector&, const int);
00256     friend void SetUb(srvector&, const int);
00257 
00258     friend int VecLen(const srvector&);
00259     friend srvector Re(const scvector&);
00260     friend srvector Im(const scvector&);
00261     friend srvector Inf(const sivector&);
00262     friend srvector Sup(const sivector&);
00263     friend srvector InfRe(const scivector&);
00264     friend srvector SupRe(const scivector&);
00265     friend srvector InfIm(const scivector&);
00266     friend srvector SupIm(const scivector&);
00267     friend srvector mid(const sivector&);
00268     friend srvector diam(const sivector&);
00269     friend srvector absmin(const sivector&);
00270     friend srvector absmax(const sivector&);
00271     friend srvector mid(const sivector_slice&);
00272     friend srvector diam(const sivector_slice&);
00273 
00274 
00275     friend class srvector_slice;
00276     friend class scvector_slice;
00277     friend class scvector;
00278     friend class sivector_slice;
00279     friend class sivector;
00280     friend class scivector_slice;
00281     friend class scivector;
00282     friend class srmatrix_subv;
00283     friend class rvector;
00284     friend class rvector_slice;
00285     friend class ivector;
00286     friend class ivector_slice;
00287     friend class cvector;
00288     friend class cvector_slice;
00289     friend class civector;
00290     friend class civector_slice;
00291 
00292 
00293 #include "vector_friend_declarations.inl"
00294 };
00295 
00296 inline rvector::rvector(const srvector& v) {
00297   l = v.lb;
00298   u = v.ub;
00299   size = v.n;
00300   dat = new real[v.n];
00301   for(int i=0 ; i<v.n ; i++)
00302     dat[i] = 0.0;
00303   for(int i=0 ; i<v.get_nnz() ; i++)
00304     dat[v.p[i]] = v.x[i];
00305 }
00306 
00307 inline rvector& rvector::operator=(const srvector& v) {
00308   return fsp_vv_assign<rvector,srvector,real>(*this,v);
00309 }
00310 
00311 inline rvector& rvector::operator=(const srvector_slice& v) {
00312   return fsl_vv_assign<rvector,srvector_slice,real>(*this,v);
00313 }
00314 
00315 
00316 inline void SetLb(srvector& v, const int i) {
00317   v.lb = i;
00318   v.ub = v.lb + v.n - 1;
00319 }
00320 
00321 inline void SetUb(srvector& v, const int j) {
00322   v.ub = j;
00323   v.lb = v.ub - v.n + 1;
00324 }
00325 
00326 inline int Lb(const srvector& v) {
00327   return v.lb;
00328 }
00329 
00330 inline int Ub(const srvector& v) {
00331   return v.ub;
00332 }
00333 
00334 inline int VecLen(const srvector& v) {
00335   return v.n;
00336 }
00337 
00338 inline void Resize(srvector& v) {
00339   sp_v_resize(v);
00340 }
00341 
00342 inline void Resize(srvector& v, const int n) {
00343   sp_v_resize(v,n);
00344 }
00345 
00346 inline void Resize(srvector& v, const int l, const int u) {
00347   sp_v_resize(v,l,u);
00348 }
00349 
00350 inline srvector operator-(const srvector& v) {
00351   return sp_v_negative(v);
00352 }
00353 
00354 inline real operator*(const srvector& v1, const rvector& v2) {
00355   return spf_vv_mult<srvector,rvector,real,sparse_dot>(v1,v2);
00356 }
00357 
00358 inline real operator*(const rvector& v1, const srvector& v2) {
00359   return fsp_vv_mult<rvector,srvector,real,sparse_dot>(v1,v2);
00360 }
00361 
00362 inline real operator*(const srvector& v1, const rvector_slice& v2) {
00363   return spf_vv_mult<srvector,rvector_slice,real,sparse_dot>(v1,v2);
00364 }
00365 
00366 inline real operator*(const rvector_slice& v1, const srvector& v2) {
00367   return fsp_vv_mult<rvector_slice,srvector,real,sparse_dot>(v1,v2);
00368 }
00369 
00370 inline real operator*(const srvector& v1, const srvector& v2) {
00371   return spsp_vv_mult<srvector,srvector,real,sparse_dot>(v1,v2);
00372 }
00373 
00374 inline srvector operator*(const srvector& v, const real& s) {
00375   return sp_vs_mult<srvector,real,srvector>(v,s);
00376 }
00377 
00378 inline srvector operator/(const srvector& v, const real& s) {
00379   return sp_vs_div<srvector,real,srvector>(v,s);
00380 }
00381 
00382 inline srvector operator*(const real& s, const srvector& v) {
00383   return sp_sv_mult<real,srvector,srvector>(s,v);
00384 }
00385 
00386 inline rvector operator+(const rvector& v1, const srvector& v2) {
00387   return fsp_vv_add<rvector,srvector,rvector>(v1,v2);
00388 }
00389 
00390 inline rvector operator+(const srvector& v1, const rvector& v2) {
00391   return spf_vv_add<srvector,rvector,rvector>(v1,v2);
00392 }
00393 
00394 inline rvector operator+(const rvector_slice& v1, const srvector& v2) {
00395   return fsp_vv_add<rvector_slice,srvector,rvector>(v1,v2);
00396 }
00397 
00398 inline rvector operator+(const srvector& v1, const rvector_slice& v2) {
00399   return spf_vv_add<srvector,rvector_slice,rvector>(v1,v2);
00400 }
00401 
00402 inline srvector operator+(const srvector& v1, const srvector& v2) {
00403   return spsp_vv_add<srvector,srvector,srvector,real>(v1,v2);
00404 }
00405 
00406 inline rvector operator-(const rvector& v1, const srvector& v2) {
00407   return fsp_vv_sub<rvector,srvector,rvector>(v1,v2);
00408 }
00409 
00410 inline rvector operator-(const srvector& v1, const rvector& v2) {
00411   return spf_vv_sub<srvector,rvector,rvector>(v1,v2);
00412 }
00413 
00414 inline rvector operator-(const rvector_slice& v1, const srvector& v2) {
00415   return fsp_vv_sub<rvector_slice,srvector,rvector>(v1,v2);
00416 }
00417 
00418 inline rvector operator-(const srvector& v1, const rvector_slice& v2) {
00419   return spf_vv_sub<srvector,rvector_slice,rvector>(v1,v2);
00420 }
00421 
00422 inline srvector operator-(const srvector& v1, const srvector& v2) {
00423   return spsp_vv_sub<srvector,srvector,srvector,real>(v1,v2);
00424 }
00425 
00426 inline rvector& rvector::operator+=(const srvector& v2) {
00427   return fsp_vv_addassign(*this,v2);
00428 }
00429 
00430 inline rvector_slice& rvector_slice::operator+=(const srvector& v2) {
00431   return fsp_vv_addassign(*this,v2);
00432 }
00433  
00434 inline rvector& rvector::operator-=(const srvector& v2) {
00435   return fsp_vv_subassign(*this,v2);
00436 }
00437 
00438 inline rvector_slice& rvector_slice::operator-=(const srvector& v2) {
00439   return fsp_vv_subassign(*this,v2);
00440 }
00441 
00442 inline bool operator==(const srvector& v1, const srvector& v2) {
00443   return spsp_vv_comp(v1,v2);
00444 }
00445 
00446 inline bool operator==(const srvector& v1, const rvector& v2) {
00447   return spf_vv_comp(v1,v2);
00448 }
00449 
00450 inline bool operator==(const rvector& v1, const srvector& v2) {
00451   return fsp_vv_comp(v1,v2);
00452 }
00453 
00454 inline bool operator==(const srvector& v1, const rvector_slice& v2) {
00455   return spf_vv_comp(v1,v2);
00456 }
00457 
00458 inline bool operator==(const rvector_slice& v1, const srvector& v2) {
00459   return fsp_vv_comp(v1,v2);
00460 }
00461 
00462 inline bool operator!=(const srvector& v1, const srvector& v2) {
00463   return !spsp_vv_comp(v1,v2);
00464 }
00465 
00466 inline bool operator!=(const srvector& v1, const rvector& v2) {
00467   return !spf_vv_comp(v1,v2);
00468 }
00469 
00470 inline bool operator!=(const rvector& v1, const srvector& v2) {
00471   return !fsp_vv_comp(v1,v2);
00472 }
00473 
00474 inline bool operator!=(const srvector& v1, const rvector_slice& v2) {
00475   return !spf_vv_comp(v1,v2);
00476 }
00477 
00478 inline bool operator!=(const rvector_slice& v1, const srvector& v2) {
00479   return !fsp_vv_comp(v1,v2);
00480 }
00481 
00482 inline bool operator<(const srvector& v1, const srvector& v2) {
00483   return spsp_vv_less<srvector,srvector,real>(v1,v2);
00484 }
00485 
00486 inline bool operator<(const srvector& v1, const rvector& v2) {
00487   return spf_vv_less<srvector,rvector,real>(v1,v2);
00488 }
00489 
00490 inline bool operator<(const rvector& v1, const srvector& v2) {
00491   return fsp_vv_less<rvector,srvector,real>(v1,v2);
00492 }
00493 
00494 inline bool operator<(const srvector& v1, const rvector_slice& v2) {
00495   return spf_vv_less<srvector,rvector_slice,real>(v1,v2);
00496 }
00497 
00498 inline bool operator<(const rvector_slice& v1, const srvector& v2) {
00499   return fsp_vv_less<rvector_slice,srvector,real>(v1,v2);
00500 }
00501 
00502 inline bool operator<=(const srvector& v1, const srvector& v2) {
00503   return spsp_vv_leq<srvector,srvector,real>(v1,v2);
00504 }
00505 
00506 inline bool operator<=(const srvector& v1, const rvector& v2) {
00507   return spf_vv_leq<srvector,rvector,real>(v1,v2);
00508 }
00509 
00510 inline bool operator<=(const rvector& v1, const srvector& v2) {
00511   return fsp_vv_leq<rvector,srvector,real>(v1,v2);
00512 }
00513 
00514 inline bool operator<=(const srvector& v1, const rvector_slice& v2) {
00515   return spf_vv_leq<srvector,rvector_slice,real>(v1,v2);
00516 }
00517 
00518 inline bool operator<=(const rvector_slice& v1, const srvector& v2) {
00519   return fsp_vv_leq<rvector_slice,srvector,real>(v1,v2);
00520 }
00521 
00522 inline bool operator>(const srvector& v1, const srvector& v2) {
00523   return spsp_vv_greater<srvector,srvector,real>(v1,v2);
00524 }
00525 
00526 inline bool operator>(const srvector& v1, const rvector& v2) {
00527   return spf_vv_greater<srvector,rvector,real>(v1,v2);
00528 }
00529 
00530 inline bool operator>(const rvector& v1, const srvector& v2) {
00531   return fsp_vv_greater<rvector,srvector,real>(v1,v2);
00532 }
00533 
00534 inline bool operator>(const srvector& v1, const rvector_slice& v2) {
00535   return spf_vv_greater<srvector,rvector_slice,real>(v1,v2);
00536 }
00537 
00538 inline bool operator>(const rvector_slice& v1, const srvector& v2) {
00539   return fsp_vv_greater<rvector_slice,srvector,real>(v1,v2);
00540 }
00541 
00542 inline bool operator>=(const srvector& v1, const srvector& v2) {
00543   return spsp_vv_geq<srvector,srvector,real>(v1,v2);
00544 }
00545 
00546 inline bool operator>=(const srvector& v1, const rvector& v2) {
00547   return spf_vv_geq<srvector,rvector,real>(v1,v2);
00548 }
00549 
00550 inline bool operator>=(const rvector& v1, const srvector& v2) {
00551   return fsp_vv_geq<rvector,srvector,real>(v1,v2);
00552 }
00553 
00554 inline bool operator>=(const srvector& v1, const rvector_slice& v2) {
00555   return spf_vv_geq<srvector,rvector_slice,real>(v1,v2);
00556 }
00557 
00558 inline bool operator>=(const rvector_slice& v1, const srvector& v2) {
00559   return fsp_vv_geq<rvector_slice,srvector,real>(v1,v2);
00560 }
00561 
00562 inline bool operator!(const srvector& x) {
00563   return sp_v_not(x);
00564 }
00565 
00566 inline std::ostream& operator<<(std::ostream& os, const srvector& v) {
00567   return sp_v_output<srvector,real>(os,v);
00568 }
00569 
00570 inline std::istream& operator>>(std::istream& is, srvector& v) {
00571   return sp_v_input<srvector,real>(is,v);
00572 }
00573 
00574 class srvector_slice {
00575   private:
00576     std::vector<int>& p;
00577     std::vector<real>& x;
00578     srvector& orig;
00579     int start,end;
00580     int lb;
00581     int ub;
00582     int n;
00583     int nnz;
00584     int offset;
00585 
00586     srvector_slice(srvector& v, int l, int u) : p(v.p), x(v.x), orig(v), lb(l), ub(u), n(u-l+1)  {
00587       int i;
00588 
00589       for(i=0 ; i<v.get_nnz() && p[i]<lb-v.lb ; i++);
00590 
00591       start = i;
00592 
00593       for(i=start ; i<v.get_nnz() && p[i]<=ub-v.lb ; i++);
00594 
00595       end = i-1;
00596 
00597       nnz = end-start+1;
00598       offset = lb-v.lb;
00599     }
00600 
00601   public:
00602 
00603     int get_nnz() const {
00604       return nnz;
00605     }
00606 
00607     real density() const {
00608       return (double)nnz/n;
00609     }
00610 
00611     real& operator[](const int i) {
00612 #if(CXSC_INDEX_CHECK)
00613       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector_slice::operator[](const int)"));
00614 #endif
00615       int k;
00616 
00617       for(k=start ; k<end+1 && p[k]-start<=i-lb ; k++) {
00618         if(p[k]-offset == i-lb) 
00619           return x[k];
00620       }
00621 
00622       p.insert(p.begin() + k, i-lb);
00623       x.insert(x.begin() + k, 0.0);
00624       end++;
00625 
00626       return x[k];
00627     }
00628 
00629     real operator[](const int i) const {
00630 #if(CXSC_INDEX_CHECK)
00631       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector_slice::operator[](const int)"));
00632 #endif
00633       return (*this)(i);
00634     }
00635 
00636     real operator()(const int i) const {
00637 #if(CXSC_INDEX_CHECK)
00638       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector_slice::operator()(const int)"));
00639 #endif
00640       real r = 0.0;
00641 
00642       for(int k=start ; k<end && p[k]-start<=i-lb ; k++) {
00643         if(p[k]-start == i-lb) 
00644           r = x[k];
00645       }
00646 
00647       return r; 
00648     }
00649 
00650     srvector_slice& operator=(const real& v) {
00651       return sl_vs_assign<srvector_slice,real,real,std::vector<real>::iterator>(*this,v);
00652     }
00653 
00654     srvector_slice& operator=(const srvector_slice& v) {
00655       return slsl_vv_assign<srvector_slice,srvector_slice,real,std::vector<real>::iterator>(*this,v);
00656     }
00657 
00658     srvector_slice& operator=(const srvector& v) {
00659       return slsp_vv_assign<srvector_slice,srvector,real,std::vector<real>::iterator>(*this,v);
00660     }
00661 
00662     srvector_slice& operator=(const rvector& v) {
00663       return slf_vv_assign<srvector_slice,rvector,real,std::vector<real>::iterator>(*this,v);
00664     }
00665 
00666     srvector_slice& operator=(const rvector_slice& v) {
00667       return slf_vv_assign<srvector_slice,rvector,real,std::vector<real>::iterator>(*this,v);
00668     }
00669 
00670     srvector_slice& operator*=(const real& s) {
00671       return sl_vs_multassign(*this,s);
00672     }
00673 
00674     srvector_slice& operator/=(const real& s) {
00675       return sl_vs_divassign(*this,s);
00676     }
00677 
00678     srvector_slice& operator+=(const rvector& v) {
00679       return slf_vv_addassign<srvector_slice,rvector,real>(*this,v);
00680     }
00681 
00682     srvector_slice& operator+=(const rvector_slice& v) {
00683       return slf_vv_addassign<srvector_slice,rvector_slice,real>(*this,v);
00684     }
00685 
00686     srvector_slice& operator+=(const srvector& v) {
00687       return slsp_vv_addassign(*this,v);
00688     }
00689 
00690     srvector_slice& operator+=(const srvector_slice& v) {
00691       return slsl_vv_addassign(*this,v);
00692     }
00693 
00694     srvector_slice& operator-=(const rvector& v) {
00695       return slf_vv_subassign<srvector_slice,rvector,real>(*this,v);
00696     }
00697 
00698     srvector_slice& operator-=(const rvector_slice& v) {
00699       return slf_vv_subassign<srvector_slice,rvector_slice,real>(*this,v);
00700     }
00701 
00702     srvector_slice& operator-=(const srvector& v) {
00703       return slsp_vv_subassign(*this,v);
00704     }
00705 
00706     srvector_slice& operator-=(const srvector_slice& v) {
00707       return slsl_vv_subassign(*this,v);
00708     }
00709 
00710 
00711     friend int Lb(const srvector_slice&);
00712     friend int Ub(const srvector_slice&);
00713     friend int VecLen(const srvector_slice&);
00714 
00715     friend srvector operator*(const srmatrix&, const srvector_slice&); //ok
00716     friend srvector operator*(const srmatrix_slice&, const srvector_slice&); //ok
00717 
00718     friend class srvector;
00719     friend class scvector;
00720     friend class sivector;
00721     friend class scivector;
00722     friend class srmatrix_subv;
00723     friend class rvector;
00724     friend class rvector_slice;
00725     friend class ivector;
00726     friend class ivector_slice;
00727     friend class cvector;
00728     friend class cvector_slice;
00729     friend class civector;
00730     friend class civector_slice;
00731 
00732 #include "vector_friend_declarations.inl"
00733 };
00734 
00735 inline rvector::rvector(const srvector_slice& v) {
00736   l = v.lb;
00737   u = v.ub;
00738   size = v.n;
00739   dat = new real[v.n];
00740   for(int i=0 ; i<v.n ; i++)
00741     dat[i] = 0.0;
00742   for(int i=v.start ; i<=v.end ; i++)
00743     dat[v.p[i]] = v.x[i];
00744 }
00745 
00746 inline rvector_slice& rvector_slice::operator=(const srvector& v) {
00747   *this = rvector(v);
00748   return *this;
00749 }
00750 
00751 inline rvector_slice& rvector_slice::operator=(const srvector_slice& v) {
00752   *this = rvector(v);
00753   return *this;
00754 }
00755 
00756 inline srvector::srvector(const srvector_slice& s) : lb(s.lb), ub(s.ub), n(s.n)  {
00757   p.reserve(s.nnz);
00758   x.reserve(s.nnz);
00759 
00760   for(int i=s.start ; i<=s.end ; i++) {
00761     p.push_back(s.p[i]-s.offset);
00762     x.push_back(s.x[i]);
00763   }
00764 
00765 }
00766 
00767 inline srvector& srvector::operator=(const srvector_slice& v) {
00768   return spsl_vv_assign<srvector,srvector_slice,real>(*this,v);
00769 }
00770 
00771 inline srvector_slice srvector::operator()(const int i, const int j) {
00772 #if(CXSC_INDEX_CHECK)
00773       if(i<lb || j>ub) cxscthrow(ELEMENT_NOT_IN_VEC("srvector::operator()(const int,const int)"));
00774 #endif
00775   return srvector_slice(*this,i,j);
00776 }
00777 
00778 inline srvector operator-(const srvector_slice& v) {
00779   return sl_v_negative<srvector_slice,srvector>(v);
00780 }
00781 
00782 inline int Lb(const srvector_slice& v) {
00783   return v.lb;
00784 }
00785 
00786 inline int Ub(const srvector_slice& v) {
00787   return v.ub;
00788 }
00789 
00790 inline int VecLen(const srvector_slice& v) {
00791   return v.n;
00792 }
00793 
00794 inline real operator*(const srvector_slice& v1, const rvector& v2) {
00795   return slf_vv_mult<srvector_slice,rvector,real,sparse_dot>(v1,v2);
00796 }
00797 
00798 inline real operator*(const rvector& v1, const srvector_slice& v2) {
00799   return fsl_vv_mult<rvector,srvector_slice,real,sparse_dot>(v1,v2);
00800 }
00801 
00802 inline real operator*(const srvector_slice& v1, const rvector_slice& v2) {
00803   return slf_vv_mult<srvector_slice,rvector_slice,real,sparse_dot>(v1,v2);
00804 }
00805 
00806 inline real operator*(const rvector_slice& v1, const srvector_slice& v2) {
00807   return fsl_vv_mult<rvector_slice,srvector_slice,real,sparse_dot>(v1,v2);
00808 }
00809 
00810 inline real operator*(const srvector& v1, const srvector_slice& v2) {
00811   return spsl_vv_mult<srvector,srvector_slice,real,sparse_dot>(v1,v2);
00812 }
00813 
00814 inline real operator*(const srvector_slice& v1, const srvector& v2) {
00815   return slsp_vv_mult<srvector_slice,srvector,real,sparse_dot>(v1,v2);
00816 }
00817 
00818 inline real operator*(const srvector_slice& v1, const srvector_slice& v2) {
00819   return slsl_vv_mult<srvector_slice,srvector_slice,real,sparse_dot>(v1,v2);
00820 }
00821 
00822 inline srvector operator*(const srvector_slice& v, const real& s) {
00823   return sp_vs_mult<srvector_slice,real,srvector>(v,s);
00824 }
00825 
00826 inline srvector operator/(const srvector_slice& v, const real& s) {
00827   return sp_vs_div<srvector_slice,real,srvector>(v,s);
00828 }
00829 
00830 inline srvector operator*(const real& s, const srvector_slice& v) {
00831   return sp_sv_mult<real,srvector_slice,srvector>(s,v);
00832 }
00833 
00834 inline rvector operator+(const rvector& v1, const srvector_slice& v2) {
00835   return fsl_vv_add<rvector,srvector_slice,rvector>(v1,v2);
00836 }
00837 
00838 inline rvector operator+(const srvector_slice& v1, const rvector& v2) {
00839   return slf_vv_add<srvector_slice,rvector,rvector>(v1,v2);
00840 }
00841 
00842 inline rvector operator+(const rvector_slice& v1, const srvector_slice& v2) {
00843   return fsl_vv_add<rvector_slice,srvector_slice,rvector>(v1,v2);
00844 }
00845 
00846 inline rvector operator+(const srvector_slice& v1, const rvector_slice& v2) {
00847   return slf_vv_add<srvector_slice,rvector_slice,rvector>(v1,v2);
00848 }
00849 
00850 inline srvector operator+(const srvector_slice& v1, const srvector_slice& v2) {
00851   return slsl_vv_add<srvector_slice,srvector_slice,srvector,real>(v1,v2);
00852 }
00853 
00854 inline srvector operator+(const srvector& v1, const srvector_slice& v2) {
00855   return spsl_vv_add<srvector,srvector_slice,srvector,real>(v1,v2);
00856 }
00857 
00858 inline srvector operator+(const srvector_slice& v1, const srvector& v2) {
00859   return slsp_vv_add<srvector_slice,srvector,srvector,real>(v1,v2);
00860 }
00861 
00862 inline rvector operator-(const rvector& v1, const srvector_slice& v2) {
00863   return fsl_vv_sub<rvector,srvector_slice,rvector>(v1,v2);
00864 }
00865 
00866 inline rvector operator-(const srvector_slice& v1, const rvector& v2) {
00867   return slf_vv_sub<srvector_slice,rvector,rvector>(v1,v2);
00868 }
00869 
00870 inline rvector operator-(const rvector_slice& v1, const srvector_slice& v2) {
00871   return fsl_vv_sub<rvector_slice,srvector_slice,rvector>(v1,v2);
00872 }
00873 
00874 inline rvector operator-(const srvector_slice& v1, const rvector_slice& v2) {
00875   return slf_vv_sub<srvector_slice,rvector_slice,rvector>(v1,v2);
00876 }
00877 
00878 inline srvector operator-(const srvector_slice& v1, const srvector_slice& v2) {
00879   return slsl_vv_sub<srvector_slice,srvector_slice,srvector,real>(v1,v2);
00880 }
00881 
00882 inline srvector operator-(const srvector& v1, const srvector_slice& v2) {
00883   return spsl_vv_sub<srvector,srvector_slice,srvector,real>(v1,v2);
00884 }
00885 
00886 inline srvector operator-(const srvector_slice& v1, const srvector& v2) {
00887   return slsp_vv_sub<srvector_slice,srvector,srvector,real>(v1,v2);
00888 }
00889 
00890 inline rvector& rvector::operator+=(const srvector_slice& v2) {
00891   return fsl_vv_addassign(*this,v2);
00892 }
00893 
00894 inline rvector_slice& rvector_slice::operator+=(const srvector_slice& v2) {
00895   return fsl_vv_addassign(*this,v2);
00896 }
00897 
00898 inline srvector& srvector::operator+=(const srvector_slice& v2) {
00899   return spsl_vv_addassign(*this,v2);
00900 }
00901 
00902 inline rvector& rvector::operator-=(const srvector_slice& v2) {
00903   return fsl_vv_subassign(*this,v2);
00904 }
00905 
00906 inline rvector_slice& rvector_slice::operator-=(const srvector_slice& v2) {
00907   return fsl_vv_subassign(*this,v2);
00908 }
00909 
00910 inline srvector& srvector::operator-=(const srvector_slice& v2) {
00911   return spsl_vv_subassign(*this,v2);
00912 }
00913 
00914 inline bool operator==(const srvector_slice& v1, const srvector_slice& v2) {
00915   return slsl_vv_comp(v1,v2);
00916 }
00917 
00918 inline bool operator==(const srvector_slice& v1, const srvector& v2) {
00919   return slsp_vv_comp(v1,v2);
00920 }
00921 
00922 inline bool operator==(const srvector& v1, const srvector_slice& v2) {
00923   return spsl_vv_comp(v1,v2);
00924 }
00925 
00926 inline bool operator==(const srvector_slice& v1, const rvector& v2) {
00927   return slf_vv_comp(v1,v2);
00928 }
00929 
00930 inline bool operator==(const rvector& v1, const srvector_slice& v2) {
00931   return fsl_vv_comp(v1,v2);
00932 }
00933 
00934 inline bool operator==(const srvector_slice& v1, const rvector_slice& v2) {
00935   return slf_vv_comp(v1,v2);
00936 }
00937 
00938 inline bool operator==(const rvector_slice& v1, const srvector_slice& v2) {
00939   return fsl_vv_comp(v1,v2);
00940 }
00941 
00942 inline bool operator!=(const srvector_slice& v1, const srvector_slice& v2) {
00943   return !slsl_vv_comp(v1,v2);
00944 }
00945 
00946 inline bool operator!=(const srvector_slice& v1, const rvector& v2) {
00947   return !slf_vv_comp(v1,v2);
00948 }
00949 
00950 inline bool operator!=(const rvector& v1, const srvector_slice& v2) {
00951   return !fsl_vv_comp(v1,v2);
00952 }
00953 
00954 inline bool operator!=(const srvector_slice& v1, const srvector& v2) {
00955   return !slsp_vv_comp(v1,v2);
00956 }
00957 
00958 inline bool operator!=(const srvector& v1, const srvector_slice& v2) {
00959   return !spsl_vv_comp(v1,v2);
00960 }
00961 
00962 inline bool operator!=(const srvector_slice& v1, const rvector_slice& v2) {
00963   return !slf_vv_comp(v1,v2);
00964 }
00965 
00966 inline bool operator!=(const rvector_slice& v1, const srvector_slice& v2) {
00967   return !fsl_vv_comp(v1,v2);
00968 }
00969 
00970 inline bool operator<(const srvector_slice& v1, const srvector_slice& v2) {
00971   return slsl_vv_less<srvector_slice,srvector_slice,real>(v1,v2);
00972 }
00973 
00974 inline bool operator<(const srvector_slice& v1, const srvector& v2) {
00975   return slsp_vv_less<srvector_slice,srvector,real>(v1,v2);
00976 }
00977 
00978 inline bool operator<(const srvector& v1, const srvector_slice& v2) {
00979   return spsl_vv_less<srvector,srvector_slice,real>(v1,v2);
00980 }
00981 
00982 inline bool operator<(const srvector_slice& v1, const rvector& v2) {
00983   return slf_vv_less<srvector_slice,rvector,real>(v1,v2);
00984 }
00985 
00986 inline bool operator<(const rvector& v1, const srvector_slice& v2) {
00987   return fsl_vv_less<rvector,srvector_slice,real>(v1,v2);
00988 }
00989 
00990 inline bool operator<(const srvector_slice& v1, const rvector_slice& v2) {
00991   return slf_vv_less<srvector_slice,rvector_slice,real>(v1,v2);
00992 }
00993 
00994 inline bool operator<(const rvector_slice& v1, const srvector_slice& v2) {
00995   return fsl_vv_less<rvector_slice,srvector_slice,real>(v1,v2);
00996 }
00997 
00998 inline bool operator<=(const srvector_slice& v1, const srvector_slice& v2) {
00999   return slsl_vv_leq<srvector_slice,srvector_slice,real>(v1,v2);
01000 }
01001 
01002 inline bool operator<=(const srvector_slice& v1, const srvector& v2) {
01003   return slsp_vv_leq<srvector_slice,srvector,real>(v1,v2);
01004 }
01005 
01006 inline bool operator<=(const srvector& v1, const srvector_slice& v2) {
01007   return spsl_vv_leq<srvector,srvector_slice,real>(v1,v2);
01008 }
01009 
01010 inline bool operator<=(const srvector_slice& v1, const rvector& v2) {
01011   return slf_vv_leq<srvector_slice,rvector,real>(v1,v2);
01012 }
01013 
01014 inline bool operator<=(const rvector& v1, const srvector_slice& v2) {
01015   return fsl_vv_leq<rvector,srvector_slice,real>(v1,v2);
01016 }
01017 
01018 inline bool operator<=(const srvector_slice& v1, const rvector_slice& v2) {
01019   return slf_vv_leq<srvector_slice,rvector_slice,real>(v1,v2);
01020 }
01021 
01022 inline bool operator<=(const rvector_slice& v1, const srvector_slice& v2) {
01023   return fsl_vv_leq<rvector_slice,srvector_slice,real>(v1,v2);
01024 }
01025 
01026 inline bool operator>(const srvector_slice& v1, const srvector_slice& v2) {
01027   return slsl_vv_greater<srvector_slice,srvector_slice,real>(v1,v2);
01028 }
01029 
01030 inline bool operator>(const srvector_slice& v1, const srvector& v2) {
01031   return slsp_vv_greater<srvector_slice,srvector,real>(v1,v2);
01032 }
01033 
01034 inline bool operator>(const srvector& v1, const srvector_slice& v2) {
01035   return spsl_vv_greater<srvector,srvector_slice,real>(v1,v2);
01036 }
01037 
01038 inline bool operator>(const srvector_slice& v1, const rvector& v2) {
01039   return slf_vv_greater<srvector_slice,rvector,real>(v1,v2);
01040 }
01041 
01042 inline bool operator>(const rvector& v1, const srvector_slice& v2) {
01043   return fsl_vv_greater<rvector,srvector_slice,real>(v1,v2);
01044 }
01045 
01046 inline bool operator>(const srvector_slice& v1, const rvector_slice& v2) {
01047   return slf_vv_greater<srvector_slice,rvector_slice,real>(v1,v2);
01048 }
01049 
01050 inline bool operator>(const rvector_slice& v1, const srvector_slice& v2) {
01051   return fsl_vv_greater<rvector_slice,srvector_slice,real>(v1,v2);
01052 }
01053 
01054 inline bool operator>=(const srvector_slice& v1, const srvector_slice& v2) {
01055   return slsl_vv_geq<srvector_slice,srvector_slice,real>(v1,v2);
01056 }
01057 
01058 inline bool operator>=(const srvector_slice& v1, const srvector& v2) {
01059   return slsp_vv_geq<srvector_slice,srvector,real>(v1,v2);
01060 }
01061 
01062 inline bool operator>=(const srvector& v1, const srvector_slice& v2) {
01063   return spsl_vv_geq<srvector,srvector_slice,real>(v1,v2);
01064 }
01065 
01066 inline bool operator>=(const srvector_slice& v1, const rvector& v2) {
01067   return slf_vv_geq<srvector_slice,rvector,real>(v1,v2);
01068 }
01069 
01070 inline bool operator>=(const rvector& v1, const srvector_slice& v2) {
01071   return fsl_vv_geq<rvector,srvector_slice,real>(v1,v2);
01072 }
01073 
01074 inline bool operator>=(const srvector_slice& v1, const rvector_slice& v2) {
01075   return slf_vv_geq<srvector_slice,rvector_slice,real>(v1,v2);
01076 }
01077 
01078 inline bool operator>=(const rvector_slice& v1, const srvector_slice& v2) {
01079   return fsl_vv_geq<rvector_slice,srvector_slice,real>(v1,v2);
01080 }
01081 
01082 inline bool operator!(const srvector_slice& x) {
01083   return sl_v_not(x);
01084 }
01085 
01086 inline std::ostream& operator<<(std::ostream& os, const srvector_slice& v) {
01087   return sl_v_output<srvector_slice, real>(os,v);
01088 }
01089 
01090 inline std::istream& operator>>(std::istream& is, srvector_slice& v) {
01091   return sl_v_input<srvector_slice, real>(is,v);
01092 }
01093 
01094 inline void accumulate(dotprecision& dot, const srvector& x, const srvector& y) {
01095   spsp_vv_accu<dotprecision,srvector,srvector,sparse_dot>(dot,x,y);
01096 }
01097 
01098 inline void accumulate(dotprecision& dot, const srvector& x, const rvector& y) {
01099   spf_vv_accu<dotprecision,srvector,rvector,sparse_dot>(dot,x,y);
01100 }
01101 
01102 inline void accumulate(dotprecision& dot, const srvector& x, const rvector_slice& y) {
01103   spf_vv_accu<dotprecision,srvector,rvector_slice,sparse_dot>(dot,x,y);
01104 }
01105 
01106 inline void accumulate(dotprecision& dot, const rvector& x, const srvector& y) {
01107   fsp_vv_accu<dotprecision,rvector,srvector,sparse_dot>(dot,x,y);
01108 }
01109 
01110 inline void accumulate(dotprecision& dot, const rvector_slice& x, const srvector& y) {
01111   fsp_vv_accu<dotprecision,rvector_slice,srvector,sparse_dot>(dot,x,y);
01112 }
01113 
01114 inline void accumulate(dotprecision& dot, const srvector_slice& x, const rvector& y) {
01115   slf_vv_accu<dotprecision,srvector_slice,rvector,sparse_dot>(dot,x,y);
01116 }
01117 
01118 inline void accumulate(dotprecision& dot, const srvector_slice& x, const rvector_slice& y) {
01119   slf_vv_accu<dotprecision,srvector_slice,rvector_slice,sparse_dot>(dot,x,y);
01120 }
01121 
01122 inline void accumulate(dotprecision& dot, const rvector& x, const srvector_slice& y) {
01123   fsl_vv_accu<dotprecision,rvector,srvector_slice,sparse_dot>(dot,x,y);
01124 }
01125 
01126 inline void accumulate(dotprecision& dot, const rvector_slice& x, const srvector_slice& y) {
01127   fsl_vv_accu<dotprecision,rvector_slice,srvector_slice,sparse_dot>(dot,x,y);
01128 }
01129 
01130 inline void accumulate(dotprecision& dot, const srvector_slice& x, const srvector_slice& y) {
01131   slsl_vv_accu<dotprecision,srvector_slice,srvector_slice,sparse_dot>(dot,x,y);
01132 }
01133 
01134 inline void accumulate(dotprecision& dot, const srvector& x, const srvector_slice& y) {
01135   spsl_vv_accu<dotprecision,srvector,srvector_slice,sparse_dot>(dot,x,y);
01136 }
01137 
01138 inline void accumulate(dotprecision& dot, const srvector_slice& x, const srvector& y) {
01139   slsp_vv_accu<dotprecision,srvector_slice,srvector,sparse_dot>(dot,x,y);
01140 }
01141 
01142 inline void accumulate_approx(dotprecision& dot, const srvector& x, const srvector& y) {
01143   spsp_vv_accuapprox<dotprecision,srvector,srvector,sparse_dot>(dot,x,y);
01144 }
01145 
01146 inline void accumulate_approx(dotprecision& dot, const srvector& x, const rvector& y) {
01147   spf_vv_accuapprox<dotprecision,srvector,rvector,sparse_dot>(dot,x,y);
01148 }
01149 
01150 inline void accumulate_approx(dotprecision& dot, const srvector& x, const rvector_slice& y) {
01151   spf_vv_accuapprox<dotprecision,srvector,rvector_slice,sparse_dot>(dot,x,y);
01152 }
01153 
01154 inline void accumulate_approx(dotprecision& dot, const rvector& x, const srvector& y) {
01155   fsp_vv_accuapprox<dotprecision,rvector,srvector,sparse_dot>(dot,x,y);
01156 }
01157 
01158 inline void accumulate_approx(dotprecision& dot, const rvector_slice& x, const srvector& y) {
01159   fsp_vv_accuapprox<dotprecision,rvector_slice,srvector,sparse_dot>(dot,x,y);
01160 }
01161 
01162 inline void accumulate_approx(dotprecision& dot, const srvector_slice& x, const rvector& y) {
01163   slf_vv_accuapprox<dotprecision,srvector_slice,rvector,sparse_dot>(dot,x,y);
01164 }
01165 
01166 inline void accumulate_approx(dotprecision& dot, const srvector_slice& x, const rvector_slice& y) {
01167   slf_vv_accuapprox<dotprecision,srvector_slice,rvector_slice,sparse_dot>(dot,x,y);
01168 }
01169 
01170 inline void accumulate_approx(dotprecision& dot, const rvector& x, const srvector_slice& y) {
01171   fsl_vv_accuapprox<dotprecision,rvector,srvector_slice,sparse_dot>(dot,x,y);
01172 }
01173 
01174 inline void accumulate_approx(dotprecision& dot, const rvector_slice& x, const srvector_slice& y) {
01175   fsl_vv_accuapprox<dotprecision,rvector_slice,srvector_slice,sparse_dot>(dot,x,y);
01176 }
01177 
01178 inline void accumulate_approx(dotprecision& dot, const srvector_slice& x, const srvector_slice& y) {
01179   slsl_vv_accuapprox<dotprecision,srvector_slice,srvector_slice,sparse_dot>(dot,x,y);
01180 }
01181 
01182 inline void accumulate_approx(dotprecision& dot, const srvector& x, const srvector_slice& y) {
01183   spsl_vv_accuapprox<dotprecision,srvector,srvector_slice,sparse_dot>(dot,x,y);
01184 }
01185 
01186 inline void accumulate_approx(dotprecision& dot, const srvector_slice& x, const srvector& y) {
01187   slsp_vv_accuapprox<dotprecision,srvector_slice,srvector,sparse_dot>(dot,x,y);
01188 }
01189 
01190 inline void accumulate(idotprecision& dot, const srvector& x, const srvector& y) {
01191   dotprecision tmp(0.0);
01192   tmp.set_k(dot.get_k());
01193   accumulate(tmp,x,y);
01194   dot += tmp;
01195 }
01196 
01197 inline void accumulate(idotprecision& dot, const srvector& x, const rvector& y) {
01198   dotprecision tmp(0.0);
01199   tmp.set_k(dot.get_k());
01200   accumulate(tmp,x,y);
01201   dot += tmp;
01202 }
01203 
01204 inline void accumulate(idotprecision& dot, const srvector& x, const rvector_slice& y) {
01205   dotprecision tmp(0.0);
01206   tmp.set_k(dot.get_k());
01207   accumulate(tmp,x,y);
01208   dot += tmp;
01209 }
01210 
01211 inline void accumulate(idotprecision& dot, const rvector& x, const srvector& y) {
01212   dotprecision tmp(0.0);
01213   tmp.set_k(dot.get_k());
01214   accumulate(tmp,x,y);
01215   dot += tmp;
01216 }
01217 
01218 inline void accumulate(idotprecision& dot, const rvector_slice& x, const srvector& y) {
01219   dotprecision tmp(0.0);
01220   tmp.set_k(dot.get_k());
01221   accumulate(tmp,x,y);
01222   dot += tmp;
01223 }
01224 
01225 inline void accumulate(idotprecision& dot, const srvector_slice& x, const rvector& y) {
01226   dotprecision tmp(0.0);
01227   tmp.set_k(dot.get_k());
01228   accumulate(tmp,x,y);
01229   dot += tmp;
01230 }
01231 
01232 inline void accumulate(idotprecision& dot, const srvector_slice& x, const rvector_slice& y) {
01233   dotprecision tmp(0.0);
01234   tmp.set_k(dot.get_k());
01235   accumulate(tmp,x,y);
01236   dot += tmp;
01237 }
01238 
01239 inline void accumulate(idotprecision& dot, const rvector& x, const srvector_slice& y) {
01240   dotprecision tmp(0.0);
01241   tmp.set_k(dot.get_k());
01242   accumulate(tmp,x,y);
01243   dot += tmp;
01244 }
01245 
01246 inline void accumulate(idotprecision& dot, const rvector_slice& x, const srvector_slice& y) {
01247   dotprecision tmp(0.0);
01248   tmp.set_k(dot.get_k());
01249   accumulate(tmp,x,y);
01250   dot += tmp;
01251 }
01252 
01253 inline void accumulate(idotprecision& dot, const srvector_slice& x, const srvector_slice& y) {
01254   dotprecision tmp(0.0);
01255   tmp.set_k(dot.get_k());
01256   accumulate(tmp,x,y);
01257   dot += tmp;
01258 }
01259 
01260 inline void accumulate(idotprecision& dot, const srvector& x, const srvector_slice& y) {
01261   dotprecision tmp(0.0);
01262   tmp.set_k(dot.get_k());
01263   accumulate(tmp,x,y);
01264   dot += tmp;
01265 }
01266 
01267 inline void accumulate(idotprecision& dot, const srvector_slice& x, const srvector& y) {
01268   dotprecision tmp(0.0);
01269   tmp.set_k(dot.get_k());
01270   accumulate(tmp,x,y);
01271   dot += tmp;
01272 }
01273 
01274 inline void accumulate(cdotprecision& dot, const srvector& x, const srvector& y) {
01275   dotprecision tmp(0.0);
01276   tmp.set_k(dot.get_k());
01277   accumulate(tmp,x,y);
01278   dot += tmp;
01279 }
01280 
01281 inline void accumulate(cdotprecision& dot, const srvector& x, const rvector& y) {
01282   dotprecision tmp(0.0);
01283   tmp.set_k(dot.get_k());
01284   accumulate(tmp,x,y);
01285   dot += tmp;
01286 }
01287 
01288 inline void accumulate(cdotprecision& dot, const srvector& x, const rvector_slice& y) {
01289   dotprecision tmp(0.0);
01290   tmp.set_k(dot.get_k());
01291   accumulate(tmp,x,y);
01292   dot += tmp;
01293 }
01294 
01295 inline void accumulate(cdotprecision& dot, const rvector& x, const srvector& y) {
01296   dotprecision tmp(0.0);
01297   tmp.set_k(dot.get_k());
01298   accumulate(tmp,x,y);
01299   dot += tmp;
01300 }
01301 
01302 inline void accumulate(cdotprecision& dot, const rvector_slice& x, const srvector& y) {
01303   dotprecision tmp(0.0);
01304   tmp.set_k(dot.get_k());
01305   accumulate(tmp,x,y);
01306   dot += tmp;
01307 }
01308 
01309 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const rvector& y) {
01310   dotprecision tmp(0.0);
01311   tmp.set_k(dot.get_k());
01312   accumulate(tmp,x,y);
01313   dot += tmp;
01314 }
01315 
01316 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const rvector_slice& y) {
01317   dotprecision tmp(0.0);
01318   tmp.set_k(dot.get_k());
01319   accumulate(tmp,x,y);
01320   dot += tmp;
01321 }
01322 
01323 inline void accumulate(cdotprecision& dot, const rvector& x, const srvector_slice& y) {
01324   dotprecision tmp(0.0);
01325   tmp.set_k(dot.get_k());
01326   accumulate(tmp,x,y);
01327   dot += tmp;
01328 }
01329 
01330 inline void accumulate(cdotprecision& dot, const rvector_slice& x, const srvector_slice& y) {
01331   dotprecision tmp(0.0);
01332   tmp.set_k(dot.get_k());
01333   accumulate(tmp,x,y);
01334   dot += tmp;
01335 }
01336 
01337 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const srvector_slice& y) {
01338   dotprecision tmp(0.0);
01339   tmp.set_k(dot.get_k());
01340   accumulate(tmp,x,y);
01341   dot += tmp;
01342 }
01343 
01344 inline void accumulate(cdotprecision& dot, const srvector& x, const srvector_slice& y) {
01345   dotprecision tmp(0.0);
01346   tmp.set_k(dot.get_k());
01347   accumulate(tmp,x,y);
01348   dot += tmp;
01349 }
01350 
01351 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const srvector& y) {
01352   dotprecision tmp(0.0);
01353   tmp.set_k(dot.get_k());
01354   accumulate(tmp,x,y);
01355   dot += tmp;
01356 }
01357 
01358 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const srvector& y) {
01359   dotprecision tmp(0.0);
01360   tmp.set_k(dot.get_k());
01361   accumulate_approx(tmp,x,y);
01362   dot += tmp;
01363 }
01364 
01365 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const rvector& y) {
01366   dotprecision tmp(0.0);
01367   tmp.set_k(dot.get_k());
01368   accumulate_approx(tmp,x,y);
01369   dot += tmp;
01370 }
01371 
01372 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const rvector_slice& y) {
01373   dotprecision tmp(0.0);
01374   tmp.set_k(dot.get_k());
01375   accumulate_approx(tmp,x,y);
01376   dot += tmp;
01377 }
01378 
01379 inline void accumulate_approx(cdotprecision& dot, const rvector& x, const srvector& y) {
01380   dotprecision tmp(0.0);
01381   tmp.set_k(dot.get_k());
01382   accumulate_approx(tmp,x,y);
01383   dot += tmp;
01384 }
01385 
01386 inline void accumulate_approx(cdotprecision& dot, const rvector_slice& x, const srvector& y) {
01387   dotprecision tmp(0.0);
01388   tmp.set_k(dot.get_k());
01389   accumulate_approx(tmp,x,y);
01390   dot += tmp;
01391 }
01392 
01393 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const rvector& y) {
01394   dotprecision tmp(0.0);
01395   tmp.set_k(dot.get_k());
01396   accumulate_approx(tmp,x,y);
01397   dot += tmp;
01398 }
01399 
01400 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const rvector_slice& y) {
01401   dotprecision tmp(0.0);
01402   tmp.set_k(dot.get_k());
01403   accumulate_approx(tmp,x,y);
01404   dot += tmp;
01405 }
01406 
01407 inline void accumulate_approx(cdotprecision& dot, const rvector& x, const srvector_slice& y) {
01408   dotprecision tmp(0.0);
01409   tmp.set_k(dot.get_k());
01410   accumulate_approx(tmp,x,y);
01411   dot += tmp;
01412 }
01413 
01414 inline void accumulate_approx(cdotprecision& dot, const rvector_slice& x, const srvector_slice& y) {
01415   dotprecision tmp(0.0);
01416   tmp.set_k(dot.get_k());
01417   accumulate_approx(tmp,x,y);
01418   dot += tmp;
01419 }
01420 
01421 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const srvector_slice& y) {
01422   dotprecision tmp(0.0);
01423   tmp.set_k(dot.get_k());
01424   accumulate_approx(tmp,x,y);
01425   dot += tmp;
01426 }
01427 
01428 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const srvector_slice& y) {
01429   dotprecision tmp(0.0);
01430   tmp.set_k(dot.get_k());
01431   accumulate_approx(tmp,x,y);
01432   dot += tmp;
01433 }
01434 
01435 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const srvector& y) {
01436   dotprecision tmp(0.0);
01437   tmp.set_k(dot.get_k());
01438   accumulate_approx(tmp,x,y);
01439   dot += tmp;
01440 }
01441 
01442 inline void accumulate(cidotprecision& dot, const srvector& x, const srvector& y) {
01443   dotprecision tmp(0.0);
01444   tmp.set_k(dot.get_k());
01445   accumulate(tmp,x,y);
01446   dot += tmp;
01447 }
01448 
01449 inline void accumulate(cidotprecision& dot, const srvector& x, const rvector& y) {
01450   dotprecision tmp(0.0);
01451   tmp.set_k(dot.get_k());
01452   accumulate(tmp,x,y);
01453   dot += tmp;
01454 }
01455 
01456 inline void accumulate(cidotprecision& dot, const srvector& x, const rvector_slice& y) {
01457   dotprecision tmp(0.0);
01458   tmp.set_k(dot.get_k());
01459   accumulate(tmp,x,y);
01460   dot += tmp;
01461 }
01462 
01463 inline void accumulate(cidotprecision& dot, const rvector& x, const srvector& y) {
01464   dotprecision tmp(0.0);
01465   tmp.set_k(dot.get_k());
01466   accumulate(tmp,x,y);
01467   dot += tmp;
01468 }
01469 
01470 inline void accumulate(cidotprecision& dot, const rvector_slice& x, const srvector& y) {
01471   dotprecision tmp(0.0);
01472   tmp.set_k(dot.get_k());
01473   accumulate(tmp,x,y);
01474   dot += tmp;
01475 }
01476 
01477 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const rvector& y) {
01478   dotprecision tmp(0.0);
01479   tmp.set_k(dot.get_k());
01480   accumulate(tmp,x,y);
01481   dot += tmp;
01482 }
01483 
01484 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const rvector_slice& y) {
01485   dotprecision tmp(0.0);
01486   tmp.set_k(dot.get_k());
01487   accumulate(tmp,x,y);
01488   dot += tmp;
01489 }
01490 
01491 inline void accumulate(cidotprecision& dot, const rvector& x, const srvector_slice& y) {
01492   dotprecision tmp(0.0);
01493   tmp.set_k(dot.get_k());
01494   accumulate(tmp,x,y);
01495   dot += tmp;
01496 }
01497 
01498 inline void accumulate(cidotprecision& dot, const rvector_slice& x, const srvector_slice& y) {
01499   dotprecision tmp(0.0);
01500   tmp.set_k(dot.get_k());
01501   accumulate(tmp,x,y);
01502   dot += tmp;
01503 }
01504 
01505 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const srvector_slice& y) {
01506   dotprecision tmp(0.0);
01507   tmp.set_k(dot.get_k());
01508   accumulate(tmp,x,y);
01509   dot += tmp;
01510 }
01511 
01512 inline void accumulate(cidotprecision& dot, const srvector& x, const srvector_slice& y) {
01513   dotprecision tmp(0.0);
01514   tmp.set_k(dot.get_k());
01515   accumulate(tmp,x,y);
01516   dot += tmp;
01517 }
01518 
01519 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const srvector& y) {
01520   dotprecision tmp(0.0);
01521   tmp.set_k(dot.get_k());
01522   accumulate(tmp,x,y);
01523   dot += tmp;
01524 }
01525 
01526 
01527 } //namespace cxsc
01528 
01529 #include "sparsevector.inl"
01530 
01531 #endif

Generated on Thu Jun 9 11:22:21 2011 for C-XSC - A C++ Class Library for Extended Scientific Computing by  doxygen 1.4.6