Go to the documentation of this file.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
00027
00028 #ifndef _CHAINCON_COMBTENSOR_H_
00029 #define _CHAINCON_COMBTENSOR_H_
00030
00031
00032
00033 #include <istream>
00034 #include <ostream>
00035
00036
00037 #include "chomp/system/config.h"
00038
00039
00040 #include "chaincon/pair.h"
00041 #include "chaincon/combchain.h"
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 template <class CellT>
00052 class tCombTensor
00053 {
00054 public:
00055
00056 typedef CellT CellType;
00057
00058
00059 tCombTensor ();
00060
00061
00062 int_t size () const;
00063
00064
00065 bool empty () const;
00066
00067
00068 const CellT &left (int_t n) const;
00069
00070
00071 const CellT &right (int_t n) const;
00072
00073
00074 void add (const CellT &c1, const CellT &c2);
00075
00076
00077 void add (const tCombChain<CellT> &c1, const tCombChain<CellT> &c2);
00078
00079
00080 void add (const tCombTensor<CellT> &ch);
00081
00082
00083
00084
00085
00086 void swap (tCombTensor<CellT> &ch);
00087
00088 private:
00089
00090 tCombChain<tPair<CellT,CellT> > tensor;
00091
00092 };
00093
00094
00095
00096 template <class CellT>
00097 inline tCombTensor<CellT>::tCombTensor ()
00098 {
00099 return;
00100 }
00101
00102 template <class CellT>
00103 inline int_t tCombTensor<CellT>::size () const
00104 {
00105 return tensor. size ();
00106 }
00107
00108 template <class CellT>
00109 inline bool tCombTensor<CellT>::empty () const
00110 {
00111 return tensor. empty ();
00112 }
00113
00114 template <class CellT>
00115 inline const CellT &tCombTensor<CellT>::left (int_t n) const
00116 {
00117 return tensor [n]. left;
00118 }
00119
00120 template <class CellT>
00121 inline const CellT &tCombTensor<CellT>::right (int_t n) const
00122 {
00123 return tensor [n]. right;
00124 }
00125
00126 template <class CellT>
00127 inline void tCombTensor<CellT>::add (const CellT &c1, const CellT &c2)
00128 {
00129 tensor. add (tPair<CellT,CellT> (c1, c2));
00130 }
00131
00132 template <class CellT>
00133 inline void tCombTensor<CellT>::add (const tCombChain<CellT> &ch1,
00134 const tCombChain<CellT> &ch2)
00135 {
00136 int_t ch1size = ch1. size ();
00137 int_t ch2size = ch2. size ();
00138 for (int_t i = 0; i < ch1size; ++ i)
00139 {
00140 const CellT &c1 = ch1 [i];
00141 for (int_t j = 0; j < ch2size; ++ j)
00142 {
00143 const CellT &c2 = ch2 [j];
00144 tensor. add (tPair<CellT,CellT> (c1, c2));
00145 }
00146 }
00147 return;
00148 }
00149
00150 template <class CellT>
00151 inline void tCombTensor<CellT>::add (const tCombTensor<CellT> &ch)
00152 {
00153 tensor. add (ch. tensor);
00154 return;
00155 }
00156
00157
00158 template <class CellT>
00159 inline void tCombTensor<CellT>::swap (tCombTensor<CellT> &ch)
00160 {
00161 tensor. swap (ch. cells);
00162 return;
00163 }
00164
00165
00166
00167
00168 template <class CellT>
00169 std::ostream &operator << (std::ostream &out, const tCombTensor<CellT> &c)
00170 {
00171 int_t size = c. size ();
00172 for (int_t i = 0; i < size; ++ i)
00173 {
00174 if (i)
00175 out << " + ";
00176 out << c. left (i) << " x " << c. right (i);
00177 }
00178 return out;
00179 }
00180
00181
00182 template <class CellT>
00183 std::istream &operator >> (std::istream &in, tCombTensor<CellT> &c)
00184 {
00185 throw "Operator >> not implemented for tCombTensor.";
00186 return in;
00187 }
00188
00189
00190
00191
00192 template <class CellT>
00193 inline void computeBoundary (const tCombTensor<CellT> &c,
00194 tCombTensor<CellT> &b)
00195 {
00196 int_t size = c. size ();
00197 for (int_t i = 0; i < size; ++ i)
00198 {
00199 tCombChain<CellT> left;
00200 computeBoundary (c. left (i), left);
00201 tCombChain<CellT> right;
00202 computeBoundary (c. right (i), right);
00203 b. add (left, right);
00204 }
00205 return;
00206 }
00207
00208
00209 template <class CellT>
00210 inline tCombTensor<CellT> boundary (const tCombTensor<CellT> &c)
00211 {
00212
00213 tCombTensor<CellT> b;
00214
00215
00216 computeBoundary (c, b);
00217
00218
00219 return b;
00220 }
00221
00222
00223 #endif // _CHAINCON_COMBTENSOR_H_
00224