scvector.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: scvector.hpp,v 1.10 2011/06/07 15:17:42 cxsc Exp $ */
00025 
00026 #ifndef _CXSC_SCVECTOR_HPP_INCLUDED
00027 #define _CXSC_SCVECTOR_HPP_INCLUDED
00028 
00029 #include <complex.hpp>
00030 #include <cvector.hpp>
00031 #include <vector>
00032 #include <iostream>
00033 #include <srvector.hpp>
00034 #include <sparsecdot.hpp>
00035 #include <sparsevector.hpp>
00036 
00037 namespace cxsc {
00038 
00039 class srvector_slice;
00040 class srmatrix;
00041 class srmatrix_slice;
00042 class srmatrix_subv;
00043 class scvector_slice;
00044 class scmatrix;
00045 class scmatrix_slice;
00046 class scmatrix_subv;
00047 class scivector;
00048 class scivector_slice;
00049 class scimatrix;
00050 class scimatrix_slice;
00051 class scimatrix_subv;
00052 
00053 class scvector {
00054   private:
00055     std::vector<int> p;
00056     std::vector<complex> x;
00057     int lb;
00058     int ub;
00059     int n; 
00060 
00061   public:
00062     scvector() : lb(0), ub(-1) , n(0) {
00063     }
00064 
00065     explicit scvector(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     scvector(const int s, const int b) : lb(1), ub(s), n(s) {
00071         p.reserve(b);
00072         x.reserve(b);
00073     }
00074 
00075     scvector(const cvector& 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     scvector(const rvector& v) : lb(Lb(v)), ub(Ub(v)), n(VecLen(v)) {
00085         for(int i=lb ; i<=ub ; i++) {
00086           if(v[i] != 0.0) {
00087             p.push_back(i-lb);
00088             x.push_back(complex(v[i]));
00089           }
00090         }
00091     }
00092 
00093     scvector(const int n, const int nnz, const intvector& index, const cvector& values) : lb(1), ub(n) {
00094       this->n = n;
00095       for(int i=0 ; i<nnz ; i++) {
00096         if(values[i+Lb(values)] != 0.0) {
00097           p.push_back(index[i+Lb(index)]);
00098           x.push_back(values[i+Lb(values)]);
00099         }
00100       }
00101     }
00102 
00103     scvector(const int n, const int nnz, const int* index, const complex* values) : lb(1), ub(n) {
00104       this->n = n;
00105       for(int i=0 ; i<nnz ; i++) {
00106         if(values[i] != 0.0) {
00107           p.push_back(index[i]);
00108           x.push_back(values[i]);
00109         }
00110       } 
00111     }
00112 
00113     scvector(const srvector& v) : p(v.p), lb(v.lb), ub(v.ub), n(v.n) {
00114       x.reserve(v.get_nnz());
00115       for(int i=0 ; i<v.get_nnz() ; i++) 
00116         x.push_back(complex(v.x[i]));
00117     }
00118 
00119     scvector(const srvector_slice&);
00120     scvector(const scvector_slice&);
00121     scvector(const srmatrix_subv& A);
00122     scvector(const scmatrix_subv& A);
00123 
00124     std::vector<int>& row_indices() {
00125       return p;
00126     }
00127 
00128     std::vector<complex>& values() {
00129       return x;
00130     }
00131 
00132     const std::vector<int>& row_indices() const {
00133       return p;
00134     }
00135 
00136     const std::vector<complex>& values() const {
00137       return x;
00138     }
00139 
00140     int get_nnz() const {
00141       return x.size();
00142     }
00143 
00144     real density() const {
00145       return (double)x.size()/n;
00146     }
00147 
00148     void dropzeros() {
00149       for(int i=0 ; i<get_nnz() ; i++) {
00150         if(x[i] == 0.0) {
00151            x.erase(x.begin()+i);
00152            p.erase(p.begin()+i);
00153         }
00154       }
00155     }
00156 
00157     scvector& operator=(const srvector& v) {
00158       n = v.n;
00159       p = v.p;
00160       x.clear();
00161       x.reserve(v.get_nnz());
00162       for(unsigned int i=0 ; i<v.x.size() ; i++)
00163         x[i] = complex(v.x[i]);
00164       return *this;
00165     } 
00166 
00167     scvector& operator=(const real& v) {
00168       return sp_vs_assign<scvector,real,complex>(*this,v);
00169     }
00170 
00171     scvector& operator=(const complex& v) {
00172       return sp_vs_assign<scvector,complex,complex>(*this,v);
00173     }
00174 
00175     scvector& operator=(const rvector& v) {
00176       return spf_vv_assign<scvector,rvector,complex>(*this,v);
00177     }
00178 
00179     scvector& operator=(const cvector& v) {
00180       return spf_vv_assign<scvector,cvector,complex>(*this,v);
00181     }
00182 
00183     scvector& operator=(const rvector_slice& v) {
00184       return spf_vv_assign<scvector,rvector_slice,complex>(*this,v);
00185     }
00186 
00187     scvector& operator=(const scvector_slice&);
00188     scvector& operator=(const srvector_slice&);
00189 
00190     complex& operator[](const int i) {
00191 #if(CXSC_INDEX_CHECK)
00192       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector::operator[](const int)"));
00193 #endif
00194       int k;
00195 
00196       for(k=0 ; k<get_nnz() && p[k]<=i-lb ; k++) {
00197         if(p[k] == i-lb) 
00198           return x[k];
00199       }
00200 
00201       p.insert(p.begin() + k, i-lb);
00202       x.insert(x.begin() + k, complex(0.0));
00203 
00204       return x[k];
00205     }
00206 
00207     complex operator[](const int i) const {
00208 #if(CXSC_INDEX_CHECK)
00209       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector::operator[](const int)"));
00210 #endif
00211       return (*this)(i);
00212     }
00213 
00214     complex operator()(const int i) const {
00215 #if(CXSC_INDEX_CHECK)
00216       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector::operator()(const int)"));
00217 #endif
00218       complex r(0.0);
00219 
00220       for(int k=0 ; k<get_nnz() && p[k]<=i-lb ; k++) {
00221         if(p[k] == i-lb) 
00222           r = x[k];
00223       }
00224 
00225       return r; 
00226     }
00227 
00228     scvector operator()(const intvector& per) {
00229       scvector v(n,get_nnz());
00230       intvector pinv = perminv(per);
00231 
00232       std::map<int,complex> work;
00233       for(int i=0 ; i<get_nnz() ; i++)
00234          work.insert(std::make_pair(pinv[Lb(pinv)+p[i]], x[i]));
00235  
00236       for(std::map<int,complex>::iterator it=work.begin() ; it!=work.end() ; it++) {
00237          v.p.push_back(it->first);
00238          v.x.push_back(it->second);
00239       }
00240 
00241       return v;
00242     }
00243 
00244     scvector operator()(const intmatrix& P) {
00245       intvector p = permvec(P);
00246       return (*this)(p);
00247     }
00248 
00249     scvector_slice operator()(const int, const int);
00250 
00251     scvector& operator*=(const real& s) {
00252       return sp_vs_multassign(*this,s);
00253     }
00254 
00255     scvector& operator*=(const complex& s) {
00256       return sp_vs_multassign(*this,s);
00257     }
00258 
00259     scvector& operator/=(const real& s) {
00260       return sp_vs_divassign(*this,s);
00261     }
00262 
00263     scvector& operator/=(const complex& s) {
00264       return sp_vs_divassign(*this,s);
00265     }
00266 
00267     scvector& operator+=(const rvector& v) {
00268       return spf_vv_addassign(*this,v);
00269     }
00270 
00271     scvector& operator+=(const cvector& v) {
00272       return spf_vv_addassign(*this,v);
00273     }
00274 
00275     scvector& operator+=(const rvector_slice& v) {
00276       return spf_vv_addassign(*this,v);
00277     }
00278 
00279     scvector& operator+=(const cvector_slice& v) {
00280       return spf_vv_addassign(*this,v);
00281     }
00282 
00283     scvector& operator+=(const srvector& v) {
00284       return spsp_vv_addassign(*this,v);
00285     }
00286 
00287     scvector& operator+=(const scvector& v) {
00288       return spsp_vv_addassign(*this,v);
00289     }
00290 
00291     scvector& operator-=(const rvector& v) {
00292       return spf_vv_subassign(*this,v);
00293     }
00294 
00295     scvector& operator-=(const cvector& v) {
00296       return spf_vv_subassign(*this,v);
00297     }
00298 
00299     scvector& operator-=(const rvector_slice& v) {
00300       return spf_vv_subassign(*this,v);
00301     }
00302 
00303     scvector& operator-=(const cvector_slice& v) {
00304       return spf_vv_subassign(*this,v);
00305     }
00306 
00307     scvector& operator-=(const srvector& v) {
00308       return spsp_vv_subassign(*this,v);
00309     }
00310 
00311     scvector& operator-=(const scvector& v) {
00312       return spsp_vv_subassign(*this,v);
00313     }
00314 
00315     scvector& operator+=(const srvector_slice&);
00316     scvector& operator+=(const scvector_slice&);
00317     scvector& operator-=(const srvector_slice&);
00318     scvector& operator-=(const scvector_slice&);
00319 
00320     friend void SetLb(scvector&, const int);
00321     friend void SetUb(scvector&, const int);
00322     friend int Lb(const scvector&);
00323     friend int Ub(const scvector&);
00324     friend srvector Re(const scvector&);
00325     friend srvector Im (const scvector&);
00326     friend scvector Inf(const scivector&);
00327     friend scvector Sup (const scivector&);
00328     friend scvector mid(const scivector&);
00329     friend scvector diam(const scivector&);
00330     friend scvector mid(const scivector_slice&);
00331     friend scvector diam(const scivector_slice&);
00332     friend int VecLen(const scvector&);
00333 
00334     friend class srvector_slice;
00335     friend class scvector_slice;
00336     friend class scivector_slice;
00337     friend class scivector;
00338     friend class cvector;
00339     friend class cvector_slice;
00340     friend class civector;
00341     friend class civector_slice;
00342 
00343 #include "vector_friend_declarations.inl"
00344 };
00345 
00346 inline cvector::cvector(const scvector& v) {
00347   l = v.lb;
00348   u = v.ub;
00349   size = v.n;
00350   dat = new complex[v.n];
00351   for(int i=0 ; i<v.n ; i++)
00352     dat[i] = 0.0;
00353   for(int i=0 ; i<v.get_nnz() ; i++)
00354     dat[v.p[i]] = v.x[i];
00355 }
00356 
00357 inline cvector::cvector(const srvector& v) {
00358   l = v.lb;
00359   u = v.ub;
00360   size = v.n;
00361   dat = new complex[v.n];
00362   for(int i=0 ; i<v.n ; i++)
00363     dat[i] = 0.0;
00364   for(int i=0 ; i<v.get_nnz() ; i++)
00365     dat[v.p[i]] = v.x[i];
00366 }
00367 
00368 inline cvector& cvector::operator=(const scvector& v) {
00369   return fsp_vv_assign<cvector,scvector,complex>(*this,v);
00370 }
00371 
00372 inline cvector& cvector::operator=(const scvector_slice& v) {
00373   return fsl_vv_assign<cvector,scvector_slice,complex>(*this,v);
00374 }
00375 
00376 inline cvector& cvector::operator=(const srvector& v) {
00377   return fsp_vv_assign<cvector,srvector,complex>(*this,v);
00378 }
00379 
00380 inline cvector& cvector::operator=(const srvector_slice& v) {
00381   return fsl_vv_assign<cvector,srvector_slice,complex>(*this,v);
00382 }
00383 
00384 inline void SetLb(scvector& v, const int i) {
00385   v.lb = i;
00386   v.ub = v.lb + v.n - 1;
00387 }
00388 
00389 inline void SetUb(scvector& v, const int j) {
00390   v.ub = j;
00391   v.lb = v.ub - v.n + 1;
00392 }
00393 
00394 inline int Lb(const scvector& v) {
00395   return v.lb;
00396 }
00397 
00398 inline int Ub(const scvector& v) {
00399   return v.ub;
00400 }
00401 
00402 inline srvector Re(const scvector& v) {
00403   srvector res(v.n, v.get_nnz());
00404   res.lb = v.lb;
00405   res.ub = v.ub;
00406   res.p  = v.p;
00407   for(int i=0 ; i<v.get_nnz() ; i++)
00408     res.x[i] = Re(v.x[i]);
00409   return res;
00410 }
00411 
00412 inline srvector Im(const scvector& v) {
00413   srvector res(v.n, v.get_nnz());
00414   res.lb = v.lb;
00415   res.ub = v.ub;
00416   res.p  = v.p;
00417   for(int i=0 ; i<v.get_nnz() ; i++)
00418     res.x[i] = Im(v.x[i]);
00419   return res;
00420 }
00421 
00422 inline int VecLen(const scvector& v) {
00423   return v.n;
00424 }
00425 
00426 inline void Resize(scvector& v) {
00427   sp_v_resize(v);
00428 }
00429 
00430 inline void Resize(scvector& v, const int n) {
00431   sp_v_resize(v,n);
00432 }
00433 
00434 inline void Resize(scvector& v, const int l, const int u) {
00435   sp_v_resize(v,l,u);
00436 }
00437 
00438 inline scvector operator-(const scvector& v) {
00439   return sp_v_negative(v);
00440 }
00441 
00442 inline complex operator*(const scvector& v1, const cvector& v2) {
00443   return spf_vv_mult<scvector,cvector,complex,sparse_cdot>(v1,v2);
00444 }
00445 
00446 inline complex operator*(const scvector& v1, const rvector& v2) {
00447   return spf_vv_mult<scvector,rvector,complex,sparse_cdot>(v1,v2);
00448 }
00449 
00450 inline complex operator*(const srvector& v1, const cvector& v2) {
00451   return spf_vv_mult<srvector,cvector,complex,sparse_cdot>(v1,v2);
00452 }
00453 
00454 inline complex operator*(const rvector& v1, const scvector& v2) {
00455   return fsp_vv_mult<rvector,scvector,complex,sparse_cdot>(v1,v2);
00456 }
00457 
00458 inline complex operator*(const cvector& v1, const srvector& v2) {
00459   return fsp_vv_mult<cvector,srvector,complex,sparse_cdot>(v1,v2);
00460 }
00461 
00462 inline complex operator*(const cvector& v1, const scvector& v2) {
00463   return fsp_vv_mult<cvector,scvector,complex,sparse_cdot>(v1,v2);
00464 }
00465 
00466 inline complex operator*(const scvector& v1, const rvector_slice& v2) {
00467   return spf_vv_mult<scvector,rvector_slice,complex,sparse_cdot>(v1,v2);
00468 }
00469 
00470 inline complex operator*(const scvector& v1, const cvector_slice& v2) {
00471   return spf_vv_mult<scvector,cvector_slice,complex,sparse_cdot>(v1,v2);
00472 }
00473 
00474 inline complex operator*(const srvector& v1, const cvector_slice& v2) {
00475   return spf_vv_mult<srvector,cvector_slice,complex,sparse_cdot>(v1,v2);
00476 }
00477 
00478 inline complex operator*(const cvector_slice& v1, const srvector& v2) {
00479   return fsp_vv_mult<cvector_slice,srvector,complex,sparse_cdot>(v1,v2);
00480 }
00481 
00482 inline complex operator*(const cvector_slice& v1, const scvector& v2) {
00483   return fsp_vv_mult<cvector_slice,scvector,complex,sparse_cdot>(v1,v2);
00484 }
00485 
00486 inline complex operator*(const rvector_slice& v1, const scvector& v2) {
00487   return fsp_vv_mult<rvector_slice,scvector,complex,sparse_cdot>(v1,v2);
00488 }
00489 
00490 inline complex operator*(const scvector& v1, const srvector& v2) {
00491   return spsp_vv_mult<scvector,srvector,complex,sparse_cdot>(v1,v2);
00492 }
00493 
00494 inline complex operator*(const srvector& v1, const scvector& v2) {
00495   return spsp_vv_mult<srvector,scvector,complex,sparse_cdot>(v1,v2);
00496 }
00497 
00498 inline complex operator*(const scvector& v1, const scvector& v2) {
00499   return spsp_vv_mult<scvector,scvector,complex,sparse_cdot>(v1,v2);
00500 }
00501 
00502 inline scvector operator*(const scvector& v, const real& s) {
00503   return sp_vs_mult<scvector,real,scvector>(v,s);
00504 }
00505 
00506 inline scvector operator*(const scvector& v, const complex& s) {
00507   return sp_vs_mult<scvector,complex,scvector>(v,s);
00508 }
00509 
00510 inline scvector operator*(const srvector& v, const complex& s) {
00511   return sp_vs_mult<srvector,complex,scvector>(v,s);
00512 }
00513 
00514 inline scvector operator/(const scvector& v, const real& s) {
00515   return sp_vs_div<scvector,real,scvector>(v,s);
00516 }
00517 
00518 inline scvector operator/(const scvector& v, const complex& s) {
00519   return sp_vs_div<scvector,complex,scvector>(v,s);
00520 }
00521 
00522 inline scvector operator/(const srvector& v, const complex& s) {
00523   return sp_vs_div<srvector,complex,scvector>(v,s);
00524 }
00525 
00526 inline scvector operator*(const real& s, const scvector& v) {
00527   return sp_sv_mult<real,scvector,scvector>(s,v);
00528 }
00529 
00530 inline scvector operator*(const complex& s, const scvector& v) {
00531   return sp_sv_mult<complex,scvector,scvector>(s,v);
00532 }
00533 
00534 inline scvector operator*(const complex& s, const srvector& v) {
00535   return sp_sv_mult<complex,srvector,scvector>(s,v);
00536 }
00537 
00538 inline cvector operator+(const cvector& v1, const srvector& v2) {
00539   return fsp_vv_add<cvector,srvector,cvector>(v1,v2);
00540 }
00541 
00542 inline cvector operator+(const rvector& v1, const scvector& v2) {
00543   return fsp_vv_add<rvector,scvector,cvector>(v1,v2);
00544 }
00545 
00546 inline cvector operator+(const cvector& v1, const scvector& v2) {
00547   return fsp_vv_add<cvector,scvector,cvector>(v1,v2);
00548 }
00549 
00550 inline cvector operator+(const scvector& v1, const rvector& v2) {
00551   return spf_vv_add<scvector,rvector,cvector>(v1,v2);
00552 }
00553 
00554 inline cvector operator+(const srvector& v1, const cvector& v2) {
00555   return spf_vv_add<srvector,cvector,cvector>(v1,v2);
00556 }
00557 
00558 inline cvector operator+(const scvector& v1, const cvector& v2) {
00559   return spf_vv_add<scvector,cvector,cvector>(v1,v2);
00560 }
00561 
00562 inline cvector operator+(const cvector_slice& v1, const srvector& v2) {
00563   return fsp_vv_add<cvector_slice,srvector,cvector>(v1,v2);
00564 }
00565 
00566 inline cvector operator+(const rvector_slice& v1, const scvector& v2) {
00567   return fsp_vv_add<rvector_slice,scvector,cvector>(v1,v2);
00568 }
00569 
00570 inline cvector operator+(const cvector_slice& v1, const scvector& v2) {
00571   return fsp_vv_add<cvector_slice,scvector,cvector>(v1,v2);
00572 }
00573 
00574 inline cvector operator+(const scvector& v1, const rvector_slice& v2) {
00575   return spf_vv_add<scvector,rvector_slice,cvector>(v1,v2);
00576 }
00577 
00578 inline cvector operator+(const srvector& v1, const cvector_slice& v2) {
00579   return spf_vv_add<srvector,cvector_slice,cvector>(v1,v2);
00580 }
00581 
00582 inline cvector operator+(const scvector& v1, const cvector_slice& v2) {
00583   return spf_vv_add<scvector,cvector_slice,cvector>(v1,v2);
00584 }
00585 
00586 inline scvector operator+(const scvector& v1, const srvector& v2) {
00587   return spsp_vv_add<scvector,srvector,scvector,complex>(v1,v2);
00588 }
00589 
00590 inline scvector operator+(const srvector& v1, const scvector& v2) {
00591   return spsp_vv_add<srvector,scvector,scvector,complex>(v1,v2);
00592 }
00593 
00594 inline scvector operator+(const scvector& v1, const scvector& v2) {
00595   return spsp_vv_add<scvector,scvector,scvector,complex>(v1,v2);
00596 }
00597 
00598 inline cvector operator-(const cvector& v1, const srvector& v2) {
00599   return fsp_vv_sub<cvector,srvector,cvector>(v1,v2);
00600 }
00601 
00602 inline cvector operator-(const rvector& v1, const scvector& v2) {
00603   return fsp_vv_sub<rvector,scvector,cvector>(v1,v2);
00604 }
00605 
00606 inline cvector operator-(const cvector& v1, const scvector& v2) {
00607   return fsp_vv_sub<cvector,scvector,cvector>(v1,v2);
00608 }
00609 
00610 inline cvector operator-(const scvector& v1, const rvector& v2) {
00611   return spf_vv_sub<scvector,rvector,cvector>(v1,v2);
00612 }
00613 
00614 inline cvector operator-(const srvector& v1, const cvector& v2) {
00615   return spf_vv_sub<srvector,cvector,cvector>(v1,v2);
00616 }
00617 
00618 inline cvector operator-(const scvector& v1, const cvector& v2) {
00619   return spf_vv_sub<scvector,cvector,cvector>(v1,v2);
00620 }
00621 
00622 inline cvector operator-(const cvector_slice& v1, const srvector& v2) {
00623   return fsp_vv_sub<cvector_slice,srvector,cvector>(v1,v2);
00624 }
00625 
00626 inline cvector operator-(const rvector_slice& v1, const scvector& v2) {
00627   return fsp_vv_sub<rvector_slice,scvector,cvector>(v1,v2);
00628 }
00629 
00630 inline cvector operator-(const cvector_slice& v1, const scvector& v2) {
00631   return fsp_vv_sub<cvector_slice,scvector,cvector>(v1,v2);
00632 }
00633 
00634 inline cvector operator-(const scvector& v1, const rvector_slice& v2) {
00635   return spf_vv_sub<scvector,rvector_slice,cvector>(v1,v2);
00636 }
00637 
00638 inline cvector operator-(const srvector& v1, const cvector_slice& v2) {
00639   return spf_vv_sub<srvector,cvector_slice,cvector>(v1,v2);
00640 }
00641 
00642 inline cvector operator-(const scvector& v1, const cvector_slice& v2) {
00643   return spf_vv_sub<scvector,cvector_slice,cvector>(v1,v2);
00644 }
00645 
00646 inline scvector operator-(const scvector& v1, const srvector& v2) {
00647   return spsp_vv_sub<scvector,srvector,scvector,complex>(v1,v2);
00648 }
00649 
00650 inline scvector operator-(const srvector& v1, const scvector& v2) {
00651   return spsp_vv_sub<srvector,scvector,scvector,complex>(v1,v2);
00652 }
00653 
00654 inline scvector operator-(const scvector& v1, const scvector& v2) {
00655   return spsp_vv_sub<scvector,scvector,scvector,complex>(v1,v2);
00656 }
00657 
00658 inline cvector& cvector::operator+=(const srvector& v2) {
00659   return fsp_vv_addassign(*this,v2);
00660 }
00661 
00662 inline cvector& cvector::operator+=(const scvector& v2) {
00663   return fsp_vv_addassign(*this,v2);
00664 }
00665 
00666 inline cvector_slice& cvector_slice::operator+=(const srvector& v2) {
00667   return fsp_vv_addassign(*this,v2);
00668 }
00669 
00670 inline cvector_slice& cvector_slice::operator+=(const scvector& v2) {
00671   return fsp_vv_addassign(*this,v2);
00672 }
00673  
00674 inline cvector& cvector::operator-=(const srvector& v2) {
00675   return fsp_vv_subassign(*this,v2);
00676 }
00677 
00678 inline cvector& cvector::operator-=(const scvector& v2) {
00679   return fsp_vv_subassign(*this,v2);
00680 }
00681 
00682 inline cvector_slice& cvector_slice::operator-=(const srvector& v2) {
00683   return fsp_vv_subassign(*this,v2);
00684 }
00685 
00686 inline cvector_slice& cvector_slice::operator-=(const scvector& v2) {
00687   return fsp_vv_subassign(*this,v2);
00688 }
00689 
00690 inline bool operator==(const scvector& v1, const scvector& v2) {
00691   return spsp_vv_comp(v1,v2);
00692 }
00693 
00694 inline bool operator==(const scvector& v1, const srvector& v2) {
00695   return spsp_vv_comp(v1,v2);
00696 }
00697 
00698 inline bool operator==(const srvector& v1, const scvector& v2) {
00699   return spsp_vv_comp(v1,v2);
00700 }
00701 
00702 inline bool operator==(const scvector& v1, const rvector& v2) {
00703   return spf_vv_comp(v1,v2);
00704 }
00705 
00706 inline bool operator==(const srvector& v1, const cvector& v2) {
00707   return spf_vv_comp(v1,v2);
00708 }
00709 
00710 inline bool operator==(const scvector& v1, const cvector& v2) {
00711   return spf_vv_comp(v1,v2);
00712 }
00713 
00714 inline bool operator==(const cvector& v1, const srvector& v2) {
00715   return fsp_vv_comp(v1,v2);
00716 }
00717 
00718 inline bool operator==(const rvector& v1, const scvector& v2) {
00719   return fsp_vv_comp(v1,v2);
00720 }
00721 
00722 inline bool operator==(const cvector& v1, const scvector& v2) {
00723   return fsp_vv_comp(v1,v2);
00724 }
00725 
00726 inline bool operator==(const scvector& v1, const rvector_slice& v2) {
00727   return spf_vv_comp(v1,v2);
00728 }
00729 
00730 inline bool operator==(const srvector& v1, const cvector_slice& v2) {
00731   return spf_vv_comp(v1,v2);
00732 }
00733 
00734 inline bool operator==(const scvector& v1, const cvector_slice& v2) {
00735   return spf_vv_comp(v1,v2);
00736 }
00737 
00738 inline bool operator==(const cvector_slice& v1, const srvector& v2) {
00739   return fsp_vv_comp(v1,v2);
00740 }
00741 
00742 inline bool operator==(const rvector_slice& v1, const scvector& v2) {
00743   return fsp_vv_comp(v1,v2);
00744 }
00745 
00746 inline bool operator==(const cvector_slice& v1, const scvector& v2) {
00747   return fsp_vv_comp(v1,v2);
00748 }
00749 
00750 inline bool operator!=(const scvector& v1, const srvector& v2) {
00751   return !spsp_vv_comp(v1,v2);
00752 }
00753 
00754 inline bool operator!=(const srvector& v1, const scvector& v2) {
00755   return !spsp_vv_comp(v1,v2);
00756 }
00757 
00758 inline bool operator!=(const scvector& v1, const scvector& v2) {
00759   return !spsp_vv_comp(v1,v2);
00760 }
00761 
00762 inline bool operator!=(const scvector& v1, const rvector& v2) {
00763   return !spf_vv_comp(v1,v2);
00764 }
00765 
00766 inline bool operator!=(const srvector& v1, const cvector& v2) {
00767   return !spf_vv_comp(v1,v2);
00768 }
00769 
00770 inline bool operator!=(const scvector& v1, const cvector& v2) {
00771   return !spf_vv_comp(v1,v2);
00772 }
00773 
00774 inline bool operator!=(const cvector& v1, const srvector& v2) {
00775   return !fsp_vv_comp(v1,v2);
00776 }
00777 
00778 inline bool operator!=(const rvector& v1, const scvector& v2) {
00779   return !fsp_vv_comp(v1,v2);
00780 }
00781 
00782 inline bool operator!=(const cvector& v1, const scvector& v2) {
00783   return !fsp_vv_comp(v1,v2);
00784 }
00785 
00786 inline bool operator!=(const scvector& v1, const rvector_slice& v2) {
00787   return !spf_vv_comp(v1,v2);
00788 }
00789 
00790 inline bool operator!=(const srvector& v1, const cvector_slice& v2) {
00791   return !spf_vv_comp(v1,v2);
00792 }
00793 
00794 inline bool operator!=(const scvector& v1, const cvector_slice& v2) {
00795   return !spf_vv_comp(v1,v2);
00796 }
00797 
00798 inline bool operator!=(const cvector_slice& v1, const srvector& v2) {
00799   return !fsp_vv_comp(v1,v2);
00800 }
00801 
00802 inline bool operator!=(const rvector_slice& v1, const scvector& v2) {
00803   return !fsp_vv_comp(v1,v2);
00804 }
00805 
00806 inline bool operator!=(const cvector_slice& v1, const scvector& v2) {
00807   return !fsp_vv_comp(v1,v2);
00808 }
00809 
00810 inline std::ostream& operator<<(std::ostream& os, const scvector& v) {
00811   return sp_v_output<scvector,complex>(os,v);
00812 }
00813 
00814 inline std::istream& operator>>(std::istream& is, scvector& v) {
00815   return sp_v_input<scvector,complex>(is,v);
00816 }
00817 
00818 
00819 class scvector_slice {
00820   private:
00821     std::vector<int>& p;
00822     std::vector<complex>& x;
00823     scvector& orig;
00824     int start,end;
00825     int lb;
00826     int ub;
00827     int n;
00828     int nnz;
00829     int offset;
00830 
00831     scvector_slice(scvector& v, int l, int u) : p(v.p), x(v.x), orig(v), lb(l), ub(u), n(u-l+1)  {
00832       int i;
00833 
00834       for(i=0 ; i<v.get_nnz() && p[i]<lb-v.lb ; i++);
00835 
00836       start = i;
00837 
00838       for(i=start ; i<v.get_nnz() && p[i]<=ub-v.lb ; i++);
00839 
00840       end = i-1;
00841 
00842       nnz = end-start+1;
00843       offset = lb-v.lb;
00844     }
00845 
00846   public:
00847 
00848     int get_nnz() const {
00849       return nnz;
00850     }
00851 
00852     real density() const {
00853       return (double)nnz/n;
00854     }
00855 
00856     complex& operator[](const int i) {
00857 #if(CXSC_INDEX_CHECK)
00858       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector_slice::operator[](const int)"));
00859 #endif
00860       int k;
00861 
00862       for(k=start ; k<end+1 && p[k]-start<=i-lb ; k++) {
00863         if(p[k]-offset == i-lb) 
00864           return x[k];
00865       }
00866 
00867       p.insert(p.begin() + k, i-lb);
00868       x.insert(x.begin() + k, complex(0.0));
00869       end++;
00870 
00871       return x[k];
00872     }
00873 
00874     complex operator[](const int i) const {
00875 #if(CXSC_INDEX_CHECK)
00876       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector_slice::operator[](const int)"));
00877 #endif
00878       return (*this)(i);
00879     }
00880 
00881     complex operator()(const int i) const {
00882 #if(CXSC_INDEX_CHECK)
00883       if(i<lb || i>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector_slice::operator()(const int)"));
00884 #endif
00885       complex r(0.0);
00886 
00887       for(int k=start ; k<end && p[k]-start<=i-lb ; k++) {
00888         if(p[k]-start == i-lb) 
00889           r = x[k];
00890       }
00891 
00892       return r; 
00893     }
00894 
00895     scvector_slice& operator=(const real& v) {
00896       return sl_vs_assign<scvector_slice,real,complex,std::vector<complex>::iterator>(*this,v);
00897     }
00898 
00899     scvector_slice& operator=(const complex& v) {
00900       return sl_vs_assign<scvector_slice,complex,complex,std::vector<complex>::iterator>(*this,v);
00901     }
00902 
00903     scvector_slice& operator=(const srvector_slice& v) {
00904       return slsl_vv_assign<scvector_slice,srvector_slice,complex,std::vector<complex>::iterator>(*this,v);
00905     }
00906 
00907     scvector_slice& operator=(const scvector_slice& v) {
00908       return slsl_vv_assign<scvector_slice,scvector_slice,complex,std::vector<complex>::iterator>(*this,v);
00909     }
00910 
00911     scvector_slice& operator=(const srvector& v) {
00912       return slsp_vv_assign<scvector_slice,srvector,complex,std::vector<complex>::iterator>(*this,v);
00913     }
00914 
00915     scvector_slice& operator=(const scvector& v) {
00916       return slsp_vv_assign<scvector_slice,scvector,complex,std::vector<complex>::iterator>(*this,v);
00917     }
00918 
00919     scvector_slice& operator=(const rvector& v) {
00920       return slf_vv_assign<scvector_slice,rvector,complex,std::vector<complex>::iterator>(*this,v);
00921     }
00922 
00923     scvector_slice& operator=(const cvector& v) {
00924       return slf_vv_assign<scvector_slice,cvector,complex,std::vector<complex>::iterator>(*this,v);
00925     }
00926 
00927     scvector_slice& operator=(const rvector_slice& v) {
00928       return slf_vv_assign<scvector_slice,rvector_slice,complex,std::vector<complex>::iterator>(*this,v);
00929     }
00930 
00931     scvector_slice& operator=(const cvector_slice& v) {
00932       return slf_vv_assign<scvector_slice,cvector_slice,complex,std::vector<complex>::iterator>(*this,v);
00933     }
00934 
00935     scvector_slice& operator*=(const real& s) {
00936       return sl_vs_multassign(*this,s);
00937     }
00938 
00939     scvector_slice& operator*=(const complex& s) {
00940       return sl_vs_multassign(*this,s);
00941     }
00942 
00943     scvector_slice& operator/=(const real& s) {
00944       return sl_vs_divassign(*this,s);
00945     }
00946 
00947     scvector_slice& operator/=(const complex& s) {
00948       return sl_vs_divassign(*this,s);
00949     }
00950 
00951     scvector_slice& operator+=(const rvector& v) {
00952       return slf_vv_addassign<scvector_slice,rvector,complex>(*this,v);
00953     }
00954 
00955     scvector_slice& operator+=(const cvector& v) {
00956       return slf_vv_addassign<scvector_slice,cvector,complex>(*this,v);
00957     }
00958 
00959     scvector_slice& operator+=(const rvector_slice& v) {
00960       return slf_vv_addassign<scvector_slice,rvector_slice,complex>(*this,v);
00961     }
00962 
00963     scvector_slice& operator+=(const cvector_slice& v) {
00964       return slf_vv_addassign<scvector_slice,cvector_slice,complex>(*this,v);
00965     }
00966 
00967     scvector_slice& operator+=(const srvector& v) {
00968       return slsp_vv_addassign(*this,v);
00969     }
00970 
00971     scvector_slice& operator+=(const scvector& v) {
00972       return slsp_vv_addassign(*this,v);
00973     }
00974 
00975     scvector_slice& operator+=(const srvector_slice& v) {
00976       return slsl_vv_addassign(*this,v);
00977     }
00978 
00979     scvector_slice& operator+=(const scvector_slice& v) {
00980       return slsl_vv_addassign(*this,v);
00981     }
00982 
00983     scvector_slice& operator-=(const rvector& v) {
00984       return slf_vv_subassign<scvector_slice,rvector,complex>(*this,v);
00985     }
00986 
00987     scvector_slice& operator-=(const cvector& v) {
00988       return slf_vv_subassign<scvector_slice,cvector,complex>(*this,v);
00989     }
00990 
00991     scvector_slice& operator-=(const rvector_slice& v) {
00992       return slf_vv_subassign<scvector_slice,rvector_slice,complex>(*this,v);
00993     }
00994 
00995     scvector_slice& operator-=(const cvector_slice& v) {
00996       return slf_vv_subassign<scvector_slice,cvector_slice,complex>(*this,v);
00997     }
00998 
00999     scvector_slice& operator-=(const srvector& v) {
01000       return slsp_vv_subassign(*this,v);
01001     }
01002 
01003     scvector_slice& operator-=(const scvector& v) {
01004       return slsp_vv_subassign(*this,v);
01005     }
01006 
01007     scvector_slice& operator-=(const srvector_slice& v) {
01008       return slsl_vv_subassign(*this,v);
01009     }
01010 
01011     scvector_slice& operator-=(const scvector_slice& v) {
01012       return slsl_vv_subassign(*this,v);
01013     }
01014 
01015     friend int Lb(const scvector_slice&);
01016     friend int Ub(const scvector_slice&);
01017     friend srvector Re(const scvector_slice&);
01018     friend srvector Im(const scvector_slice&);
01019     friend int VecLen(const scvector_slice&);
01020 
01021 //     friend srvector operator*(const srmatrix&, const srvector_slice&); //ok
01022 //     friend srvector operator*(const srmatrix_slice&, const srvector_slice&); //ok
01023 
01024     friend class srvector;
01025     friend class scvector;
01026     friend class scivector;
01027     friend class cvector;
01028     friend class cvector_slice;
01029     friend class civector;
01030     friend class civector_slice;
01031 
01032 #include "vector_friend_declarations.inl"
01033 };
01034 
01035 inline cvector::cvector(const scvector_slice& v) {
01036   l = v.lb;
01037   u = v.ub;
01038   size = v.n;
01039   dat = new complex[v.n];
01040   for(int i=0 ; i<v.n ; i++)
01041     dat[i] = 0.0;
01042   for(int i=v.start ; i<=v.end ; i++)
01043     dat[v.p[i]] = v.x[i];
01044 }
01045 
01046 inline cvector::cvector(const srvector_slice& v) {
01047   l = v.lb;
01048   u = v.ub;
01049   size = v.n;
01050   dat = new complex[v.n];
01051   for(int i=0 ; i<v.n ; i++)
01052     dat[i] = 0.0;
01053   for(int i=v.start ; i<=v.end ; i++)
01054     dat[v.p[i]] = v.x[i];
01055 }
01056 
01057 inline cvector_slice& cvector_slice::operator=(const srvector& v) {
01058   *this = rvector(v);
01059   return *this;
01060 }
01061 
01062 inline cvector_slice& cvector_slice::operator=(const srvector_slice& v) {
01063   *this = rvector(v);
01064   return *this;
01065 }
01066 
01067 inline cvector_slice& cvector_slice::operator=(const scvector& v) {
01068   *this = cvector(v);
01069   return *this;
01070 }
01071 
01072 inline cvector_slice& cvector_slice::operator=(const scvector_slice& v) {
01073   *this = cvector(v);
01074   return *this;
01075 }
01076 
01077 inline scvector::scvector(const srvector_slice& s) : lb(s.lb), ub(s.ub), n(s.n)  {
01078   p.reserve(s.nnz);
01079   x.reserve(s.nnz);
01080 
01081   for(int i=s.start ; i<=s.end ; i++) {
01082     p.push_back(s.p[i]-s.offset);
01083     x.push_back(complex(s.x[i]));
01084   }
01085 
01086 }
01087 
01088 inline scvector::scvector(const scvector_slice& s) : lb(s.lb), ub(s.ub), n(s.n) {
01089   p.reserve(s.nnz);
01090   x.reserve(s.nnz);
01091 
01092   for(int i=s.start ; i<=s.end ; i++) {
01093     p.push_back(s.p[i]-s.offset);
01094     x.push_back(s.x[i]);
01095   }
01096 
01097 }
01098 
01099 inline scvector& scvector::operator=(const srvector_slice& v) {
01100   return spsl_vv_assign<scvector,srvector_slice,complex>(*this,v);
01101 }
01102 
01103 inline scvector& scvector::operator=(const scvector_slice& v) {
01104   return spsl_vv_assign<scvector,scvector_slice,complex>(*this,v);
01105 }
01106 
01107 inline scvector_slice scvector::operator()(const int i, const int j) {
01108 #if(CXSC_INDEX_CHECK)
01109   if(i<lb || j>ub) cxscthrow(ELEMENT_NOT_IN_VEC("scvector_slice::operator()(const int, const int)"));
01110 #endif
01111   return scvector_slice(*this,i,j);
01112 }
01113 
01114 inline scvector operator-(const scvector_slice& v) {
01115   return sl_v_negative<scvector_slice,scvector>(v);
01116 }
01117 
01118 inline int Lb(const scvector_slice& v) {
01119   return v.lb;
01120 }
01121 
01122 inline int Ub(const scvector_slice& v) {
01123   return v.ub;
01124 }
01125 
01126 inline srvector Re(const scvector_slice& v) {
01127   return Re(scvector(v));
01128 }
01129 
01130 inline srvector Im(const scvector_slice& v) {
01131   return Im(scvector(v));
01132 }
01133 
01134 inline int VecLen(const scvector_slice& v) {
01135   return v.n;
01136 }
01137 
01138 inline complex operator*(const scvector_slice& v1, const rvector& v2) {
01139   return slf_vv_mult<scvector_slice,rvector,complex,sparse_cdot>(v1,v2);
01140 }
01141 
01142 inline complex operator*(const srvector_slice& v1, const cvector& v2) {
01143   return slf_vv_mult<srvector_slice,cvector,complex,sparse_cdot>(v1,v2);
01144 }
01145 
01146 inline complex operator*(const scvector_slice& v1, const cvector& v2) {
01147   return slf_vv_mult<scvector_slice,cvector,complex,sparse_cdot>(v1,v2);
01148 }
01149 
01150 inline complex operator*(const cvector& v1, const srvector_slice& v2) {
01151   return fsl_vv_mult<cvector,srvector_slice,complex,sparse_cdot>(v1,v2);
01152 }
01153 
01154 inline complex operator*(const rvector& v1, const scvector_slice& v2) {
01155   return fsl_vv_mult<rvector,scvector_slice,complex,sparse_cdot>(v1,v2);
01156 }
01157 
01158 inline complex operator*(const cvector& v1, const scvector_slice& v2) {
01159   return fsl_vv_mult<cvector,scvector_slice,complex,sparse_cdot>(v1,v2);
01160 }
01161 
01162 inline complex operator*(const scvector_slice& v1, const rvector_slice& v2) {
01163   return slf_vv_mult<scvector_slice,rvector_slice,complex,sparse_cdot>(v1,v2);
01164 }
01165 
01166 inline complex operator*(const srvector_slice& v1, const cvector_slice& v2) {
01167   return slf_vv_mult<srvector_slice,cvector_slice,complex,sparse_cdot>(v1,v2);
01168 }
01169 
01170 inline complex operator*(const scvector_slice& v1, const cvector_slice& v2) {
01171   return slf_vv_mult<scvector_slice,cvector_slice,complex,sparse_cdot>(v1,v2);
01172 }
01173 
01174 inline complex operator*(const cvector_slice& v1, const srvector_slice& v2) {
01175   return fsl_vv_mult<cvector_slice,srvector_slice,complex,sparse_cdot>(v1,v2);
01176 }
01177 
01178 inline complex operator*(const rvector_slice& v1, const scvector_slice& v2) {
01179   return fsl_vv_mult<rvector_slice,scvector_slice,complex,sparse_cdot>(v1,v2);
01180 }
01181 
01182 inline complex operator*(const cvector_slice& v1, const scvector_slice& v2) {
01183   return fsl_vv_mult<cvector_slice,scvector_slice,complex,sparse_cdot>(v1,v2);
01184 }
01185 
01186 inline complex operator*(const scvector& v1, const srvector_slice& v2) {
01187   return spsl_vv_mult<scvector,srvector_slice,complex,sparse_cdot>(v1,v2);
01188 }
01189 
01190 inline complex operator*(const srvector& v1, const scvector_slice& v2) {
01191   return spsl_vv_mult<srvector,scvector_slice,complex,sparse_cdot>(v1,v2);
01192 }
01193 
01194 inline complex operator*(const scvector& v1, const scvector_slice& v2) {
01195   return spsl_vv_mult<scvector,scvector_slice,complex,sparse_cdot>(v1,v2);
01196 }
01197 
01198 inline complex operator*(const scvector_slice& v1, const srvector& v2) {
01199   return slsp_vv_mult<scvector_slice,srvector,complex,sparse_cdot>(v1,v2);
01200 }
01201 
01202 inline complex operator*(const srvector_slice& v1, const scvector& v2) {
01203   return slsp_vv_mult<srvector_slice,scvector,complex,sparse_cdot>(v1,v2);
01204 }
01205 
01206 inline complex operator*(const scvector_slice& v1, const scvector& v2) {
01207   return slsp_vv_mult<scvector_slice,scvector,complex,sparse_cdot>(v1,v2);
01208 }
01209 
01210 inline complex operator*(const scvector_slice& v1, const srvector_slice& v2) {
01211   return slsl_vv_mult<scvector_slice,srvector_slice,complex,sparse_cdot>(v1,v2);
01212 }
01213 
01214 inline complex operator*(const srvector_slice& v1, const scvector_slice& v2) {
01215   return slsl_vv_mult<srvector_slice,scvector_slice,complex,sparse_cdot>(v1,v2);
01216 }
01217 
01218 inline complex operator*(const scvector_slice& v1, const scvector_slice& v2) {
01219   return slsl_vv_mult<scvector_slice,scvector_slice,complex,sparse_cdot>(v1,v2);
01220 }
01221 
01222 inline scvector operator*(const scvector_slice& v, const real& s) {
01223   return sp_vs_mult<scvector_slice,real,scvector>(v,s);
01224 }
01225 
01226 inline scvector operator*(const scvector_slice& v, const complex& s) {
01227   return sp_vs_mult<scvector_slice,complex,scvector>(v,s);
01228 }
01229 
01230 inline scvector operator*(const srvector_slice& v, const complex& s) {
01231   return sp_vs_mult<srvector_slice,complex,scvector>(v,s);
01232 }
01233 
01234 inline scvector operator/(const scvector_slice& v, const real& s) {
01235   return sp_vs_div<scvector_slice,real,scvector>(v,s);
01236 }
01237 
01238 inline scvector operator/(const scvector_slice& v, const complex& s) {
01239   return sp_vs_div<scvector_slice,complex,scvector>(v,s);
01240 }
01241 
01242 inline scvector operator/(const srvector_slice& v, const complex& s) {
01243   return sp_vs_div<srvector_slice,complex,scvector>(v,s);
01244 }
01245 
01246 inline scvector operator*(const real& s, const scvector_slice& v) {
01247   return sp_sv_mult<real,scvector_slice,scvector>(s,v);
01248 }
01249 
01250 inline scvector operator*(const complex& s, const scvector_slice& v) {
01251   return sp_sv_mult<complex,scvector_slice,scvector>(s,v);
01252 }
01253 
01254 inline scvector operator*(const complex& s, const srvector_slice& v) {
01255   return sp_sv_mult<complex,srvector_slice,scvector>(s,v);
01256 }
01257 
01258 inline cvector operator+(const cvector& v1, const srvector_slice& v2) {
01259   return fsl_vv_add<cvector,srvector_slice,cvector>(v1,v2);
01260 }
01261 
01262 inline cvector operator+(const rvector& v1, const scvector_slice& v2) {
01263   return fsl_vv_add<rvector,scvector_slice,cvector>(v1,v2);
01264 }
01265 
01266 inline cvector operator+(const cvector& v1, const scvector_slice& v2) {
01267   return fsl_vv_add<cvector,scvector_slice,cvector>(v1,v2);
01268 }
01269 
01270 inline cvector operator+(const scvector_slice& v1, const rvector& v2) {
01271   return slf_vv_add<scvector_slice,rvector,cvector>(v1,v2);
01272 }
01273 
01274 inline cvector operator+(const srvector_slice& v1, const cvector& v2) {
01275   return slf_vv_add<srvector_slice,cvector,cvector>(v1,v2);
01276 }
01277 
01278 inline cvector operator+(const scvector_slice& v1, const cvector& v2) {
01279   return slf_vv_add<scvector_slice,cvector,cvector>(v1,v2);
01280 }
01281 
01282 inline cvector operator+(const cvector_slice& v1, const srvector_slice& v2) {
01283   return fsl_vv_add<cvector_slice,srvector_slice,cvector>(v1,v2);
01284 }
01285 
01286 inline cvector operator+(const rvector_slice& v1, const scvector_slice& v2) {
01287   return fsl_vv_add<rvector_slice,scvector_slice,cvector>(v1,v2);
01288 }
01289 
01290 inline cvector operator+(const cvector_slice& v1, const scvector_slice& v2) {
01291   return fsl_vv_add<cvector_slice,scvector_slice,cvector>(v1,v2);
01292 }
01293 
01294 inline cvector operator+(const scvector_slice& v1, const rvector_slice& v2) {
01295   return slf_vv_add<scvector_slice,rvector_slice,cvector>(v1,v2);
01296 }
01297 
01298 inline cvector operator+(const srvector_slice& v1, const cvector_slice& v2) {
01299   return slf_vv_add<srvector_slice,cvector_slice,cvector>(v1,v2);
01300 }
01301 
01302 inline cvector operator+(const scvector_slice& v1, const cvector_slice& v2) {
01303   return slf_vv_add<scvector_slice,cvector_slice,cvector>(v1,v2);
01304 }
01305 
01306 inline scvector operator+(const scvector_slice& v1, const srvector_slice& v2) {
01307   return slsl_vv_add<scvector_slice,srvector_slice,scvector,complex>(v1,v2);
01308 }
01309 
01310 inline scvector operator+(const srvector_slice& v1, const scvector_slice& v2) {
01311   return slsl_vv_add<srvector_slice,scvector_slice,scvector,complex>(v1,v2);
01312 }
01313 
01314 inline scvector operator+(const scvector_slice& v1, const scvector_slice& v2) {
01315   return slsl_vv_add<scvector_slice,scvector_slice,scvector,complex>(v1,v2);
01316 }
01317 
01318 inline scvector operator+(const scvector& v1, const srvector_slice& v2) {
01319   return spsl_vv_add<scvector,srvector_slice,scvector,complex>(v1,v2);
01320 }
01321 
01322 inline scvector operator+(const srvector& v1, const scvector_slice& v2) {
01323   return spsl_vv_add<srvector,scvector_slice,scvector,complex>(v1,v2);
01324 }
01325 
01326 inline scvector operator+(const scvector& v1, const scvector_slice& v2) {
01327   return spsl_vv_add<scvector,scvector_slice,scvector,complex>(v1,v2);
01328 }
01329 
01330 inline scvector operator+(const scvector_slice& v1, const srvector& v2) {
01331   return slsp_vv_add<scvector_slice,srvector,scvector,complex>(v1,v2);
01332 }
01333 
01334 inline scvector operator+(const srvector_slice& v1, const scvector& v2) {
01335   return slsp_vv_add<srvector_slice,scvector,scvector,complex>(v1,v2);
01336 }
01337 
01338 inline scvector operator+(const scvector_slice& v1, const scvector& v2) {
01339   return slsp_vv_add<scvector_slice,scvector,scvector,complex>(v1,v2);
01340 }
01341 
01342 inline cvector operator-(const cvector& v1, const srvector_slice& v2) {
01343   return fsl_vv_sub<cvector,srvector_slice,cvector>(v1,v2);
01344 }
01345 
01346 inline cvector operator-(const rvector& v1, const scvector_slice& v2) {
01347   return fsl_vv_sub<rvector,scvector_slice,cvector>(v1,v2);
01348 }
01349 
01350 inline cvector operator-(const cvector& v1, const scvector_slice& v2) {
01351   return fsl_vv_sub<cvector,scvector_slice,cvector>(v1,v2);
01352 }
01353 
01354 inline cvector operator-(const scvector_slice& v1, const rvector& v2) {
01355   return slf_vv_sub<scvector_slice,rvector,cvector>(v1,v2);
01356 }
01357 
01358 inline cvector operator-(const srvector_slice& v1, const cvector& v2) {
01359   return slf_vv_sub<srvector_slice,cvector,cvector>(v1,v2);
01360 }
01361 
01362 inline cvector operator-(const scvector_slice& v1, const cvector& v2) {
01363   return slf_vv_sub<scvector_slice,cvector,cvector>(v1,v2);
01364 }
01365 
01366 inline cvector operator-(const cvector_slice& v1, const srvector_slice& v2) {
01367   return fsl_vv_sub<cvector_slice,srvector_slice,cvector>(v1,v2);
01368 }
01369 
01370 inline cvector operator-(const rvector_slice& v1, const scvector_slice& v2) {
01371   return fsl_vv_sub<rvector_slice,scvector_slice,cvector>(v1,v2);
01372 }
01373 
01374 inline cvector operator-(const cvector_slice& v1, const scvector_slice& v2) {
01375   return fsl_vv_sub<cvector_slice,scvector_slice,cvector>(v1,v2);
01376 }
01377 
01378 inline cvector operator-(const scvector_slice& v1, const rvector_slice& v2) {
01379   return slf_vv_sub<scvector_slice,rvector_slice,cvector>(v1,v2);
01380 }
01381 
01382 inline cvector operator-(const srvector_slice& v1, const cvector_slice& v2) {
01383   return slf_vv_sub<srvector_slice,cvector_slice,cvector>(v1,v2);
01384 }
01385 
01386 inline cvector operator-(const scvector_slice& v1, const cvector_slice& v2) {
01387   return slf_vv_sub<scvector_slice,cvector_slice,cvector>(v1,v2);
01388 }
01389 
01390 inline scvector operator-(const scvector_slice& v1, const srvector_slice& v2) {
01391   return slsl_vv_sub<scvector_slice,srvector_slice,scvector,complex>(v1,v2);
01392 }
01393 
01394 inline scvector operator-(const srvector_slice& v1, const scvector_slice& v2) {
01395   return slsl_vv_sub<srvector_slice,scvector_slice,scvector,complex>(v1,v2);
01396 }
01397 
01398 inline scvector operator-(const scvector_slice& v1, const scvector_slice& v2) {
01399   return slsl_vv_sub<scvector_slice,scvector_slice,scvector,complex>(v1,v2);
01400 }
01401 
01402 inline scvector operator-(const scvector& v1, const srvector_slice& v2) {
01403   return spsl_vv_sub<scvector,srvector_slice,scvector,complex>(v1,v2);
01404 }
01405 
01406 inline scvector operator-(const srvector& v1, const scvector_slice& v2) {
01407   return spsl_vv_sub<srvector,scvector_slice,scvector,complex>(v1,v2);
01408 }
01409 
01410 inline scvector operator-(const scvector& v1, const scvector_slice& v2) {
01411   return spsl_vv_sub<scvector,scvector_slice,scvector,complex>(v1,v2);
01412 }
01413 
01414 inline scvector operator-(const scvector_slice& v1, const srvector& v2) {
01415   return slsp_vv_sub<scvector_slice,srvector,scvector,complex>(v1,v2);
01416 }
01417 
01418 inline scvector operator-(const srvector_slice& v1, const scvector& v2) {
01419   return slsp_vv_sub<srvector_slice,scvector,scvector,complex>(v1,v2);
01420 }
01421 
01422 inline scvector operator-(const scvector_slice& v1, const scvector& v2) {
01423   return slsp_vv_sub<scvector_slice,scvector,scvector,complex>(v1,v2);
01424 }
01425 
01426 inline cvector& cvector::operator+=(const srvector_slice& v2) {
01427   return fsl_vv_addassign(*this,v2);
01428 }
01429 
01430 inline cvector& cvector::operator+=(const scvector_slice& v2) {
01431   return fsl_vv_addassign(*this,v2);
01432 }
01433 
01434 inline cvector_slice& cvector_slice::operator+=(const srvector_slice& v2) {
01435   return fsl_vv_addassign(*this,v2);
01436 }
01437 
01438 inline cvector_slice& cvector_slice::operator+=(const scvector_slice& v2) {
01439   return fsl_vv_addassign(*this,v2);
01440 }
01441 
01442 inline scvector& scvector::operator+=(const srvector_slice& v2) {
01443   return spsl_vv_addassign(*this,v2);
01444 }
01445 
01446 inline scvector& scvector::operator+=(const scvector_slice& v2) {
01447   return spsl_vv_addassign(*this,v2);
01448 }
01449 
01450 inline cvector& cvector::operator-=(const srvector_slice& v2) {
01451   return fsl_vv_subassign(*this,v2);
01452 }
01453 
01454 inline cvector& cvector::operator-=(const scvector_slice& v2) {
01455   return fsl_vv_subassign(*this,v2);
01456 }
01457 
01458 inline cvector_slice& cvector_slice::operator-=(const srvector_slice& v2) {
01459   return fsl_vv_subassign(*this,v2);
01460 }
01461 
01462 inline cvector_slice& cvector_slice::operator-=(const scvector_slice& v2) {
01463   return fsl_vv_subassign(*this,v2);
01464 }
01465 
01466 inline scvector& scvector::operator-=(const srvector_slice& v2) {
01467   return spsl_vv_subassign(*this,v2);
01468 }
01469 
01470 inline scvector& scvector::operator-=(const scvector_slice& v2) {
01471   return spsl_vv_subassign(*this,v2);
01472 }
01473 
01474 inline bool operator==(const scvector_slice& v1, const srvector_slice& v2) {
01475   return slsl_vv_comp(v1,v2);
01476 }
01477 
01478 inline bool operator==(const srvector_slice& v1, const scvector_slice& v2) {
01479   return slsl_vv_comp(v1,v2);
01480 }
01481 
01482 inline bool operator==(const scvector_slice& v1, const scvector_slice& v2) {
01483   return slsl_vv_comp(v1,v2);
01484 }
01485 
01486 inline bool operator==(const scvector_slice& v1, const srvector& v2) {
01487   return slsp_vv_comp(v1,v2);
01488 }
01489 
01490 inline bool operator==(const srvector_slice& v1, const scvector& v2) {
01491   return slsp_vv_comp(v1,v2);
01492 }
01493 
01494 inline bool operator==(const scvector_slice& v1, const scvector& v2) {
01495   return slsp_vv_comp(v1,v2);
01496 }
01497 
01498 inline bool operator==(const scvector& v1, const srvector_slice& v2) {
01499   return spsl_vv_comp(v1,v2);
01500 }
01501 
01502 inline bool operator==(const srvector& v1, const scvector_slice& v2) {
01503   return spsl_vv_comp(v1,v2);
01504 }
01505 
01506 inline bool operator==(const scvector& v1, const scvector_slice& v2) {
01507   return spsl_vv_comp(v1,v2);
01508 }
01509 
01510 inline bool operator==(const scvector_slice& v1, const rvector& v2) {
01511   return slf_vv_comp(v1,v2);
01512 }
01513 
01514 inline bool operator==(const srvector_slice& v1, const cvector& v2) {
01515   return slf_vv_comp(v1,v2);
01516 }
01517 
01518 inline bool operator==(const scvector_slice& v1, const cvector& v2) {
01519   return slf_vv_comp(v1,v2);
01520 }
01521 
01522 inline bool operator==(const cvector& v1, const srvector_slice& v2) {
01523   return fsl_vv_comp(v1,v2);
01524 }
01525 
01526 inline bool operator==(const rvector& v1, const scvector_slice& v2) {
01527   return fsl_vv_comp(v1,v2);
01528 }
01529 
01530 inline bool operator==(const cvector& v1, const scvector_slice& v2) {
01531   return fsl_vv_comp(v1,v2);
01532 }
01533 
01534 inline bool operator==(const scvector_slice& v1, const rvector_slice& v2) {
01535   return slf_vv_comp(v1,v2);
01536 }
01537 
01538 inline bool operator==(const srvector_slice& v1, const cvector_slice& v2) {
01539   return slf_vv_comp(v1,v2);
01540 }
01541 
01542 inline bool operator==(const scvector_slice& v1, const cvector_slice& v2) {
01543   return slf_vv_comp(v1,v2);
01544 }
01545 
01546 inline bool operator==(const cvector_slice& v1, const srvector_slice& v2) {
01547   return fsl_vv_comp(v1,v2);
01548 }
01549 
01550 inline bool operator==(const rvector_slice& v1, const scvector_slice& v2) {
01551   return fsl_vv_comp(v1,v2);
01552 }
01553 
01554 inline bool operator==(const cvector_slice& v1, const scvector_slice& v2) {
01555   return fsl_vv_comp(v1,v2);
01556 }
01557 
01558 inline bool operator!=(const scvector_slice& v1, const srvector_slice& v2) {
01559   return !slsl_vv_comp(v1,v2);
01560 }
01561 
01562 inline bool operator!=(const srvector_slice& v1, const scvector_slice& v2) {
01563   return !slsl_vv_comp(v1,v2);
01564 }
01565 
01566 inline bool operator!=(const scvector_slice& v1, const scvector_slice& v2) {
01567   return !slsl_vv_comp(v1,v2);
01568 }
01569 
01570 inline bool operator!=(const scvector_slice& v1, const rvector& v2) {
01571   return !slf_vv_comp(v1,v2);
01572 }
01573 
01574 inline bool operator!=(const srvector_slice& v1, const cvector& v2) {
01575   return !slf_vv_comp(v1,v2);
01576 }
01577 
01578 inline bool operator!=(const scvector_slice& v1, const cvector& v2) {
01579   return !slf_vv_comp(v1,v2);
01580 }
01581 
01582 inline bool operator!=(const cvector& v1, const srvector_slice& v2) {
01583   return !fsl_vv_comp(v1,v2);
01584 }
01585 
01586 inline bool operator!=(const rvector& v1, const scvector_slice& v2) {
01587   return !fsl_vv_comp(v1,v2);
01588 }
01589 
01590 inline bool operator!=(const cvector& v1, const scvector_slice& v2) {
01591   return !fsl_vv_comp(v1,v2);
01592 }
01593 
01594 inline bool operator!=(const scvector_slice& v1, const srvector& v2) {
01595   return !slsp_vv_comp(v1,v2);
01596 }
01597 
01598 inline bool operator!=(const srvector_slice& v1, const scvector& v2) {
01599   return !slsp_vv_comp(v1,v2);
01600 }
01601 
01602 inline bool operator!=(const scvector_slice& v1, const scvector& v2) {
01603   return !slsp_vv_comp(v1,v2);
01604 }
01605 
01606 inline bool operator!=(const scvector& v1, const srvector_slice& v2) {
01607   return !spsl_vv_comp(v1,v2);
01608 }
01609 
01610 inline bool operator!=(const srvector& v1, const scvector_slice& v2) {
01611   return !spsl_vv_comp(v1,v2);
01612 }
01613 
01614 inline bool operator!=(const scvector& v1, const scvector_slice& v2) {
01615   return !spsl_vv_comp(v1,v2);
01616 }
01617 
01618 inline bool operator!=(const scvector_slice& v1, const rvector_slice& v2) {
01619   return !slf_vv_comp(v1,v2);
01620 }
01621 
01622 inline bool operator!=(const srvector_slice& v1, const cvector_slice& v2) {
01623   return !slf_vv_comp(v1,v2);
01624 }
01625 
01626 inline bool operator!=(const scvector_slice& v1, const cvector_slice& v2) {
01627   return !slf_vv_comp(v1,v2);
01628 }
01629 
01630 inline bool operator!=(const cvector_slice& v1, const srvector_slice& v2) {
01631   return !fsl_vv_comp(v1,v2);
01632 }
01633 
01634 inline bool operator!=(const rvector_slice& v1, const scvector_slice& v2) {
01635   return !fsl_vv_comp(v1,v2);
01636 }
01637 
01638 inline bool operator!=(const cvector_slice& v1, const scvector_slice& v2) {
01639   return !fsl_vv_comp(v1,v2);
01640 }
01641 
01642 inline std::ostream& operator<<(std::ostream& os, const scvector_slice& v) {
01643   return sl_v_output<scvector_slice,complex>(os,v);
01644 }
01645 
01646 inline std::istream& operator>>(std::istream& is, scvector_slice& v) {
01647   return sl_v_input<scvector_slice,complex>(is,v);
01648 }
01649 
01650 inline void accumulate(cdotprecision& dot, const scvector& x, const scvector& y) {
01651   spsp_vv_accu<cdotprecision,scvector,scvector,sparse_cdot>(dot,x,y);
01652 }
01653 
01654 inline void accumulate(cdotprecision& dot, const scvector& x, const srvector& y) {
01655   spsp_vv_accu<cdotprecision,scvector,srvector,sparse_cdot>(dot,x,y);
01656 }
01657 
01658 inline void accumulate(cdotprecision& dot, const srvector& x, const scvector& y) {
01659   spsp_vv_accu<cdotprecision,srvector,scvector,sparse_cdot>(dot,x,y);
01660 }
01661 
01662 inline void accumulate(cdotprecision& dot, const scvector& x, const cvector& y) {
01663   spf_vv_accu<cdotprecision,scvector,cvector,sparse_cdot>(dot,x,y);
01664 }
01665 
01666 inline void accumulate(cdotprecision& dot, const scvector& x, const rvector& y) {
01667   spf_vv_accu<cdotprecision,scvector,rvector,sparse_cdot>(dot,x,y);
01668 }
01669 
01670 inline void accumulate(cdotprecision& dot, const srvector& x, const cvector& y) {
01671   spf_vv_accu<cdotprecision,srvector,cvector,sparse_cdot>(dot,x,y);
01672 }
01673 
01674 inline void accumulate(cdotprecision& dot, const scvector& x, const cvector_slice& y) {
01675   spf_vv_accu<cdotprecision,scvector,cvector_slice,sparse_cdot>(dot,x,y);
01676 }
01677 
01678 inline void accumulate(cdotprecision& dot, const scvector& x, const rvector_slice& y) {
01679   spf_vv_accu<cdotprecision,scvector,rvector_slice,sparse_cdot>(dot,x,y);
01680 }
01681 
01682 inline void accumulate(cdotprecision& dot, const srvector& x, const cvector_slice& y) {
01683   spf_vv_accu<cdotprecision,srvector,cvector_slice,sparse_cdot>(dot,x,y);
01684 }
01685 
01686 inline void accumulate(cdotprecision& dot, const cvector& x, const scvector& y) {
01687   fsp_vv_accu<cdotprecision,cvector,scvector,sparse_cdot>(dot,x,y);
01688 }
01689 
01690 inline void accumulate(cdotprecision& dot, const cvector& x, const srvector& y) {
01691   fsp_vv_accu<cdotprecision,cvector,srvector,sparse_cdot>(dot,x,y);
01692 }
01693 
01694 inline void accumulate(cdotprecision& dot, const rvector& x, const scvector& y) {
01695   fsp_vv_accu<cdotprecision,rvector,scvector,sparse_cdot>(dot,x,y);
01696 }
01697 
01698 inline void accumulate(cdotprecision& dot, const cvector_slice& x, const scvector& y) {
01699   fsp_vv_accu<cdotprecision,cvector_slice,scvector,sparse_cdot>(dot,x,y);
01700 }
01701 
01702 inline void accumulate(cdotprecision& dot, const cvector_slice& x, const srvector& y) {
01703   fsp_vv_accu<cdotprecision,cvector_slice,srvector,sparse_cdot>(dot,x,y);
01704 }
01705 
01706 inline void accumulate(cdotprecision& dot, const rvector_slice& x, const scvector& y) {
01707   fsp_vv_accu<cdotprecision,rvector_slice,scvector,sparse_cdot>(dot,x,y);
01708 }
01709 
01710 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const cvector& y) {
01711   slf_vv_accu<cdotprecision,scvector_slice,cvector,sparse_cdot>(dot,x,y);
01712 }
01713 
01714 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const rvector& y) {
01715   slf_vv_accu<cdotprecision,scvector_slice,rvector,sparse_cdot>(dot,x,y);
01716 }
01717 
01718 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const cvector& y) {
01719   slf_vv_accu<cdotprecision,srvector_slice,cvector,sparse_cdot>(dot,x,y);
01720 }
01721 
01722 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const cvector_slice& y) {
01723   slf_vv_accu<cdotprecision,scvector_slice,cvector_slice,sparse_cdot>(dot,x,y);
01724 }
01725 
01726 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const rvector_slice& y) {
01727   slf_vv_accu<cdotprecision,scvector_slice,rvector_slice,sparse_cdot>(dot,x,y);
01728 }
01729 
01730 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const cvector_slice& y) {
01731   slf_vv_accu<cdotprecision,srvector_slice,cvector_slice,sparse_cdot>(dot,x,y);
01732 }
01733 
01734 inline void accumulate(cdotprecision& dot, const cvector& x, const scvector_slice& y) {
01735   fsl_vv_accu<cdotprecision,cvector,scvector_slice,sparse_cdot>(dot,x,y);
01736 }
01737 
01738 inline void accumulate(cdotprecision& dot, const cvector& x, const srvector_slice& y) {
01739   fsl_vv_accu<cdotprecision,cvector,srvector_slice,sparse_cdot>(dot,x,y);
01740 }
01741 
01742 inline void accumulate(cdotprecision& dot, const rvector& x, const scvector_slice& y) {
01743   fsl_vv_accu<cdotprecision,rvector,scvector_slice,sparse_cdot>(dot,x,y);
01744 }
01745 
01746 inline void accumulate(cdotprecision& dot, const cvector_slice& x, const scvector_slice& y) {
01747   fsl_vv_accu<cdotprecision,cvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01748 }
01749 
01750 inline void accumulate(cdotprecision& dot, const cvector_slice& x, const srvector_slice& y) {
01751   fsl_vv_accu<cdotprecision,cvector_slice,srvector_slice,sparse_cdot>(dot,x,y);
01752 }
01753 
01754 inline void accumulate(cdotprecision& dot, const rvector_slice& x, const scvector_slice& y) {
01755   fsl_vv_accu<cdotprecision,rvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01756 }
01757 
01758 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const scvector_slice& y) {
01759   slsl_vv_accu<cdotprecision,scvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01760 }
01761 
01762 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const srvector_slice& y) {
01763   slsl_vv_accu<cdotprecision,scvector_slice,srvector_slice,sparse_cdot>(dot,x,y);
01764 }
01765 
01766 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const scvector_slice& y) {
01767   slsl_vv_accu<cdotprecision,srvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01768 }
01769 
01770 inline void accumulate(cdotprecision& dot, const scvector& x, const scvector_slice& y) {
01771   spsl_vv_accu<cdotprecision,scvector,scvector_slice,sparse_cdot>(dot,x,y);
01772 }
01773 
01774 inline void accumulate(cdotprecision& dot, const scvector& x, const srvector_slice& y) {
01775   spsl_vv_accu<cdotprecision,scvector,srvector_slice,sparse_cdot>(dot,x,y);
01776 }
01777 
01778 inline void accumulate(cdotprecision& dot, const srvector& x, const scvector_slice& y) {
01779   spsl_vv_accu<cdotprecision,srvector,scvector_slice,sparse_cdot>(dot,x,y);
01780 }
01781 
01782 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const scvector& y) {
01783   slsp_vv_accu<cdotprecision,scvector_slice,scvector,sparse_cdot>(dot,x,y);
01784 }
01785 
01786 inline void accumulate(cdotprecision& dot, const scvector_slice& x, const srvector& y) {
01787   slsp_vv_accu<cdotprecision,scvector_slice,srvector,sparse_cdot>(dot,x,y);
01788 }
01789 
01790 inline void accumulate(cdotprecision& dot, const srvector_slice& x, const scvector& y) {
01791   slsp_vv_accu<cdotprecision,srvector_slice,scvector,sparse_cdot>(dot,x,y);
01792 }
01793 
01794 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const scvector& y) {
01795   spsp_vv_accuapprox<cdotprecision,scvector,scvector,sparse_cdot>(dot,x,y);
01796 }
01797 
01798 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const srvector& y) {
01799   spsp_vv_accuapprox<cdotprecision,scvector,srvector,sparse_cdot>(dot,x,y);
01800 }
01801 
01802 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const scvector& y) {
01803   spsp_vv_accuapprox<cdotprecision,srvector,scvector,sparse_cdot>(dot,x,y);
01804 }
01805 
01806 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const cvector& y) {
01807   spf_vv_accuapprox<cdotprecision,scvector,cvector,sparse_cdot>(dot,x,y);
01808 }
01809 
01810 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const rvector& y) {
01811   spf_vv_accuapprox<cdotprecision,scvector,rvector,sparse_cdot>(dot,x,y);
01812 }
01813 
01814 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const cvector& y) {
01815   spf_vv_accuapprox<cdotprecision,srvector,cvector,sparse_cdot>(dot,x,y);
01816 }
01817 
01818 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const cvector_slice& y) {
01819   spf_vv_accuapprox<cdotprecision,scvector,cvector_slice,sparse_cdot>(dot,x,y);
01820 }
01821 
01822 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const rvector_slice& y) {
01823   spf_vv_accuapprox<cdotprecision,scvector,rvector_slice,sparse_cdot>(dot,x,y);
01824 }
01825 
01826 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const cvector_slice& y) {
01827   spf_vv_accuapprox<cdotprecision,srvector,cvector_slice,sparse_cdot>(dot,x,y);
01828 }
01829 
01830 inline void accumulate_approx(cdotprecision& dot, const cvector& x, const scvector& y) {
01831   fsp_vv_accuapprox<cdotprecision,cvector,scvector,sparse_cdot>(dot,x,y);
01832 }
01833 
01834 inline void accumulate_approx(cdotprecision& dot, const cvector& x, const srvector& y) {
01835   fsp_vv_accuapprox<cdotprecision,cvector,srvector,sparse_cdot>(dot,x,y);
01836 }
01837 
01838 inline void accumulate_approx(cdotprecision& dot, const rvector& x, const scvector& y) {
01839   fsp_vv_accuapprox<cdotprecision,rvector,scvector,sparse_cdot>(dot,x,y);
01840 }
01841 
01842 inline void accumulate_approx(cdotprecision& dot, const cvector_slice& x, const scvector& y) {
01843   fsp_vv_accuapprox<cdotprecision,cvector_slice,scvector,sparse_cdot>(dot,x,y);
01844 }
01845 
01846 inline void accumulate_approx(cdotprecision& dot, const cvector_slice& x, const srvector& y) {
01847   fsp_vv_accuapprox<cdotprecision,cvector_slice,srvector,sparse_cdot>(dot,x,y);
01848 }
01849 
01850 inline void accumulate_approx(cdotprecision& dot, const rvector_slice& x, const scvector& y) {
01851   fsp_vv_accuapprox<cdotprecision,rvector_slice,scvector,sparse_cdot>(dot,x,y);
01852 }
01853 
01854 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const cvector& y) {
01855   slf_vv_accuapprox<cdotprecision,scvector_slice,cvector,sparse_cdot>(dot,x,y);
01856 }
01857 
01858 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const rvector& y) {
01859   slf_vv_accuapprox<cdotprecision,scvector_slice,rvector,sparse_cdot>(dot,x,y);
01860 }
01861 
01862 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const cvector& y) {
01863   slf_vv_accuapprox<cdotprecision,srvector_slice,cvector,sparse_cdot>(dot,x,y);
01864 }
01865 
01866 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const cvector_slice& y) {
01867   slf_vv_accuapprox<cdotprecision,scvector_slice,cvector_slice,sparse_cdot>(dot,x,y);
01868 }
01869 
01870 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const rvector_slice& y) {
01871   slf_vv_accuapprox<cdotprecision,scvector_slice,rvector_slice,sparse_cdot>(dot,x,y);
01872 }
01873 
01874 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const cvector_slice& y) {
01875   slf_vv_accuapprox<cdotprecision,srvector_slice,cvector_slice,sparse_cdot>(dot,x,y);
01876 }
01877 
01878 inline void accumulate_approx(cdotprecision& dot, const cvector& x, const scvector_slice& y) {
01879   fsl_vv_accuapprox<cdotprecision,cvector,scvector_slice,sparse_cdot>(dot,x,y);
01880 }
01881 
01882 inline void accumulate_approx(cdotprecision& dot, const cvector& x, const srvector_slice& y) {
01883   fsl_vv_accuapprox<cdotprecision,cvector,srvector_slice,sparse_cdot>(dot,x,y);
01884 }
01885 
01886 inline void accumulate_approx(cdotprecision& dot, const rvector& x, const scvector_slice& y) {
01887   fsl_vv_accuapprox<cdotprecision,rvector,scvector_slice,sparse_cdot>(dot,x,y);
01888 }
01889 
01890 inline void accumulate_approx(cdotprecision& dot, const cvector_slice& x, const scvector_slice& y) {
01891   fsl_vv_accuapprox<cdotprecision,cvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01892 }
01893 
01894 inline void accumulate_approx(cdotprecision& dot, const cvector_slice& x, const srvector_slice& y) {
01895   fsl_vv_accuapprox<cdotprecision,cvector_slice,srvector_slice,sparse_cdot>(dot,x,y);
01896 }
01897 
01898 inline void accumulate_approx(cdotprecision& dot, const rvector_slice& x, const scvector_slice& y) {
01899   fsl_vv_accuapprox<cdotprecision,rvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01900 }
01901 
01902 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const scvector_slice& y) {
01903   slsl_vv_accuapprox<cdotprecision,scvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01904 }
01905 
01906 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const srvector_slice& y) {
01907   slsl_vv_accuapprox<cdotprecision,scvector_slice,srvector_slice,sparse_cdot>(dot,x,y);
01908 }
01909 
01910 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const scvector_slice& y) {
01911   slsl_vv_accuapprox<cdotprecision,srvector_slice,scvector_slice,sparse_cdot>(dot,x,y);
01912 }
01913 
01914 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const scvector_slice& y) {
01915   spsl_vv_accuapprox<cdotprecision,scvector,scvector_slice,sparse_cdot>(dot,x,y);
01916 }
01917 
01918 inline void accumulate_approx(cdotprecision& dot, const scvector& x, const srvector_slice& y) {
01919   spsl_vv_accuapprox<cdotprecision,scvector,srvector_slice,sparse_cdot>(dot,x,y);
01920 }
01921 
01922 inline void accumulate_approx(cdotprecision& dot, const srvector& x, const scvector_slice& y) {
01923   spsl_vv_accuapprox<cdotprecision,srvector,scvector_slice,sparse_cdot>(dot,x,y);
01924 }
01925 
01926 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const scvector& y) {
01927   slsp_vv_accuapprox<cdotprecision,scvector_slice,scvector,sparse_cdot>(dot,x,y);
01928 }
01929 
01930 inline void accumulate_approx(cdotprecision& dot, const scvector_slice& x, const srvector& y) {
01931   slsp_vv_accuapprox<cdotprecision,scvector_slice,srvector,sparse_cdot>(dot,x,y);
01932 }
01933 
01934 inline void accumulate_approx(cdotprecision& dot, const srvector_slice& x, const scvector& y) {
01935   slsp_vv_accuapprox<cdotprecision,srvector_slice,scvector,sparse_cdot>(dot,x,y);
01936 }
01937 
01938 inline void accumulate(cidotprecision& dot, const scvector& x, const scvector& y) {
01939   cdotprecision tmp(0.0);
01940   tmp.set_k(dot.get_k());
01941   accumulate(tmp,x,y);
01942   dot += tmp;
01943 }
01944 
01945 inline void accumulate(cidotprecision& dot, const scvector& x, const srvector& y) {
01946   cdotprecision tmp(0.0);
01947   tmp.set_k(dot.get_k());
01948   accumulate(tmp,x,y);
01949   dot += tmp;
01950 }
01951 
01952 inline void accumulate(cidotprecision& dot, const srvector& x, const scvector& y) {
01953   cdotprecision tmp(0.0);
01954   tmp.set_k(dot.get_k());
01955   accumulate(tmp,x,y);
01956   dot += tmp;
01957 }
01958 
01959 inline void accumulate(cidotprecision& dot, const scvector& x, const cvector& y) {
01960   cdotprecision tmp(0.0);
01961   tmp.set_k(dot.get_k());
01962   accumulate(tmp,x,y);
01963   dot += tmp;
01964 }
01965 
01966 inline void accumulate(cidotprecision& dot, const scvector& x, const rvector& y) {
01967   cdotprecision tmp(0.0);
01968   tmp.set_k(dot.get_k());
01969   accumulate(tmp,x,y);
01970   dot += tmp;
01971 }
01972 
01973 inline void accumulate(cidotprecision& dot, const srvector& x, const cvector& y) {
01974   cdotprecision tmp(0.0);
01975   tmp.set_k(dot.get_k());
01976   accumulate(tmp,x,y);
01977   dot += tmp;
01978 }
01979 
01980 inline void accumulate(cidotprecision& dot, const scvector& x, const cvector_slice& y) {
01981   cdotprecision tmp(0.0);
01982   tmp.set_k(dot.get_k());
01983   accumulate(tmp,x,y);
01984   dot += tmp;
01985 }
01986 
01987 inline void accumulate(cidotprecision& dot, const scvector& x, const rvector_slice& y) {
01988   cdotprecision tmp(0.0);
01989   tmp.set_k(dot.get_k());
01990   accumulate(tmp,x,y);
01991   dot += tmp;
01992 }
01993 
01994 inline void accumulate(cidotprecision& dot, const srvector& x, const cvector_slice& y) {
01995   cdotprecision tmp(0.0);
01996   tmp.set_k(dot.get_k());
01997   accumulate(tmp,x,y);
01998   dot += tmp;
01999 }
02000 
02001 inline void accumulate(cidotprecision& dot, const cvector& x, const scvector& y) {
02002   cdotprecision tmp(0.0);
02003   tmp.set_k(dot.get_k());
02004   accumulate(tmp,x,y);
02005   dot += tmp;
02006 }
02007 
02008 inline void accumulate(cidotprecision& dot, const cvector& x, const srvector& y) {
02009   cdotprecision tmp(0.0);
02010   tmp.set_k(dot.get_k());
02011   accumulate(tmp,x,y);
02012   dot += tmp;
02013 }
02014 
02015 inline void accumulate(cidotprecision& dot, const rvector& x, const scvector& y) {
02016   cdotprecision tmp(0.0);
02017   tmp.set_k(dot.get_k());
02018   accumulate(tmp,x,y);
02019   dot += tmp;
02020 }
02021 
02022 inline void accumulate(cidotprecision& dot, const cvector_slice& x, const scvector& y) {
02023   cdotprecision tmp(0.0);
02024   tmp.set_k(dot.get_k());
02025   accumulate(tmp,x,y);
02026   dot += tmp;
02027 }
02028 
02029 inline void accumulate(cidotprecision& dot, const cvector_slice& x, const srvector& y) {
02030   cdotprecision tmp(0.0);
02031   tmp.set_k(dot.get_k());
02032   accumulate(tmp,x,y);
02033   dot += tmp;
02034 }
02035 
02036 inline void accumulate(cidotprecision& dot, const rvector_slice& x, const scvector& y) {
02037   cdotprecision tmp(0.0);
02038   tmp.set_k(dot.get_k());
02039   accumulate(tmp,x,y);
02040   dot += tmp;
02041 }
02042 
02043 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const cvector& y) {
02044   cdotprecision tmp(0.0);
02045   tmp.set_k(dot.get_k());
02046   accumulate(tmp,x,y);
02047   dot += tmp;
02048 }
02049 
02050 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const rvector& y) {
02051   cdotprecision tmp(0.0);
02052   tmp.set_k(dot.get_k());
02053   accumulate(tmp,x,y);
02054   dot += tmp;
02055 }
02056 
02057 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const cvector& y) {
02058   cdotprecision tmp(0.0);
02059   tmp.set_k(dot.get_k());
02060   accumulate(tmp,x,y);
02061   dot += tmp;
02062 }
02063 
02064 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const cvector_slice& y) {
02065   cdotprecision tmp(0.0);
02066   tmp.set_k(dot.get_k());
02067   accumulate(tmp,x,y);
02068   dot += tmp;
02069 }
02070 
02071 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const rvector_slice& y) {
02072   cdotprecision tmp(0.0);
02073   tmp.set_k(dot.get_k());
02074   accumulate(tmp,x,y);
02075   dot += tmp;
02076 }
02077 
02078 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const cvector_slice& y) {
02079   cdotprecision tmp(0.0);
02080   tmp.set_k(dot.get_k());
02081   accumulate(tmp,x,y);
02082   dot += tmp;
02083 }
02084 
02085 inline void accumulate(cidotprecision& dot, const cvector& x, const scvector_slice& y) {
02086   cdotprecision tmp(0.0);
02087   tmp.set_k(dot.get_k());
02088   accumulate(tmp,x,y);
02089   dot += tmp;
02090 }
02091 
02092 inline void accumulate(cidotprecision& dot, const cvector& x, const srvector_slice& y) {
02093   cdotprecision tmp(0.0);
02094   tmp.set_k(dot.get_k());
02095   accumulate(tmp,x,y);
02096   dot += tmp;
02097 }
02098 
02099 inline void accumulate(cidotprecision& dot, const rvector& x, const scvector_slice& y) {
02100   cdotprecision tmp(0.0);
02101   tmp.set_k(dot.get_k());
02102   accumulate(tmp,x,y);
02103   dot += tmp;
02104 }
02105 
02106 inline void accumulate(cidotprecision& dot, const cvector_slice& x, const scvector_slice& y) {
02107   cdotprecision tmp(0.0);
02108   tmp.set_k(dot.get_k());
02109   accumulate(tmp,x,y);
02110   dot += tmp;
02111 }
02112 
02113 inline void accumulate(cidotprecision& dot, const cvector_slice& x, const srvector_slice& y) {
02114   cdotprecision tmp(0.0);
02115   tmp.set_k(dot.get_k());
02116   accumulate(tmp,x,y);
02117   dot += tmp;
02118 }
02119 
02120 inline void accumulate(cidotprecision& dot, const rvector_slice& x, const scvector_slice& y) {
02121   cdotprecision tmp(0.0);
02122   tmp.set_k(dot.get_k());
02123   accumulate(tmp,x,y);
02124   dot += tmp;
02125 }
02126 
02127 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const scvector_slice& y) {
02128   cdotprecision tmp(0.0);
02129   tmp.set_k(dot.get_k());
02130   accumulate(tmp,x,y);
02131   dot += tmp;
02132 }
02133 
02134 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const srvector_slice& y) {
02135   cdotprecision tmp(0.0);
02136   tmp.set_k(dot.get_k());
02137   accumulate(tmp,x,y);
02138   dot += tmp;
02139 }
02140 
02141 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const scvector_slice& y) {
02142   cdotprecision tmp(0.0);
02143   tmp.set_k(dot.get_k());
02144   accumulate(tmp,x,y);
02145   dot += tmp;
02146 }
02147 
02148 inline void accumulate(cidotprecision& dot, const scvector& x, const scvector_slice& y) {
02149   cdotprecision tmp(0.0);
02150   tmp.set_k(dot.get_k());
02151   accumulate(tmp,x,y);
02152   dot += tmp;
02153 }
02154 
02155 inline void accumulate(cidotprecision& dot, const scvector& x, const srvector_slice& y) {
02156   cdotprecision tmp(0.0);
02157   tmp.set_k(dot.get_k());
02158   accumulate(tmp,x,y);
02159   dot += tmp;
02160 }
02161 
02162 inline void accumulate(cidotprecision& dot, const srvector& x, const scvector_slice& y) {
02163   cdotprecision tmp(0.0);
02164   tmp.set_k(dot.get_k());
02165   accumulate(tmp,x,y);
02166   dot += tmp;
02167 }
02168 
02169 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const scvector& y) {
02170   cdotprecision tmp(0.0);
02171   tmp.set_k(dot.get_k());
02172   accumulate(tmp,x,y);
02173   dot += tmp;
02174 }
02175 
02176 inline void accumulate(cidotprecision& dot, const scvector_slice& x, const srvector& y) {
02177   cdotprecision tmp(0.0);
02178   tmp.set_k(dot.get_k());
02179   accumulate(tmp,x,y);
02180   dot += tmp;
02181 }
02182 
02183 inline void accumulate(cidotprecision& dot, const srvector_slice& x, const scvector& y) {
02184   cdotprecision tmp(0.0);
02185   tmp.set_k(dot.get_k());
02186   accumulate(tmp,x,y);
02187   dot += tmp;
02188 }
02189 
02190 } //namespace cxsc
02191 
02192 #include "sparsevector.inl"
02193 
02194 #endif

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