00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
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
01022
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 }
02191
02192 #include "sparsevector.inl"
02193
02194 #endif