#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <iterator>
void errPropag6_orig(double G[21], const double F[6][6], int nF);
void errPropag6_trasat(double G[21], const double F[6][6], int nF);
void print(const double (&G)[21], const double (&F)[6][6]);
void print(const double (&G)[21], const double (&G1)[21], const double (&G2)[21]);
double my_rand(const double min, const double max);
int main(int argc, char **argv)
{
double myG[21] = {};
double myF[6][6] = {};
srand(1);
// Generate input for the functions
for (int i = 0; i < 21; i++)
myG[i] = my_rand(-0.5, 0.5);
for (int i=0; i<6; i++)
for (int j=0; j<6; j++)
myF[i][j] = my_rand(-0.5, 0.5);
std::cout << "\n" << "input:\n";
print(myG, myF);
double myG_orig[21];
std::copy( std::begin(myG), std::end(myG), std::begin(myG_orig) );
errPropag6_orig(myG_orig, myF, 6);
double myG_trasat[21];
std::copy( std::begin(myG), std::end(myG), std::begin(myG_trasat) );
errPropag6_trasat(myG_trasat, myF, 6);
std::cout << "\n" << "output:\n";
print(myG, myG_orig, myG_trasat);
return EXIT_SUCCESS;
}
static const int idx66[6][6] =
{{ 0, 1, 3, 6,10,15},
{ 1, 2, 4, 7,11,16},
{ 3, 4, 5, 8,12,17},
{ 6, 7, 8, 9,13,18},
{10,11,12,13,14,19},
{15,16,17,18,19,20}};
void errPropag6_orig(double G[21], const double F[6][6], int nF)
{
enum {NP=6,NE=21};
double g[NE]; memcpy(g, G,sizeof( g));
double fg[NP][NP]; memset(fg[0],0,sizeof(fg));
//double myF[6][6]; memcpy(myF[0],F[0],sizeof(fg));
//for (int i=0;i<NP;i++) {myF[i][i]+=1.;}
for (int i=0;i<nF;i++) {
for (int j=0;j<nF;j++) {
if (!F[i][j]) continue;
for (int k=0;k<NP;k++) {
int jk = idx66[j][k];
if (!g[jk]) continue;
fg[i][k] += F[i][j]*g[jk];
}}}
for (int i=0;i<NP;i++) {
for (int k=i;k<NP;k++) {
int ik = idx66[i][k];
double s = 0;
for (int j=0;j<NP;j++) {
if (!F[k][j]) continue;
s += fg[i][j]*F[k][j];
}
G[ik] += (s + fg[i][k] + fg[k][i]);
}}
}
inline double* vzero(double *a, int n1)
{
//to be documented
if (n1 <= 0) return 0;
return (double *)memset(a,0,n1*sizeof(double));
}
#define TCL_TRASAT(a, s, r__, m, n) \
int imax, k; \
int ia, mn, ir, is, iaa; \
double sum; \
--r__; --s; --a; \
imax = (m * m + m) / 2; \
vzero(&r__[1], imax); \
mn = m * n; \
int ind = 0; \
int i__ = 0; \
do { \
ind += i__; \
ia = 0; ir = 0; \
do { \
is = ind; \
sum = 0.; k = 0; \
do { \
if (k > i__) is += k; \
else ++is; \
++ia; \
sum += s[is] * a[ia]; \
++k; \
} while (k < n); \
iaa = i__ + 1; \
do { \
++ir; \
r__[ir] += sum * a[iaa];\
iaa += n; \
} while (iaa <= ia); \
} while (ia < mn); \
++i__; \
} while (i__ < n); \
++r__;
double* trasat(const double *a, const double *s, double *r__, int m, int n)
{
TCL_TRASAT(a, s, r__, m, n)
return r__;
} /* trasat_ */
void errPropag6_trasat(double G[21], const double F[6][6], int nF)
{
double r[21] = {};
trasat(&F[0][0], G, r, nF, nF);
std::memcpy(G, r, sizeof(double)*21);
}
void print(const double (&G)[21], const double (&F)[6][6])
{
std::cout << "G: ";
std::copy(G, G + 21, std::ostream_iterator<double>(std::cout, ", "));
std::cout << "\n";
std::cout << "F: ";
std::copy(&F[0][0], &F[0][0] + 36, std::ostream_iterator<double>(std::cout, ", "));
std::cout << "\n";
}
void print(const double (&G)[21], const double (&G1)[21], const double (&G2)[21])
{
std::cout << std::fixed << std::setprecision(6) << std::right;
std::cout << std::setw(17) << "index"
<< std::setw(17) << "G in"
<< std::setw(17) << "G out: orig"
<< std::setw(17) << "G out: trasat" << "\n";
for (int i = 0; i < 21; i++)
{
std::cout << std::setw(17) << i
<< std::setw(17) << G[i]
<< std::setw(17) << G1[i]
<< std::setw(17) << G2[i] << "\n";
}
}
double my_rand(const double min, const double max)
{
return ( std::rand()/(static_cast<double>(RAND_MAX)+1) ) * (max-min) + min;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CgoKdm9pZCBlcnJQcm9wYWc2X29yaWcoZG91YmxlIEdbMjFdLCBjb25zdCBkb3VibGUgRls2XVs2XSwgaW50IG5GKTsKdm9pZCBlcnJQcm9wYWc2X3RyYXNhdChkb3VibGUgR1syMV0sIGNvbnN0IGRvdWJsZSBGWzZdWzZdLCBpbnQgbkYpOwoKdm9pZCBwcmludChjb25zdCBkb3VibGUgKCZHKVsyMV0sIGNvbnN0IGRvdWJsZSAoJkYpWzZdWzZdKTsKdm9pZCBwcmludChjb25zdCBkb3VibGUgKCZHKVsyMV0sIGNvbnN0IGRvdWJsZSAoJkcxKVsyMV0sIGNvbnN0IGRvdWJsZSAoJkcyKVsyMV0pOwpkb3VibGUgbXlfcmFuZChjb25zdCBkb3VibGUgbWluLCBjb25zdCBkb3VibGUgbWF4KTsKCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgIGRvdWJsZSBteUdbMjFdID0ge307CiAgIGRvdWJsZSBteUZbNl1bNl0gPSB7fTsKCiAgIHNyYW5kKDEpOwoKICAgLy8gR2VuZXJhdGUgaW5wdXQgZm9yIHRoZSBmdW5jdGlvbnMKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMTsgaSsrKQogICAgICBteUdbaV0gPSBteV9yYW5kKC0wLjUsIDAuNSk7CgogICBmb3IgKGludCBpPTA7IGk8NjsgaSsrKQogICAgICBmb3IgKGludCBqPTA7IGo8NjsgaisrKQogICAgICAgICBteUZbaV1bal0gPSBteV9yYW5kKC0wLjUsIDAuNSk7CgogICBzdGQ6OmNvdXQgPDwgIlxuIiA8PCAiaW5wdXQ6XG4iOwogICBwcmludChteUcsIG15Rik7CgogICBkb3VibGUgbXlHX29yaWdbMjFdOwogICBzdGQ6OmNvcHkoIHN0ZDo6YmVnaW4obXlHKSwgc3RkOjplbmQobXlHKSwgc3RkOjpiZWdpbihteUdfb3JpZykgKTsKCiAgIGVyclByb3BhZzZfb3JpZyhteUdfb3JpZywgbXlGLCA2KTsKCiAgIGRvdWJsZSBteUdfdHJhc2F0WzIxXTsKICAgc3RkOjpjb3B5KCBzdGQ6OmJlZ2luKG15RyksIHN0ZDo6ZW5kKG15RyksIHN0ZDo6YmVnaW4obXlHX3RyYXNhdCkgKTsKCiAgIGVyclByb3BhZzZfdHJhc2F0KG15R190cmFzYXQsIG15RiwgNik7CgogICBzdGQ6OmNvdXQgPDwgIlxuIiA8PCAib3V0cHV0OlxuIjsKCiAgIHByaW50KG15RywgbXlHX29yaWcsIG15R190cmFzYXQpOwoKICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQoKCgpzdGF0aWMgY29uc3QgaW50IGlkeDY2WzZdWzZdID0KICB7eyAwLCAxLCAzLCA2LDEwLDE1fSwKICAgeyAxLCAyLCA0LCA3LDExLDE2fSwKICAgeyAzLCA0LCA1LCA4LDEyLDE3fSwKICAgeyA2LCA3LCA4LCA5LDEzLDE4fSwKICAgezEwLDExLDEyLDEzLDE0LDE5fSwKICAgezE1LDE2LDE3LDE4LDE5LDIwfX07CgoKCnZvaWQgZXJyUHJvcGFnNl9vcmlnKGRvdWJsZSBHWzIxXSwgY29uc3QgZG91YmxlIEZbNl1bNl0sIGludCBuRikKewogIGVudW0ge05QPTYsTkU9MjF9OwoKICBkb3VibGUgZ1tORV07ICAgICAgbWVtY3B5KGcsICAgIEcsc2l6ZW9mKCBnKSk7CiAgZG91YmxlIGZnW05QXVtOUF07IG1lbXNldChmZ1swXSwwLHNpemVvZihmZykpOwoKICAvL2RvdWJsZSBteUZbNl1bNl07ICBtZW1jcHkobXlGWzBdLEZbMF0sc2l6ZW9mKGZnKSk7CiAgLy9mb3IgKGludCBpPTA7aTxOUDtpKyspIHtteUZbaV1baV0rPTEuO30KCiAgZm9yIChpbnQgaT0wO2k8bkY7aSsrKSB7CiAgZm9yIChpbnQgaj0wO2o8bkY7aisrKSB7CiAgICBpZiAoIUZbaV1bal0pICAgIGNvbnRpbnVlOwogICAgZm9yIChpbnQgaz0wO2s8TlA7aysrKSB7CiAgICAgIGludCBqayA9IGlkeDY2W2pdW2tdOwogICAgICBpZiAoIWdbamtdKSBjb250aW51ZTsKICAgICAgZmdbaV1ba10gKz0gRltpXVtqXSpnW2prXTsKICB9fX0KCiAgZm9yIChpbnQgaT0wO2k8TlA7aSsrKSB7CiAgZm9yIChpbnQgaz1pO2s8TlA7aysrKSB7CiAgICBpbnQgaWsgPSBpZHg2NltpXVtrXTsKICAgIGRvdWJsZSBzID0gMDsKICAgIGZvciAoaW50IGo9MDtqPE5QO2orKykgewogICAgICBpZiAoIUZba11bal0pICBjb250aW51ZTsKICAgICAgcyArPSBmZ1tpXVtqXSpGW2tdW2pdOwogICAgfQogICAgR1tpa10gKz0gKHMgKyBmZ1tpXVtrXSArIGZnW2tdW2ldKTsKICB9fQoKfQoKCgppbmxpbmUgZG91YmxlKiB2emVybyhkb3VibGUgKmEsIGludCBuMSkKewogICAvL3RvIGJlIGRvY3VtZW50ZWQKICAgaWYgKG4xIDw9IDApIHJldHVybiAwOwogICByZXR1cm4gKGRvdWJsZSAqKW1lbXNldChhLDAsbjEqc2l6ZW9mKGRvdWJsZSkpOwp9CgoKCiNkZWZpbmUgVENMX1RSQVNBVChhLCBzLCByX18sIG0sIG4pIFwKICAgaW50IGltYXgsICBrOyAgICAgICAgICAgICAgICAgICAgXAogICBpbnQgaWEsIG1uLCBpciwgaXMsIGlhYTsgICAgICAgICBcCiAgIGRvdWJsZSBzdW07ICAgICAgICAgICAgICAgICAgICAgIFwKICAgLS1yX187ICAgIC0tczsgICAgLS1hOyAgICAgICAgICAgXAogICBpbWF4ID0gKG0gKiBtICsgbSkgLyAyOyAgICAgICAgICBcCiAgIHZ6ZXJvKCZyX19bMV0sIGltYXgpOyAgICAgICAgICAgIFwKICAgbW4gPSBtICogbjsgICAgICAgICAgICAgICAgICAgICAgXAogICBpbnQgaW5kID0gMDsgICAgICAgICAgICAgICAgICAgICBcCiAgIGludCBpX18gPSAwOyAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBpbmQgKz0gaV9fOyAgICAgICAgICAgICAgICAgICBcCiAgICAgIGlhID0gMDsgaXIgPSAwOyAgICAgICAgICAgICAgIFwKICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpcyA9IGluZDsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN1bSA9IDAuOyAgIGsgPSAwOyAgICAgICAgIFwKICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZiAoayA+IGlfXykgaXMgKz0gazsgICBcCiAgICAgICAgICAgIGVsc2UgICAgICAgICArK2lzOyAgICAgIFwKICAgICAgICAgICAgKytpYTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzdW0gKz0gc1tpc10gKiBhW2lhXTsgICBcCiAgICAgICAgICAgICsrazsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSB3aGlsZSAoayA8IG4pOyAgICAgICAgICAgXAogICAgICAgICBpYWEgPSBpX18gKyAxOyAgICAgICAgICAgICBcCiAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgKytpcjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICByX19baXJdICs9IHN1bSAqIGFbaWFhXTtcCiAgICAgICAgICAgIGlhYSArPSBuOyAgICAgICAgICAgICAgIFwKICAgICAgICAgfSB3aGlsZSAoaWFhIDw9IGlhKTsgICAgICAgXAogICAgICB9IHdoaWxlIChpYSA8IG1uKTsgICAgICAgICAgICBcCiAgICAgICsraV9fOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfSB3aGlsZSAoaV9fIDwgbik7ICAgICAgICAgICAgICAgXAogICArK3JfXzsKCgoKZG91YmxlKiB0cmFzYXQoY29uc3QgZG91YmxlICphLCBjb25zdCBkb3VibGUgKnMsIGRvdWJsZSAqcl9fLCBpbnQgbSwgaW50IG4pCnsKICAgVENMX1RSQVNBVChhLCBzLCByX18sIG0sIG4pCiAgIHJldHVybiByX187Cn0gLyogdHJhc2F0XyAqLwoKCgp2b2lkIGVyclByb3BhZzZfdHJhc2F0KGRvdWJsZSBHWzIxXSwgY29uc3QgZG91YmxlIEZbNl1bNl0sIGludCBuRikKewogIGRvdWJsZSByWzIxXSA9IHt9OwoKICB0cmFzYXQoJkZbMF1bMF0sIEcsIHIsIG5GLCBuRik7CgogIHN0ZDo6bWVtY3B5KEcsIHIsIHNpemVvZihkb3VibGUpKjIxKTsKfQoKCgp2b2lkIHByaW50KGNvbnN0IGRvdWJsZSAoJkcpWzIxXSwgY29uc3QgZG91YmxlICgmRilbNl1bNl0pCnsKICAgc3RkOjpjb3V0IDw8ICJHOiAiOwogICBzdGQ6OmNvcHkoRywgRyArIDIxLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8ZG91YmxlPihzdGQ6OmNvdXQsICIsICIpKTsKICAgc3RkOjpjb3V0IDw8ICJcbiI7CgogICBzdGQ6OmNvdXQgPDwgIkY6ICI7CiAgIHN0ZDo6Y29weSgmRlswXVswXSwgJkZbMF1bMF0gKyAzNiwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGRvdWJsZT4oc3RkOjpjb3V0LCAiLCAiKSk7CiAgIHN0ZDo6Y291dCA8PCAiXG4iOwp9CgoKCnZvaWQgcHJpbnQoY29uc3QgZG91YmxlICgmRylbMjFdLCBjb25zdCBkb3VibGUgKCZHMSlbMjFdLCBjb25zdCBkb3VibGUgKCZHMilbMjFdKQp7CiAgIHN0ZDo6Y291dCA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDYpIDw8IHN0ZDo6cmlnaHQ7CgogICBzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KDE3KSA8PCAiaW5kZXgiCiAgICAgICAgICAgICA8PCBzdGQ6OnNldHcoMTcpIDw8ICJHIGluIgogICAgICAgICAgICAgPDwgc3RkOjpzZXR3KDE3KSA8PCAiRyBvdXQ6IG9yaWciCiAgICAgICAgICAgICA8PCBzdGQ6OnNldHcoMTcpIDw8ICJHIG91dDogdHJhc2F0IiA8PCAiXG4iOwoKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMTsgaSsrKQogICB7CiAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMTcpIDw8IGkKICAgICAgICAgICAgICAgIDw8IHN0ZDo6c2V0dygxNykgPDwgR1tpXQogICAgICAgICAgICAgICAgPDwgc3RkOjpzZXR3KDE3KSA8PCBHMVtpXQogICAgICAgICAgICAgICAgPDwgc3RkOjpzZXR3KDE3KSA8PCBHMltpXSA8PCAiXG4iOwogICB9Cn0KCgoKZG91YmxlIG15X3JhbmQoY29uc3QgZG91YmxlIG1pbiwgY29uc3QgZG91YmxlIG1heCkKewogICByZXR1cm4gKCBzdGQ6OnJhbmQoKS8oc3RhdGljX2Nhc3Q8ZG91YmxlPihSQU5EX01BWCkrMSkgKSAqIChtYXgtbWluKSArIG1pbjsKfQ==
input:
G: 0.340188, -0.105617, 0.283099, 0.29844, 0.411647, -0.302449, -0.164777, 0.26823, -0.222225, 0.05397, -0.0226029, 0.128871, -0.135216, 0.0134009, 0.45223, 0.416195, 0.135712, 0.217297, -0.358397, 0.106969, -0.483699,
F: -0.257113, -0.362768, 0.304177, -0.343321, -0.0990556, -0.37021, -0.391191, 0.498925, -0.281743, 0.0129324, 0.339112, 0.11264, -0.203968, 0.137552, 0.0242872, -0.00641701, 0.472775, -0.207483, 0.271358, 0.026745, 0.269914, -0.0997714, 0.391529, -0.216685, -0.147542, 0.307725, 0.419026, -0.430245, 0.449327, 0.0259953, -0.413944, -0.307786, 0.163227, 0.390233, -0.151107, -0.435829,
output:
index G in G out: orig G out: trasat
0 0.340188 0.136731 -0.096171
1 -0.105617 -0.423876 0.019940
2 0.283099 0.731080 0.189901
3 0.298440 -0.316686 -0.133656
4 0.411647 0.898230 0.235458
5 -0.302449 -0.415051 0.125760
6 -0.164777 -0.297413 -0.210375
7 0.268230 0.683651 0.105343
8 -0.222225 -0.172629 -0.028366
9 0.053970 -0.009385 -0.023355
10 -0.022603 -0.301134 -0.221384
11 0.128871 0.786228 0.159324
12 -0.135216 0.112981 0.041210
13 0.013401 0.167580 0.053599
14 0.452230 0.971194 0.145870
15 0.416195 0.254238 -0.061458
16 0.135712 0.211789 0.205417
17 0.217297 -0.145527 0.005487
18 -0.358397 -0.130097 -0.253982
19 0.106969 -0.056839 -0.262800
20 -0.483699 -0.569772 0.161517