28 using namespace gslpp;
30 #define isMat(X,M) (std::is_same<X,matrix<M> >::value)
31 #define isVec(X,V) (std::is_same<X,vector<V> >::value)
32 #define isSc(X,S) (std::is_same<X,S>::value)
33 #define isS(X) (isSc(X,double) || isSc(X,complex))
34 #define isV(X) (isVec(X,double) || isVec(X,complex))
35 #define isM(X) (isMat(X,double) || isMat(X,complex))
36 #define isComp(X) (isSc(X,complex) || isVec(X,complex) || isMat(X,complex))
37 #define sameType(X,Y) ( (isS(X) && isS(Y)) || (isV(X) && isV(Y)) || (isM(X) && isM(Y)))
68 Expanded<T>(std::vector<T> & dinp,
int minord2_i = 0);
78 Expanded<T>(std::vector<std::vector<T> > & dinp,
int minord2_i = 0,
int minord1_i = 0);
81 typename std::enable_if<
83 (isSc(T,
complex) && isComp(Q)) ||
84 (isMat(T,
double) && !isS(Q)) ||
87 int min1 = minord1 + z.
getMin1();
88 int min2 = minord2 + z.
getMin2();
89 int up1 = std::min(n1, z.
getN1());
90 std::vector<std::vector<Q> > res;
91 for (
int i1 = 0; i1 < up1; i1++) {
92 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
93 res.push_back(std::vector<Q>(up2, z.
Zero()));
94 for (
int i2 = 0; i2 < up2; i2++)
95 for (
int j1 = 0; j1 <= i1; j1++)
96 for (
int j2 = 0; j2 <= i2; j2++)
103 typename std::enable_if<
104 (!isSc(T,
double) && isSc(Q,
double)) ||
105 (!isS(T) && !isMat(T,
double) && isMat(Q,
double)) ||
109 int min1 = minord1 + z.
getMin1();
110 int min2 = minord2 + z.
getMin2();
111 int up1 = std::min(n1, z.
getN1());
112 std::vector<std::vector<T> > res;
113 for (
int i1 = 0; i1 < up1; i1++) {
114 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
115 res.push_back(std::vector<T>(up2, Zero()));
116 for (
int i2 = 0; i2 < up2; i2++)
117 for (
int j1 = 0; j1 <= i1; j1++)
118 for (
int j2 = 0; j2 <= i2; j2++)
125 typename std::enable_if<
126 (isVec(T,
double) && isSc(Q,
complex)) ||
129 int min1 = minord1 + z.
getMin1();
130 int min2 = minord2 + z.
getMin2();
131 int up1 = std::min(n1, z.
getN1());
132 std::vector<std::vector<vector<complex> > > res;
133 for (
int i1 = 0; i1 < up1; i1++) {
134 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
136 for (
int i2 = 0; i2 < up2; i2++)
137 for (
int j1 = 0; j1 <= i1; j1++)
138 for (
int j2 = 0; j2 <= i2; j2++)
145 typename std::enable_if<
146 (isSc(T,
complex) && isVec(Q,
double)) ||
149 int min1 = minord1 + z.
getMin1();
150 int min2 = minord2 + z.
getMin2();
151 int up1 = std::min(n1, z.
getN1());
152 std::vector<std::vector<vector<complex> > > res;
153 for (
int i1 = 0; i1 < up1; i1++) {
154 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
156 for (
int i2 = 0; i2 < up2; i2++)
157 for (
int j1 = 0; j1 <= i1; j1++)
158 for (
int j2 = 0; j2 <= i2; j2++)
165 typename std::enable_if<
166 (isVec(T,
double) && isVec(Q,
complex)) ||
167 (isVec(T,
complex) && isVec(Q,
double)) ||
170 int min1 = minord1 + z.
getMin1();
171 int min2 = minord2 + z.
getMin2();
172 int up1 = std::min(n1, z.
getN1());
173 std::vector<std::vector<complex> > res;
174 for (
int i1 = 0; i1 < up1; i1++) {
175 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
176 res.push_back(std::vector<complex>(up2, 0.));
177 for (
int i2 = 0; i2 < up2; i2++)
178 for (
int j1 = 0; j1 <= i1; j1++)
179 for (
int j2 = 0; j2 <= i2; j2++)
186 typename std::enable_if<
189 int min1 = minord1 + z.
getMin1();
190 int min2 = minord2 + z.
getMin2();
191 int up1 = std::min(n1, z.
getN1());
192 std::vector<std::vector<matrix<complex> > > res;
193 for (
int i1 = 0; i1 < up1; i1++) {
194 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
196 for (
int i2 = 0; i2 < up2; i2++)
197 for (
int j1 = 0; j1 <= i1; j1++)
198 for (
int j2 = 0; j2 <= i2; j2++)
205 typename std::enable_if<
208 int min1 = minord1 + z.
getMin1();
209 int min2 = minord2 + z.
getMin2();
210 int up1 = std::min(n1, z.
getN1());
211 std::vector<std::vector<matrix<complex> > > res;
212 for (
int i1 = 0; i1 < up1; i1++) {
213 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
215 for (
int i2 = 0; i2 < up2; i2++)
216 for (
int j1 = 0; j1 <= i1; j1++)
217 for (
int j2 = 0; j2 <= i2; j2++)
224 typename std::enable_if<
227 int min1 = minord1 + z.
getMin1();
228 int min2 = minord2 + z.
getMin2();
229 int up1 = std::min(n1, z.
getN1());
230 std::vector<std::vector<double> > res;
231 for (
int i1 = 0; i1 < up1; i1++) {
232 int up2 = std::min(n2.at(i1), z.
getN2().at(i1));
233 res.push_back(std::vector<double>(up2, 0.));
234 for (
int i2 = 0; i2 < up2; i2++)
235 for (
int j1 = 0; j1 <= i1; j1++)
236 for (
int j2 = 0; j2 <= i2; j2++)
245 typename std::enable_if<
248 int min1 = std::min(minord1, z.
getMin1());
249 int min2 = std::min(minord2, z.
getMin2());
250 int up1 = std::min(n1 + minord1, z.
getN1() + z.
getMin1()) - min1;
251 std::vector<std::vector<T> > res;
252 for (
int i1 = 0; i1 < up1; i1++) {
253 int up2 = std::min(n2.at(i1) + minord2, z.
getN2().at(i1) + z.
getMin2()) - min2;
254 res.push_back(std::vector<T>(up2, z.
Zero()));
255 for (
int i2 = 0; i2 < up2; i2++) {
256 if (i1 + min1 >= minord1 && i2 + min2 >= minord2) res[i1][i2] += data[i1 + min1 - minord1][i2 + min2 - minord2];
257 if (i1 + min1 >= z.
getMin1() && i2 + min2 >= z.
getMin2()) res[i1][i2] += z.
getOrd(i2 + min2, i1 + min1);
264 typename std::enable_if<
267 int min1 = std::min(minord1, z.
getMin1());
268 int min2 = std::min(minord2, z.
getMin2());
269 int up1 = std::min(n1 + minord1, z.
getN1() + z.
getMin1()) - min1;
270 std::vector<std::vector<Q> > res;
271 for (
int i1 = 0; i1 < up1; i1++) {
272 int up2 = std::min(n2.at(i1) + minord2, z.
getN2().at(i1) + z.
getMin2()) - min2;
273 res.push_back(std::vector<Q>(up2, z.
Zero()));
274 for (
int i2 = 0; i2 < up2; i2++) {
275 if (i1 + min1 >= minord1 && i2 + min2 >= minord2) res[i1][i2] += data[i1 + min1 - minord1][i2 + min2 - minord2];
276 if (i1 + min1 >= z.
getMin1() && i2 + min2 >= z.
getMin2()) res[i1][i2] += z.
getOrd(i2 + min2, i1 + min1);
285 typename std::enable_if<
288 int min1 = std::min(minord1, z.
getMin1());
289 int min2 = std::min(minord2, z.
getMin2());
290 int up1 = std::min(n1 + minord1, z.
getN1() + z.
getMin1()) - min1;
291 std::vector<std::vector<T> > res;
292 for (
int i1 = 0; i1 < up1; i1++) {
293 int up2 = std::min(n2.at(i1) + minord2, z.
getN2().at(i1) + z.
getMin2()) - min2;
294 res.push_back(std::vector<T>(up2, z.
Zero()));
295 for (
int i2 = 0; i2 < up2; i2++) {
296 if (i1 + min1 >= minord1 && i2 + min2 >= minord2) res[i1][i2] += data[i1 + min1 - minord1][i2 + min2 - minord2];
297 if (i1 + min1 >= z.
getMin1() && i2 + min2 >= z.
getMin2()) res[i1][i2] -= z.
getOrd(i2 + min2, i1 + min1);
304 typename std::enable_if<
307 int min1 = std::min(minord1, z.
getMin1());
308 int min2 = std::min(minord2, z.
getMin2());
309 int up1 = std::min(n1 + minord1, z.
getN1() + z.
getMin1()) - min1;
310 std::vector<std::vector<Q> > res;
311 for (
int i1 = 0; i1 < up1; i1++) {
312 int up2 = std::min(n2.at(i1) + minord2, z.
getN2().at(i1) + z.
getMin2()) - min2;
313 res.push_back(std::vector<Q>(up2, z.
Zero()));
314 for (
int i2 = 0; i2 < up2; i2++) {
315 if (i1 + min1 >= minord1 && i2 + min2 >= minord2) res[i1][i2] += data[i1 + min1 - minord1][i2 + min2 - minord2];
316 if (i1 + min1 >= z.
getMin1() && i2 + min2 >= z.
getMin2()) res[i1][i2] -= z.
getOrd(i2 + min2, i1 + min1);
323 throw std::runtime_error(
"Expanded::inverse: method not implemented");
327 std::vector<std::vector<T> > res;
328 for (
int i1 = 0; i1 < n1; i1++) {
329 res.push_back(std::vector<T>(n2.at(i1), Zero()));
330 for (
int i2 = 0; i2 < n2.at(i1); i2++)
331 res[i1][i2] = -data[i1][i2];
337 typename std::enable_if< isSc(Q,
double) ,
Expanded<T> >::type
364 for (
int i1 = 0; i1 < n1; i1++)
366 if(n2.at(i1) != z.
getN2().at(i1))
return false;
367 for (
int i2 = 0; i2 < n2.at(i1); i2++)
375 return !(z == *
this);
385 typename std::enable_if<
386 (std::is_same<T, Q>::value && !isV(T)) ||
388 (!isS(T) && isMat(Q,
double)) ||
391 (isV(T) && isSc(Q,
double)) ||
392 (isMat(T,
double) && isSc(Q,
double)),
Expanded<T> >::type
393 operator*(
const Q& z)
const {
394 std::vector<std::vector<T> > res;
395 for (
int i1 = 0; i1 < n1; i1++) {
396 res.push_back(std::vector<T>(n2.at(i1), Zero()));
397 for (
int i2 = 0; i2 < n2.at(i1); i2++)
398 res[i1][i2] = data[i1][i2] * z;
406 typename std::enable_if<
409 std::vector<std::vector<double> > res;
410 for (
int i1 = 0; i1 < n1; i1++) {
411 res.push_back(std::vector<double>(n2.at(i1), 0.));
412 for (
int i2 = 0; i2 < n2.at(i1); i2++)
413 res[i1][i2] = data[i1][i2] * z;
421 typename std::enable_if<
422 (isSc(T,
double) && isSc(Q,
complex)) ||
423 (isV(T) && isV(Q) && !(isVec(T,
double) && isVec(Q,
double))),
Expanded<complex> >::type
425 std::vector<std::vector<complex> > res;
426 for (
int i1 = 0; i1 < n1; i1++) {
427 res.push_back(std::vector<complex>(n2.at(i1), 0.));
428 for (
int i2 = 0; i2 < n2.at(i1); i2++)
429 res[i1][i2] = data[i1][i2] * z;
436 typename std::enable_if<
438 operator*(
const Q& z)
const {
439 std::vector<std::vector<vector<double> > > res;
440 for (
int i1 = 0; i1 < n1; i1++) {
442 for (
int i2 = 0; i2 < n2.at(i1); i2++)
443 res[i1][i2] = data[i1][i2] * z;
452 typename std::enable_if<
453 (isVec(Q,
complex) && (isS(T) || isM(T))) ||
456 std::vector<std::vector<vector<complex> > > res;
457 for (
int i1 = 0; i1 < n1; i1++) {
459 for (
int i2 = 0; i2 < n2.at(i1); i2++)
460 res[i1][i2] = data[i1][i2] * z;
466 typename std::enable_if<
468 operator*(
const Q& z)
const {
469 std::vector<std::vector<vector<complex> > > res;
470 for (
int i1 = 0; i1 < n1; i1++) {
472 for (
int i2 = 0; i2 < n2.at(i1); i2++)
473 res[i1][i2] = data[i1][i2] * z;
481 typename std::enable_if<
483 operator*(
const Q& z)
const {
484 std::vector<std::vector<matrix<double> > > res;
485 for (
int i1 = 0; i1 < n1; i1++) {
487 for (
int i2 = 0; i2 < n2.at(i1); i2++)
488 res[i1][i2] = data[i1][i2] * z;
496 typename std::enable_if<
497 (isS(T) && isMat(Q,
complex)) ||
498 (isSc(T,
complex) && isMat(Q,
double)) ||
500 operator*(
const Q& z)
const {
501 std::vector<std::vector<matrix<complex> > > res;
502 for (
int i1 = 0; i1 < n1; i1++) {
504 for (
int i2 = 0; i2 < n2.at(i1); i2++)
505 res[i1][i2] = data[i1][i2] * z;
511 typename std::enable_if<
514 std::vector<std::vector<matrix<complex> > > res;
515 for (
int i1 = 0; i1 < n1; i1++) {
517 for (
int i2 = 0; i2 < n2.at(i1); i2++)
518 res[i1][i2] = data[i1][i2] * z;
529 std::vector<std::vector<T> > res;
530 for (
int i1 = 0; i1 < n1; i1++) {
531 res.push_back(std::vector<T>(n2.at(i1), Zero()));
532 for (
int i2 = 0; i2 < n2.at(i1); i2++)
533 res[i1][i2] = data[i1][i2] / z;
541 std::vector<std::vector<T> > res;
542 for (
int i1 = 0; i1 < n1; i1++) {
543 res.push_back(std::vector<T>(n2.at(i1), Zero()));
544 for (
int i2 = 0; i2 < n2.at(i1); i2++)
545 res[i1][i2] = data[i1][i2] / z;
553 std::vector<std::vector<complex> > res;
554 for (
int i1 = 0; i1 < n1; i1++) {
555 res.push_back(std::vector<complex>(n2.at(i1), 0.));
556 for (
int i2 = 0; i2 < n2.at(i1); i2++)
557 res[i1][i2] = data[i1][i2] / z;
565 std::vector<std::vector<vector<complex> > > res;
566 for (
int i1 = 0; i1 < n1; i1++) {
568 for (
int i2 = 0; i2 < n2.at(i1); i2++)
569 res[i1][i2] = data[i1][i2] / z;
577 std::vector<std::vector<matrix<complex> > > res;
578 for (
int i1 = 0; i1 < n1; i1++) {
580 for (
int i2 = 0; i2 < n2.at(i1); i2++)
581 res[i1][i2] = data[i1][i2] / z;
625 if (n1max < minord1 || n1max >= minord1 + n1)
626 throw std::runtime_error(
"Expanded::truncate(): order of the outer expansion not present in Expanded");
627 std::vector<std::vector<T> > res;
628 for (
int i1 = 0; i1 <= n1max - minord1; i1++) {
630 if (n2max.at(i1) >= minord2 + n2.at(i1))
631 throw std::runtime_error(
"Expanded::truncate(): order of the inner expansion not present in Expanded");
632 for (
int j1 = 0; j1 <= n2max.at(i1) - minord2; j1++)
633 tmp.push_back(data[i1][j1]);
644 if(n1 >= 1 || minord1 > 0)
645 throw std::runtime_error(
"Expanded::truncate(): wrong method, please use truncate(std::vector<int>, int)");
646 return truncate(std::vector<int>(1, n2max), 0);
657 T
Series(std::vector<int> ord2,
int ord1,
double als2 = 1.,
double als1 = 1.) {
661 for (
int i = 0; i <= std::min(n1, ord1 - minord1); i++)
663 if (ord2.at(i) >= minord2)
664 for (
int j = 0; j <= std::min(ord2.at(i) - minord2, n2.at(i)); j++)
665 res += data[i][j] *
pow(als1, (
double) (minord1 + i)) *
pow(als2, (
double) (minord2 + j));
678 return Series(std::vector<int> (1, ord2), 0, als2);
695 return getOrd(j, minord1);
705 checkOrd(j, i,
"Expanded::getOrd(): order non present in Expanded");
706 return data[i - minord1][j - minord2];
714 setOrd(j, minord1, value);
723 checkOrd(j, i,
"Expanded::setOrd(): order non present in Expanded");
724 data[i - minord1][j - minord2] = value;
728 if (i < minord1 || i >= minord1 + n1 || j < minord2 || j >= minord2 + n2.at(i - minord1))
729 throw std::runtime_error(s);
740 template <
class Q>
typename std::enable_if<isMat(T, Q),
void>::type
742 checkOrd(j, i,
"Expanded::setMatrixElement(): order non present in Expanded");
743 data[i - minord1][j - minord2].assign(h, k, x);
752 template <
class Q>
typename std::enable_if<isMat(T, Q),
void>::type
754 setMatrixElement(j, minord1, h, k, x);
764 template <
class Q>
typename std::enable_if<isVec(T, Q),
void>::type
766 checkOrd(j, i,
"Expanded::setVectorElement(): order non present in Expanded");
769 data[i - minord1][j - minord2](h) = x;
778 template <
class Q>
typename std::enable_if<isVec(T, Q),
void>::type
780 setVectorElement(j, minord1, h, x);
812 const std::vector<int>&
getN2()
const {
817 for (
int i = 0; i < z.
getN1(); i++)
818 for (
int j = 0; j < z.
getN2().at(i); j++) {
820 if (i != (z.
getN1() - 1) || j != (z.
getN2().at(i) - 1))
833 throw std::runtime_error(
"Expanded::invCoeff: method not implemented");
836 int minord1, minord2,
n1;
838 std::vector<std::vector<T> >
data;
847 typename std::enable_if<
856 typename std::enable_if<
864 template <
class T,
class Q>
865 typename std::enable_if<
866 isV(T) && isV(Q) && !(isVec(T,
double) && isVec(Q,
double)),
Expanded<complex> >::type
873 template <
class T,
class Q>
874 typename std::enable_if<
882 template <
class T,
class Q>
883 typename std::enable_if<
891 template <
class T,
class Q>
892 typename std::enable_if<
895 return ((ex.
transpose() * ue.transpose()).transpose());
900 typename std::enable_if<