00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00025 #include "matpackIV.h"
00026 #include "exceptions.h"
00027
00030 Tensor3View* Iterator4D::operator->()
00031 {
00032 return &msv;
00033 }
00034
00036 Tensor3View& Iterator4D::operator*()
00037 {
00038 return msv;
00039 }
00040
00043 const ConstTensor3View* ConstIterator4D::operator->() const
00044 {
00045 return &msv;
00046 }
00047
00049 const ConstTensor3View& ConstIterator4D::operator*() const
00050 {
00051 return msv;
00052 }
00053
00054
00055
00056
00057
00058
00060 Index ConstTensor4View::nbooks() const
00061 {
00062 return mbr.mextent;
00063 }
00064
00066 Index ConstTensor4View::npages() const
00067 {
00068 return mpr.mextent;
00069 }
00070
00072 Index ConstTensor4View::nrows() const
00073 {
00074 return mrr.mextent;
00075 }
00076
00078 Index ConstTensor4View::ncols() const
00079 {
00080 return mcr.mextent;
00081 }
00082
00086 ConstTensor4View ConstTensor4View::operator()(const Range& b,
00087 const Range& p,
00088 const Range& r,
00089 const Range& c) const
00090 {
00091 return ConstTensor4View(mdata,
00092 mbr, mpr, mrr, mcr,
00093 b, p, r, c);
00094 }
00095
00098 ConstTensor3View ConstTensor4View::operator()(const Range& b,
00099 const Range& p,
00100 const Range& r,
00101 Index c ) const
00102 {
00103
00104 assert( 0 <= c );
00105 assert( c < mcr.mextent );
00106
00107 return ConstTensor3View(mdata +
00108 mcr.mstart + c * mcr.mstride,
00109 mbr, mpr, mrr,
00110 b, p, r);
00111 }
00112
00115 ConstTensor3View ConstTensor4View::operator()(const Range& b,
00116 const Range& p,
00117 Index r,
00118 const Range& c) const
00119 {
00120
00121 assert( 0 <= r );
00122 assert( r < mrr.mextent );
00123
00124 return ConstTensor3View(mdata +
00125 mrr.mstart + r * mrr.mstride,
00126 mbr, mpr, mcr,
00127 b, p, c);
00128 }
00129
00132 ConstTensor3View ConstTensor4View::operator()(const Range& b,
00133 Index p,
00134 const Range& r,
00135 const Range& c) const
00136 {
00137
00138 assert( 0 <= p );
00139 assert( p < mpr.mextent );
00140
00141 return ConstTensor3View(mdata +
00142 mpr.mstart + p * mpr.mstride,
00143 mbr, mrr, mcr,
00144 b, r, c);
00145 }
00146
00149 ConstTensor3View ConstTensor4View::operator()(Index b,
00150 const Range& p,
00151 const Range& r,
00152 const Range& c) const
00153 {
00154
00155 assert( 0 <= b );
00156 assert( b < mbr.mextent );
00157
00158 return ConstTensor3View(mdata +
00159 mbr.mstart + b * mbr.mstride,
00160 mpr, mrr, mcr,
00161 p, r, c);
00162 }
00163
00166 ConstMatrixView ConstTensor4View::operator()(const Range& b,
00167 const Range& p,
00168 Index r,
00169 Index c ) const
00170 {
00171
00172 assert( 0 <= r );
00173 assert( 0 <= c );
00174 assert( r < mrr.mextent );
00175 assert( c < mcr.mextent );
00176
00177 return ConstMatrixView(mdata +
00178 mrr.mstart + r * mrr.mstride +
00179 mcr.mstart + c * mcr.mstride,
00180 mbr, mpr,
00181 b, p);
00182 }
00183
00186 ConstMatrixView ConstTensor4View::operator()(const Range& b,
00187 Index p,
00188 const Range& r,
00189 Index c ) const
00190 {
00191
00192 assert( 0 <= p );
00193 assert( 0 <= c );
00194 assert( p < mpr.mextent );
00195 assert( c < mcr.mextent );
00196
00197 return ConstMatrixView(mdata +
00198 mpr.mstart + p * mpr.mstride +
00199 mcr.mstart + c * mcr.mstride,
00200 mbr, mrr,
00201 b, r);
00202 }
00203
00206 ConstMatrixView ConstTensor4View::operator()(const Range& b,
00207 Index p,
00208 Index r,
00209 const Range& c) const
00210 {
00211
00212 assert( 0 <= p );
00213 assert( 0 <= r );
00214 assert( p < mpr.mextent );
00215 assert( r < mrr.mextent );
00216
00217 return ConstMatrixView(mdata +
00218 mpr.mstart + p * mpr.mstride +
00219 mrr.mstart + r * mrr.mstride,
00220 mbr, mcr,
00221 b, c);
00222 }
00223
00226 ConstMatrixView ConstTensor4View::operator()(Index b,
00227 const Range& p,
00228 Index r,
00229 const Range& c) const
00230 {
00231
00232 assert( 0 <= b );
00233 assert( 0 <= r );
00234 assert( b < mbr.mextent );
00235 assert( r < mrr.mextent );
00236
00237 return ConstMatrixView(mdata +
00238 mbr.mstart + b * mbr.mstride +
00239 mrr.mstart + r * mrr.mstride,
00240 mpr, mcr,
00241 p, c);
00242 }
00243
00246 ConstMatrixView ConstTensor4View::operator()(Index b,
00247 const Range& p,
00248 const Range& r,
00249 Index c ) const
00250 {
00251
00252 assert( 0 <= b );
00253 assert( 0 <= c );
00254 assert( b < mbr.mextent );
00255 assert( c < mcr.mextent );
00256
00257 return ConstMatrixView(mdata +
00258 mbr.mstart + b * mbr.mstride +
00259 mcr.mstart + c * mcr.mstride,
00260 mpr, mrr,
00261 p, r);
00262 }
00263
00266 ConstMatrixView ConstTensor4View::operator()(Index b,
00267 Index p,
00268 const Range& r,
00269 const Range& c) const
00270 {
00271
00272 assert( 0 <= b );
00273 assert( 0 <= p );
00274 assert( b < mbr.mextent );
00275 assert( p < mpr.mextent );
00276
00277 return ConstMatrixView(mdata +
00278 mbr.mstart + b * mbr.mstride +
00279 mpr.mstart + p * mpr.mstride,
00280 mrr, mcr,
00281 r, c);
00282 }
00283
00286 ConstVectorView ConstTensor4View::operator()(const Range& b,
00287 Index p,
00288 Index r,
00289 Index c ) const
00290 {
00291
00292 assert( 0 <= p );
00293 assert( 0 <= r );
00294 assert( 0 <= c );
00295 assert( p < mpr.mextent );
00296 assert( r < mrr.mextent );
00297 assert( c < mcr.mextent );
00298
00299 return ConstVectorView(mdata +
00300 mpr.mstart + p * mpr.mstride +
00301 mrr.mstart + r * mrr.mstride +
00302 mcr.mstart + c * mcr.mstride,
00303 mbr,
00304 b);
00305 }
00306
00309 ConstVectorView ConstTensor4View::operator()(Index b,
00310 const Range& p,
00311 Index r,
00312 Index c ) const
00313 {
00314
00315 assert( 0 <= b );
00316 assert( 0 <= r );
00317 assert( 0 <= c );
00318 assert( b < mbr.mextent );
00319 assert( r < mrr.mextent );
00320 assert( c < mcr.mextent );
00321
00322 return ConstVectorView(mdata +
00323 mbr.mstart + b * mbr.mstride +
00324 mrr.mstart + r * mrr.mstride +
00325 mcr.mstart + c * mcr.mstride,
00326 mpr,
00327 p);
00328 }
00329
00332 ConstVectorView ConstTensor4View::operator()(Index b,
00333 Index p,
00334 const Range& r,
00335 Index c ) const
00336 {
00337
00338 assert( 0 <= b );
00339 assert( 0 <= p );
00340 assert( 0 <= c );
00341 assert( b < mbr.mextent );
00342 assert( p < mpr.mextent );
00343 assert( c < mcr.mextent );
00344
00345 return ConstVectorView(mdata +
00346 mbr.mstart + b * mbr.mstride +
00347 mpr.mstart + p * mpr.mstride +
00348 mcr.mstart + c * mcr.mstride,
00349 mrr,
00350 r);
00351 }
00352
00355 ConstVectorView ConstTensor4View::operator()(Index b,
00356 Index p,
00357 Index r,
00358 const Range& c) const
00359 {
00360
00361 assert( 0 <= b );
00362 assert( 0 <= p );
00363 assert( 0 <= r );
00364 assert( b < mbr.mextent );
00365 assert( p < mpr.mextent );
00366 assert( r < mrr.mextent );
00367
00368 return ConstVectorView(mdata +
00369 mbr.mstart + b * mbr.mstride +
00370 mpr.mstart + p * mpr.mstride +
00371 mrr.mstart + r * mrr.mstride,
00372 mcr,
00373 c);
00374 }
00375
00382 Numeric *Tensor4View::get_c_array()
00383 {
00384 if (mbr.mstart != 0 || mbr.mstride != mpr.mextent * mrr.mextent * mcr.mextent
00385 || mpr.mstart != 0 || mpr.mstride != mrr.mextent * mcr.mextent
00386 || mrr.mstart != 0 || mrr.mstride != mcr.mextent
00387 || mcr.mstart != 0 || mcr.mstride != 1)
00388 throw runtime_error("A Tensor4View can only be converted to a plain C-array if mbr.mstart == 0 and mbr.mstride == mrp.extent*mrr.extent*mcr.extent and mpr.mstart == 0 and mpr.mstride == mrr.extent*mcr.extent and mrr.mstart == 0 and mrr.mstride == mcr.extent and mcr.mstart == 0 and mcr.mstride == 1");
00389
00390 return mdata;
00391 }
00392
00399 const Numeric *Tensor4View::get_c_array() const
00400 {
00401 if (mbr.mstart != 0 || mbr.mstride != mpr.mextent * mrr.mextent * mcr.mextent
00402 || mpr.mstart != 0 || mpr.mstride != mrr.mextent * mcr.mextent
00403 || mrr.mstart != 0 || mrr.mstride != mcr.mextent
00404 || mcr.mstart != 0 || mcr.mstride != 1)
00405 throw runtime_error("A Tensor4View can only be converted to a plain C-array if mbr.mstart == 0 and mbr.mstride == mrp.extent*mrr.extent*mcr.extent and mpr.mstart == 0 and mpr.mstride == mrr.extent*mcr.extent and mrr.mstart == 0 and mrr.mstride == mcr.extent and mcr.mstart == 0 and mcr.mstride == 1");
00406
00407 return mdata;
00408 }
00409
00411 ConstIterator4D ConstTensor4View::begin() const
00412 {
00413 return ConstIterator4D( ConstTensor3View(mdata + mbr.mstart,
00414 mpr, mrr, mcr),
00415 mbr.mstride );
00416 }
00417
00419 ConstIterator4D ConstTensor4View::end() const
00420 {
00421 return ConstIterator4D( ConstTensor3View(mdata + mbr.mstart +
00422 (mbr.mextent) * mbr.mstride,
00423 mpr, mrr, mcr),
00424 mbr.mstride );
00425 }
00426
00428 ConstTensor4View::ConstTensor4View(const ConstTensor3View& a) :
00429 mbr(0,1,a.mpr.mextent*a.mrr.mextent*a.mcr.mextent),
00430 mpr(a.mpr),
00431 mrr(a.mrr),
00432 mcr(a.mcr),
00433 mdata(a.mdata)
00434 {
00435
00436 }
00437
00440 ConstTensor4View::ConstTensor4View() :
00441 mbr(0,0,1),
00442 mpr(0,0,1),
00443 mrr(0,0,1),
00444 mcr(0,0,1),
00445 mdata(NULL)
00446 {
00447
00448 }
00449
00454 ConstTensor4View::ConstTensor4View(Numeric *data,
00455 const Range& br,
00456 const Range& pr,
00457 const Range& rr,
00458 const Range& cr) :
00459 mbr(br),
00460 mpr(pr),
00461 mrr(rr),
00462 mcr(cr),
00463 mdata(data)
00464 {
00465
00466 }
00467
00475 ConstTensor4View::ConstTensor4View(Numeric *data,
00476 const Range& pb,
00477 const Range& pp,
00478 const Range& pr,
00479 const Range& pc,
00480 const Range& nb,
00481 const Range& np,
00482 const Range& nr,
00483 const Range& nc) :
00484 mbr(pb,nb),
00485 mpr(pp,np),
00486 mrr(pr,nr),
00487 mcr(pc,nc),
00488 mdata(data)
00489 {
00490
00491 }
00492
00496 ostream& operator<<(ostream& os, const ConstTensor4View& v)
00497 {
00498
00499 ConstIterator4D ib = v.begin();
00500 const ConstIterator4D end_book = v.end();
00501
00502 if ( ib != end_book ) {
00503 os << *ib;
00504 ++ib;
00505 }
00506
00507 for ( ; ib != end_book; ++ib ) {
00508 os << "\n\n";
00509 os << *ib;
00510 }
00511
00512 return os;
00513 }
00514
00515
00516
00517
00518
00523 ConstTensor4View Tensor4View::operator()(const Range& b,
00524 const Range& p,
00525 const Range& r,
00526 const Range& c) const
00527 {
00528 return ConstTensor4View::operator()(b,p,r,c);
00529 }
00530
00535 ConstTensor3View Tensor4View::operator()(const Range& b,
00536 const Range& p,
00537 const Range& r,
00538 Index c ) const
00539 {
00540 return ConstTensor4View::operator()(b,p,r,c);
00541 }
00542
00547 ConstTensor3View Tensor4View::operator()(const Range& b,
00548 const Range& p,
00549 Index r,
00550 const Range& c) const
00551 {
00552 return ConstTensor4View::operator()(b,p,r,c);
00553 }
00554
00559 ConstTensor3View Tensor4View::operator()(const Range& b,
00560 Index p,
00561 const Range& r,
00562 const Range& c) const
00563 {
00564 return ConstTensor4View::operator()(b,p,r,c);
00565 }
00566
00571 ConstTensor3View Tensor4View::operator()(Index b,
00572 const Range& p,
00573 const Range& r,
00574 const Range& c) const
00575 {
00576 return ConstTensor4View::operator()(b,p,r,c);
00577 }
00578
00583 ConstMatrixView Tensor4View::operator()(const Range& b,
00584 const Range& p,
00585 Index r,
00586 Index c ) const
00587 {
00588 return ConstTensor4View::operator()(b,p,r,c);
00589 }
00590
00595 ConstMatrixView Tensor4View::operator()(const Range& b,
00596 Index p,
00597 const Range& r,
00598 Index c ) const
00599 {
00600 return ConstTensor4View::operator()(b,p,r,c);
00601 }
00602
00607 ConstMatrixView Tensor4View::operator()(const Range& b,
00608 Index p,
00609 Index r,
00610 const Range& c) const
00611 {
00612 return ConstTensor4View::operator()(b,p,r,c);
00613 }
00614
00619 ConstMatrixView Tensor4View::operator()(Index b,
00620 const Range& p,
00621 Index r,
00622 const Range& c) const
00623 {
00624 return ConstTensor4View::operator()(b,p,r,c);
00625 }
00626
00631 ConstMatrixView Tensor4View::operator()(Index b,
00632 const Range& p,
00633 const Range& r,
00634 Index c ) const
00635 {
00636 return ConstTensor4View::operator()(b,p,r,c);
00637 }
00638
00643 ConstMatrixView Tensor4View::operator()(Index b,
00644 Index p,
00645 const Range& r,
00646 const Range& c) const
00647 {
00648 return ConstTensor4View::operator()(b,p,r,c);
00649 }
00650
00655 ConstVectorView Tensor4View::operator()(const Range& b,
00656 Index p,
00657 Index r,
00658 Index c ) const
00659 {
00660 return ConstTensor4View::operator()(b,p,r,c);
00661 }
00662
00667 ConstVectorView Tensor4View::operator()(Index b,
00668 const Range& p,
00669 Index r,
00670 Index c ) const
00671 {
00672 return ConstTensor4View::operator()(b,p,r,c);
00673 }
00674
00679 ConstVectorView Tensor4View::operator()(Index b,
00680 Index p,
00681 const Range& r,
00682 Index c ) const
00683 {
00684 return ConstTensor4View::operator()(b,p,r,c);
00685 }
00686
00691 ConstVectorView Tensor4View::operator()(Index b,
00692 Index p,
00693 Index r,
00694 const Range& c) const
00695 {
00696 return ConstTensor4View::operator()(b,p,r,c);
00697 }
00698
00702 Tensor4View Tensor4View::operator()(const Range& b,
00703 const Range& p,
00704 const Range& r,
00705 const Range& c)
00706 {
00707 return Tensor4View(mdata,
00708 mbr, mpr, mrr, mcr,
00709 b, p, r, c);
00710 }
00711
00714 Tensor3View Tensor4View::operator()(const Range& b,
00715 const Range& p,
00716 const Range& r,
00717 Index c)
00718 {
00719
00720 assert( 0 <= c );
00721 assert( c < mcr.mextent );
00722
00723 return Tensor3View(mdata +
00724 mcr.mstart + c * mcr.mstride,
00725 mbr, mpr, mrr,
00726 b, p, r);
00727 }
00728
00731 Tensor3View Tensor4View::operator()(const Range& b,
00732 const Range& p,
00733 Index r,
00734 const Range& c)
00735 {
00736
00737 assert( 0 <= r );
00738 assert( r < mrr.mextent );
00739
00740 return Tensor3View(mdata +
00741 mrr.mstart + r * mrr.mstride,
00742 mbr, mpr, mcr,
00743 b, p, c);
00744 }
00745
00748 Tensor3View Tensor4View::operator()(const Range& b,
00749 Index p,
00750 const Range& r,
00751 const Range& c)
00752 {
00753
00754 assert( 0 <= p );
00755 assert( p < mpr.mextent );
00756
00757 return Tensor3View(mdata +
00758 mpr.mstart + p * mpr.mstride,
00759 mbr, mrr, mcr,
00760 b, r, c);
00761 }
00762
00765 Tensor3View Tensor4View::operator()(Index b,
00766 const Range& p,
00767 const Range& r,
00768 const Range& c)
00769 {
00770
00771 assert( 0 <= b );
00772 assert( b < mbr.mextent );
00773
00774 return Tensor3View(mdata +
00775 mbr.mstart + b * mbr.mstride,
00776 mpr, mrr, mcr,
00777 p, r, c);
00778 }
00779
00782 MatrixView Tensor4View::operator()(const Range& b,
00783 const Range& p,
00784 Index r,
00785 Index c)
00786 {
00787
00788 assert( 0 <= r );
00789 assert( 0 <= c );
00790 assert( r < mrr.mextent );
00791 assert( c < mcr.mextent );
00792
00793 return MatrixView(mdata +
00794 mrr.mstart + r * mrr.mstride +
00795 mcr.mstart + c * mcr.mstride,
00796 mbr, mpr,
00797 b, p);
00798 }
00799
00802 MatrixView Tensor4View::operator()(const Range& b,
00803 Index p,
00804 const Range& r,
00805 Index c)
00806 {
00807
00808 assert( 0 <= p );
00809 assert( 0 <= c );
00810 assert( p < mpr.mextent );
00811 assert( c < mcr.mextent );
00812
00813 return MatrixView(mdata +
00814 mpr.mstart + p * mpr.mstride +
00815 mcr.mstart + c * mcr.mstride,
00816 mbr, mrr,
00817 b, r);
00818 }
00819
00822 MatrixView Tensor4View::operator()(const Range& b,
00823 Index p,
00824 Index r,
00825 const Range& c)
00826 {
00827
00828 assert( 0 <= p );
00829 assert( 0 <= r );
00830 assert( p < mpr.mextent );
00831 assert( r < mrr.mextent );
00832
00833 return MatrixView(mdata +
00834 mpr.mstart + p * mpr.mstride +
00835 mrr.mstart + r * mrr.mstride,
00836 mbr, mcr,
00837 b, c);
00838 }
00839
00842 MatrixView Tensor4View::operator()(Index b,
00843 const Range& p,
00844 Index r,
00845 const Range& c)
00846 {
00847
00848 assert( 0 <= b );
00849 assert( 0 <= r );
00850 assert( b < mbr.mextent );
00851 assert( r < mrr.mextent );
00852
00853 return MatrixView(mdata +
00854 mbr.mstart + b * mbr.mstride +
00855 mrr.mstart + r * mrr.mstride,
00856 mpr, mcr,
00857 p, c);
00858 }
00859
00862 MatrixView Tensor4View::operator()(Index b,
00863 const Range& p,
00864 const Range& r,
00865 Index c)
00866 {
00867
00868 assert( 0 <= b );
00869 assert( 0 <= c );
00870 assert( b < mbr.mextent );
00871 assert( c < mcr.mextent );
00872
00873 return MatrixView(mdata +
00874 mbr.mstart + b * mbr.mstride +
00875 mcr.mstart + c * mcr.mstride,
00876 mpr, mrr,
00877 p, r);
00878 }
00879
00882 MatrixView Tensor4View::operator()(Index b,
00883 Index p,
00884 const Range& r,
00885 const Range& c)
00886 {
00887
00888 assert( 0 <= b );
00889 assert( 0 <= p );
00890 assert( b < mbr.mextent );
00891 assert( p < mpr.mextent );
00892
00893 return MatrixView(mdata +
00894 mbr.mstart + b * mbr.mstride +
00895 mpr.mstart + p * mpr.mstride,
00896 mrr, mcr,
00897 r, c);
00898 }
00899
00902 VectorView Tensor4View::operator()(const Range& b,
00903 Index p,
00904 Index r,
00905 Index c)
00906 {
00907
00908 assert( 0 <= p );
00909 assert( 0 <= r );
00910 assert( 0 <= c );
00911 assert( p < mpr.mextent );
00912 assert( r < mrr.mextent );
00913 assert( c < mcr.mextent );
00914
00915 return VectorView(mdata +
00916 mpr.mstart + p * mpr.mstride +
00917 mrr.mstart + r * mrr.mstride +
00918 mcr.mstart + c * mcr.mstride,
00919 mbr,
00920 b);
00921 }
00922
00925 VectorView Tensor4View::operator()(Index b,
00926 const Range& p,
00927 Index r,
00928 Index c)
00929 {
00930
00931 assert( 0 <= b );
00932 assert( 0 <= r );
00933 assert( 0 <= c );
00934 assert( b < mbr.mextent );
00935 assert( r < mrr.mextent );
00936 assert( c < mcr.mextent );
00937
00938 return VectorView(mdata +
00939 mbr.mstart + b * mbr.mstride +
00940 mrr.mstart + r * mrr.mstride +
00941 mcr.mstart + c * mcr.mstride,
00942 mpr,
00943 p);
00944 }
00945
00948 VectorView Tensor4View::operator()(Index b,
00949 Index p,
00950 const Range& r,
00951 Index c)
00952 {
00953
00954 assert( 0 <= b );
00955 assert( 0 <= p );
00956 assert( 0 <= c );
00957 assert( b < mbr.mextent );
00958 assert( p < mpr.mextent );
00959 assert( c < mcr.mextent );
00960
00961 return VectorView(mdata +
00962 mbr.mstart + b * mbr.mstride +
00963 mpr.mstart + p * mpr.mstride +
00964 mcr.mstart + c * mcr.mstride,
00965 mrr,
00966 r);
00967 }
00968
00971 VectorView Tensor4View::operator()(Index b,
00972 Index p,
00973 Index r,
00974 const Range& c)
00975 {
00976
00977 assert( 0 <= b );
00978 assert( 0 <= p );
00979 assert( 0 <= r );
00980 assert( b < mbr.mextent );
00981 assert( p < mpr.mextent );
00982 assert( r < mrr.mextent );
00983
00984 return VectorView(mdata +
00985 mbr.mstart + b * mbr.mstride +
00986 mpr.mstart + p * mpr.mstride +
00987 mrr.mstart + r * mrr.mstride,
00988 mcr,
00989 c);
00990 }
00991
00994 ConstIterator4D Tensor4View::begin() const
00995 {
00996 return ConstTensor4View::begin();
00997 }
00998
01000 ConstIterator4D Tensor4View::end() const
01001 {
01002 return ConstTensor4View::end();
01003 }
01004
01006 Iterator4D Tensor4View::begin()
01007 {
01008 return Iterator4D( Tensor3View(mdata + mbr.mstart,
01009 mpr, mrr, mcr),
01010 mbr.mstride );
01011 }
01012
01014 Iterator4D Tensor4View::end()
01015 {
01016 return Iterator4D( Tensor3View(mdata + mbr.mstart +
01017 (mbr.mextent) * mbr.mstride,
01018 mpr, mrr, mcr),
01019 mbr.mstride );
01020 }
01021
01026 Tensor4View& Tensor4View::operator=(const ConstTensor4View& m)
01027 {
01028
01029 assert( mbr.mextent == m.mbr.mextent );
01030 assert( mpr.mextent == m.mpr.mextent );
01031 assert( mrr.mextent == m.mrr.mextent );
01032 assert( mcr.mextent == m.mcr.mextent );
01033
01034 copy( m.begin(), m.end(), begin() );
01035 return *this;
01036 }
01037
01043 Tensor4View& Tensor4View::operator=(const Tensor4View& m)
01044 {
01045
01046 assert( mbr.mextent == m.mbr.mextent );
01047 assert( mpr.mextent == m.mpr.mextent );
01048 assert( mrr.mextent == m.mrr.mextent );
01049 assert( mcr.mextent == m.mcr.mextent );
01050
01051 copy( m.begin(), m.end(), begin() );
01052 return *this;
01053 }
01054
01058 Tensor4View& Tensor4View::operator=(const Tensor4& m)
01059 {
01060
01061 assert( mbr.mextent == m.mbr.mextent );
01062 assert( mpr.mextent == m.mpr.mextent );
01063 assert( mrr.mextent == m.mrr.mextent );
01064 assert( mcr.mextent == m.mcr.mextent );
01065
01066 copy( m.begin(), m.end(), begin() );
01067 return *this;
01068 }
01069
01072 Tensor4View& Tensor4View::operator=(Numeric x)
01073 {
01074 copy( x, begin(), end() );
01075 return *this;
01076 }
01077
01078
01079
01080
01082 Tensor4View& Tensor4View::operator*=(Numeric x)
01083 {
01084 const Iterator4D eb = end();
01085 for ( Iterator4D b = begin(); b != eb ; ++b )
01086 {
01087 *b *= x;
01088 }
01089 return *this;
01090 }
01091
01093 Tensor4View& Tensor4View::operator/=(Numeric x)
01094 {
01095 const Iterator4D eb = end();
01096 for ( Iterator4D b = begin(); b != eb ; ++b )
01097 {
01098 *b /= x;
01099 }
01100 return *this;
01101 }
01102
01104 Tensor4View& Tensor4View::operator+=(Numeric x)
01105 {
01106 const Iterator4D eb = end();
01107 for ( Iterator4D b = begin(); b != eb ; ++b )
01108 {
01109 *b += x;
01110 }
01111 return *this;
01112 }
01113
01115 Tensor4View& Tensor4View::operator-=(Numeric x)
01116 {
01117 const Iterator4D eb = end();
01118 for ( Iterator4D b = begin(); b != eb ; ++b )
01119 {
01120 *b -= x;
01121 }
01122 return *this;
01123 }
01124
01126 Tensor4View& Tensor4View::operator*=(const ConstTensor4View& x)
01127 {
01128 assert( nbooks() == x.nbooks() );
01129 assert( npages() == x.npages() );
01130 assert( nrows() == x.nrows() );
01131 assert( ncols() == x.ncols() );
01132 ConstIterator4D xb = x.begin();
01133 Iterator4D b = begin();
01134 const Iterator4D eb = end();
01135 for ( ; b != eb ; ++b, ++xb )
01136 {
01137 *b *= *xb;
01138 }
01139 return *this;
01140 }
01141
01143 Tensor4View& Tensor4View::operator/=(const ConstTensor4View& x)
01144 {
01145 assert( nbooks() == x.nbooks() );
01146 assert( npages() == x.npages() );
01147 assert( nrows() == x.nrows() );
01148 assert( ncols() == x.ncols() );
01149 ConstIterator4D xb = x.begin();
01150 Iterator4D b = begin();
01151 const Iterator4D eb = end();
01152 for ( ; b != eb ; ++b, ++xb )
01153 {
01154 *b /= *xb;
01155 }
01156 return *this;
01157 }
01158
01160 Tensor4View& Tensor4View::operator+=(const ConstTensor4View& x)
01161 {
01162 assert( nbooks() == x.nbooks() );
01163 assert( npages() == x.npages() );
01164 assert( nrows() == x.nrows() );
01165 assert( ncols() == x.ncols() );
01166 ConstIterator4D xb = x.begin();
01167 Iterator4D b = begin();
01168 const Iterator4D eb = end();
01169 for ( ; b != eb ; ++b, ++xb )
01170 {
01171 *b += *xb;
01172 }
01173 return *this;
01174 }
01175
01177 Tensor4View& Tensor4View::operator-=(const ConstTensor4View& x)
01178 {
01179 assert( nbooks() == x.nbooks() );
01180 assert( npages() == x.npages() );
01181 assert( nrows() == x.nrows() );
01182 assert( ncols() == x.ncols() );
01183 ConstIterator4D xb = x.begin();
01184 Iterator4D b = begin();
01185 const Iterator4D eb = end();
01186 for ( ; b != eb ; ++b, ++xb )
01187 {
01188 *b -= *xb;
01189 }
01190 return *this;
01191 }
01192
01194 Tensor4View::Tensor4View(const Tensor3View& a) :
01195 ConstTensor4View( a.mdata,
01196 Range(0,1,
01197 a.mpr.mextent*
01198 a.mrr.mextent*
01199 a.mcr.mextent),
01200 a.mpr,
01201 a.mrr,
01202 a.mcr )
01203 {
01204
01205 }
01206
01209 Tensor4View::Tensor4View() :
01210 ConstTensor4View()
01211 {
01212
01213 }
01214
01218 Tensor4View::Tensor4View(Numeric *data,
01219 const Range& br,
01220 const Range& pr,
01221 const Range& rr,
01222 const Range& cr) :
01223 ConstTensor4View(data, br, pr, rr, cr)
01224 {
01225
01226 }
01227
01246 Tensor4View::Tensor4View(Numeric *data,
01247 const Range& pb,
01248 const Range& pp,
01249 const Range& pr,
01250 const Range& pc,
01251 const Range& nb,
01252 const Range& np,
01253 const Range& nr,
01254 const Range& nc) :
01255 ConstTensor4View(data, pb, pp, pr, pc, nb, np, nr, nc)
01256 {
01257
01258 }
01259
01264 void copy(ConstIterator4D origin,
01265 const ConstIterator4D& end,
01266 Iterator4D target)
01267 {
01268 for ( ; origin != end ; ++origin, ++target )
01269 {
01270
01271
01272 copy( origin->begin(), origin->end(), target->begin() );
01273 }
01274 }
01275
01277 void copy(Numeric x,
01278 Iterator4D target,
01279 const Iterator4D& end)
01280 {
01281 for ( ; target != end ; ++target )
01282 {
01283
01284
01285 copy( x, target->begin(), target->end() );
01286 }
01287 }
01288
01289
01290
01291
01292
01294 Tensor4::Tensor4() :
01295 Tensor4View::Tensor4View()
01296 {
01297
01298
01299
01300
01301 }
01302
01305 Tensor4::Tensor4(Index b, Index p, Index r, Index c) :
01306 Tensor4View( new Numeric[b*p*r*c],
01307 Range( 0, b, p*r*c ),
01308 Range( 0, p, r*c ),
01309 Range( 0, r, c ),
01310 Range( 0, c) )
01311 {
01312
01313 }
01314
01316 Tensor4::Tensor4(Index b, Index p, Index r, Index c, Numeric fill) :
01317 Tensor4View( new Numeric[b*p*r*c],
01318 Range( 0, b, p*r*c ),
01319 Range( 0, p, r*c ),
01320 Range( 0, r, c ),
01321 Range( 0, c) )
01322 {
01323
01324
01325 const Numeric *stop = mdata + b*p*r*c;
01326 for ( Numeric *x = mdata; x < stop; ++x )
01327 *x = fill;
01328 }
01329
01332 Tensor4::Tensor4(const ConstTensor4View& m) :
01333 Tensor4View( new Numeric[m.nbooks()*m.npages()*m.nrows()*m.ncols()],
01334 Range( 0, m.nbooks(), m.npages()*m.nrows()*m.ncols() ),
01335 Range( 0, m.npages(), m.nrows()*m.ncols() ),
01336 Range( 0, m.nrows(), m.ncols() ),
01337 Range( 0, m.ncols() ) )
01338 {
01339 copy( m.begin(), m.end(), begin() );
01340 }
01341
01344 Tensor4::Tensor4(const Tensor4& m) :
01345 Tensor4View( new Numeric[m.nbooks()*m.npages()*m.nrows()*m.ncols()],
01346 Range( 0, m.nbooks(), m.npages()*m.nrows()*m.ncols() ),
01347 Range( 0, m.npages(), m.nrows()*m.ncols() ),
01348 Range( 0, m.nrows(), m.ncols() ),
01349 Range( 0, m.ncols() ) )
01350 {
01351
01352
01353
01354
01355
01356 copy( m.begin(), m.end(), begin());
01357 }
01358
01360
01383 Tensor4& Tensor4::operator=(const Tensor4& m)
01384 {
01385
01386
01387
01388 resize( m.mbr.mextent, m.mpr.mextent, m.mrr.mextent, m.mcr.mextent );
01389 copy( m.begin(), m.end(), begin() );
01390 return *this;
01391 }
01392
01395 Tensor4& Tensor4::operator=(Numeric x)
01396 {
01397 copy( x, begin(), end() );
01398 return *this;
01399 }
01400
01404 void Tensor4::resize(Index b, Index p, Index r, Index c)
01405 {
01406 assert( 0 <= b );
01407 assert( 0 <= p );
01408 assert( 0 <= r );
01409 assert( 0 <= c );
01410
01411 if ( mbr.mextent != b ||
01412 mpr.mextent != p ||
01413 mrr.mextent != r ||
01414 mcr.mextent != c )
01415 {
01416 delete[] mdata;
01417 mdata = new Numeric[b*p*r*c];
01418
01419 mbr.mstart = 0;
01420 mbr.mextent = b;
01421 mbr.mstride = p*r*c;
01422
01423 mpr.mstart = 0;
01424 mpr.mextent = p;
01425 mpr.mstride = r*c;
01426
01427 mrr.mstart = 0;
01428 mrr.mextent = r;
01429 mrr.mstride = c;
01430
01431 mcr.mstart = 0;
01432 mcr.mextent = c;
01433 mcr.mstride = 1;
01434 }
01435 }
01436
01439 Tensor4::~Tensor4()
01440 {
01441
01442
01443 delete[] mdata;
01444 }
01445
01446
01462 void transform( Tensor4View y,
01463 double (&my_func)(double),
01464 ConstTensor4View x )
01465 {
01466
01467 assert( y.nbooks() == x.nbooks() );
01468 assert( y.npages() == x.npages() );
01469 assert( y.nrows() == x.nrows() );
01470 assert( y.ncols() == x.ncols() );
01471
01472 const ConstIterator4D xe = x.end();
01473 ConstIterator4D xi = x.begin();
01474 Iterator4D yi = y.begin();
01475 for ( ; xi != xe; ++xi, ++yi )
01476 {
01477
01478
01479 transform( *yi, my_func, *xi );
01480 }
01481 }
01482
01484 Numeric max(const ConstTensor4View& x)
01485 {
01486 const ConstIterator4D xe = x.end();
01487 ConstIterator4D xi = x.begin();
01488
01489
01490 Numeric themax = max(*xi);
01491 ++xi;
01492
01493 for ( ; xi != xe ; ++xi )
01494 {
01495
01496
01497 Numeric maxi = max(*xi);
01498 if ( maxi > themax )
01499 themax = maxi;
01500 }
01501
01502 return themax;
01503 }
01504
01506 Numeric min(const ConstTensor4View& x)
01507 {
01508 const ConstIterator4D xe = x.end();
01509 ConstIterator4D xi = x.begin();
01510
01511
01512 Numeric themin = min(*xi);
01513 ++xi;
01514
01515 for ( ; xi != xe ; ++xi )
01516 {
01517
01518
01519 Numeric mini = min(*xi);
01520 if ( mini < themin )
01521 themin = mini;
01522 }
01523
01524 return themin;
01525 }
01526
01527
01529
01530 #ifndef NDEBUG
01531
01547 Numeric debug_tensor4view_get_elem (Tensor4View& tv,
01548 Index b, Index p, Index r, Index c)
01549 {
01550 return tv(b, p, r, c);
01551 }
01552
01553 #endif
01555