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