Beispiel #1
0
        public static void idx_m2squdotm2acc(idx <T> i1, idx <T> i2, idx <T> o)
        {
            loops.idx_checkorder3(i1, 2, i2, 2, o, 0);
#warning   idx_checkdim2(i1, 0, i2.dim(0), i1, 1, i2.dim(1));

            intg     imax = i1.dim(0), jmax = i2.dim(1);
            intg     c1_m0 = i1.mod(0), c2_m0 = i2.mod(0);
            intg     c1_m1 = i1.mod(1), c2_m1 = i2.mod(1);
            eptr <T> c1_0, c2_0, d1, c1, c2;

            c1_0 = i1.idx_ptr();
            c2_0 = i2.idx_ptr();
            d1   = o.idx_ptr();

            c1 = c1_0;
            c2 = c2_0;
            T f = d1.item;
            for (int i = 0; i < imax; ++i)
            {
                c1.index = c1_0.index;
                c2.index = c2_0.index;
                for (int j = 0; j < jmax; ++j)
                {
                    T ff = Dot(Dot(c1.item, c1.item), c2.item);
                    f         = Add <T>(ff, f);
                    c1.index += c1_m1;
                    c2.index += c2_m1;
                }
                c1_0.index += c1_m0;
                c2_0.index += c2_m0;
            }
            d1.item = f;
        }
Beispiel #2
0
        public static void idx_m1extm1(idx <T> i1, idx <T> i2, idx <T> o1)
        {
            eptr <T> c2, d1, c1, c2_0, d1_0;
            intg     c2_m0 = i2.mod(0), d1_m1 = o1.mod(1);
            intg     c1_m0 = i1.mod(0), d1_m0 = o1.mod(0);
            intg     j, jmax = o1.dim(1);
            intg     i, imax = o1.dim(0);

            c1   = i1.idx_ptr();
            c2_0 = i2.idx_ptr();
            d1_0 = o1.idx_ptr();
            for (i = 0; i < imax; i++)
            {
                d1 = d1_0;
                c2 = c2_0;
                for (j = 0; j < jmax; j++)
                {
                    d1.item   = Dot(c1.item, c2.item);
                    d1.index += d1_m1;
                    c2.index += c2_m0;
                }
                d1_0.index += d1_m0;
                c1.index   += c1_m0;
            }
        }
Beispiel #3
0
        /* multiply M2 by M1, result in M1 */
        /* matrix - vector product */
        public static void idx_m2dotm1(idx <T> i1, idx <T> i2, idx <T> o1)
        {
            eptr <T> c1, c2, c1_0, ker;

            intg     c1_m1 = i1.mod(1), c2_m0 = i2.mod(0);
            intg     jmax = i2.dim(0);
            intg     c1_m0 = i1.mod(0), d1_m0 = o1.mod(0);
            eptr <T> d1;
            T        f;
            intg     imax = o1.dim(0);

            c1_0 = i1.idx_ptr();
            ker  = i2.idx_ptr();
            d1   = o1.idx_ptr();

            c1 = i1.idx_ptr();
            c2 = i2.idx_ptr();
            for (int ii = 0; ii < imax; ii++)
            {
                f        = default(T);
                c1.index = c1_0.index;
                c2.index = ker.index;
                if (c1_m1 == 1 && c2_m0 == 1)
                {
                    for (int j = 0; j < jmax; j++)
                    {
                        f = Add <T>(f, Dot(c1.item, c2.item));
                        //f += (c1.item) * (c2.item);
                        c1++; c2++;
                    }
                }
                else
                {
                    for (int j = 0; j < jmax; j++)
                    {
                        f = Add <T>(f, Dot(c1.item, c2.item));
                        // f += (c1.item) * (c2.item);
                        c1.index += c1_m1;
                        c2.index += c2_m0;
                    }
                }
                d1.item     = f;
                d1.index   += d1_m0;
                c1_0.index += c1_m0; //+ c1_0.index;
            }
        }
Beispiel #4
0
        public static void idx_m4dotm2(idx <T> i1, idx <T> i2, idx <T> o1)
        {
            loops.idx_checkorder3(i1, 4, i2, 2, o1, 2); // check for compatible orders
            if ((i1.dim(0) != o1.dim(0)) || (i1.dim(1) != o1.dim(1)) ||
                (i1.dim(2) != i2.dim(0)) || (i1.dim(3) != i2.dim(1)))
            {
                loops.idx_compatibility_error3(i1, i2, o1, "incompatible dimensions");
            }
            eptr <T> c1, c1_2;
            eptr <T> c2, c2_0;
            eptr <T> c1_0, c1_1;
            eptr <T> ker;
            intg     c1_m2 = (i1).mod(2), c2_m0 = (i2).mod(0);
            intg     c1_m3 = (i1).mod(3), c2_m1 = (i2).mod(1);
            intg     k, l, kmax = (i2).dim(0), lmax = (i2).dim(1);
            eptr <T> d1_0, d1;
            T        f;
            intg     c1_m0 = (i1).mod(0), d1_m0 = (o1).mod(0);
            intg     c1_m1 = (i1).mod(1), d1_m1 = (o1).mod(1);
            intg     i, j, imax = (o1).dim(0), jmax = (o1).dim(1);

            c1_0 = i1.idx_ptr();
            ker  = i2.idx_ptr();
            d1_0 = o1.idx_ptr();
            c1_1 = c1_0;
            d1   = d1_0;
            c1_2 = c1_1;
            c2_0 = ker;
            for (i = 0; i < imax; i++)
            {
                c1_1.index = c1_0.index;
                d1.index   = d1_0.index;
                for (j = 0; j < jmax; j++)
                {
                    f          = default(T);
                    c1_2.index = c1_1.index;
                    c2_0.index = ker.index;
                    for (k = 0; k < kmax; k++)
                    {
                        c1 = c1_2;
                        c2 = c2_0;
                        for (l = 0; l < lmax; l++)
                        {
                            f         = Add(Dot(c1.item, c2.item), f);
                            c1.index += c1_m3;
                            c2.index += c2_m1;
                        }
                        c1_2.index += c1_m2;
                        c2_0.index += c2_m0;
                    }
                    d1.item     = f;
                    d1.index   += d1_m1;
                    c1_1.index += c1_m1;
                }
                d1_0.index += d1_m0;
                c1_0.index += c1_m0;
            }
        }
Beispiel #5
0
        public static void idx_m2dotm2(idx <T> i1, idx <T> i2, idx <T> o)
        {
            eptr <T> c1, c2, c1_0, ker;
            intg     c1_m1 = i1.mod(1), c2_m0 = i2.mod(0);
            intg     j, jmax = i2.dim(0);
            intg     c1_m0 = i1.mod(0), d1_m0 = o.mod(0);
            eptr <T> d1;
            T        f;
            intg     i, imax = o.dim(0);
            intg     k, kmax = o.dim(1);

            c1 = new eptr <T>(i1.srgptr);
            c2 = new eptr <T>(i2.srgptr);
            // loop on o.dim(1)
            for (k = 0; k < kmax; ++k)
            {
                c1_0 = i1.idx_ptr();
                d1   = o.idx_ptr(); d1.index += k;
                ker  = i2.idx_ptr(); ker.index += k;
                // loop on o.dim(0)
                for (i = 0; i < imax; i++)
                {
                    f        = default(T);
                    c1.index = c1_0.index;
                    c2.index = ker.index;
                    // loop on
                    if (c1_m1 == 1 && c2_m0 == 1)
                    {
                        for (j = 0; j < jmax; j++)
                        {
                            f = Add <T>(f, Dot(c1.item, c2.item));
                            c1++; c2++;
                        }
                    }
                    else
                    {
                        for (j = 0; j < jmax; j++)
                        {
                            f         = Add <T>(f, Dot(c1.item, c2.item));// (*c1) * (*c2);
                            c1.index += c1_m1;
                            c2.index += c2_m0;
                        }
                    }
                    d1.item     = f;
                    d1.index   += d1_m0;
                    c1_0.index += c1_m0;
                }
            }
        }
Beispiel #6
0
        public static void idx_m2extm2acc(idx <T> i1, idx <T> i2, idx <T> o1)
        {
            eptr <T> c2_0, c2_1;
            eptr <T> d1_2, d1_3;
            eptr <T> d1_0, d1_1;
            eptr <T> c1_0, c1_1;
            eptr <T> ker;
            intg     c2_m0 = (i2).mod(0), c2_m1 = (i2).mod(1);
            intg     d1_m2 = (o1).mod(2), d1_m3 = (o1).mod(3);
            intg     c1_m0 = (i1).mod(0), c1_m1 = (i1).mod(1);
            intg     d1_m0 = (o1).mod(0), d1_m1 = (o1).mod(1);
            intg     k, l, lmax = (o1).dim(3), kmax = (o1).dim(2);
            intg     i, j, imax = (o1).dim(0), jmax = (o1).dim(1);

            c1_0 = i1.idx_ptr();
            ker  = i2.idx_ptr();
            d1_0 = o1.idx_ptr();
            d1_2 = d1_0;
            c2_0 = ker;
            for (i = 0; i < imax; i++)
            {
                d1_1 = d1_0;
                c1_1 = c1_0;
                for (j = 0; j < jmax; j++)
                {
                    d1_2.index = d1_1.index;
                    c2_0.index = ker.index;
                    for (k = 0; k < kmax; k++)
                    {
                        d1_3 = d1_2;
                        c2_1 = c2_0;
                        for (l = 0; l < lmax; l++)
                        {
                            d1_3.item   = Add(Dot(c1_1.item, c2_1.item), d1_3.item);
                            d1_3.index += d1_m3;
                            c2_1.index += c2_m1;
                        }
                        d1_2.index += d1_m2;
                        c2_0.index += c2_m0;
                    }
                    d1_1.index += d1_m1;
                    c1_1.index += c1_m1;
                }
                d1_0.index += d1_m0;
                c1_0.index += c1_m0;
            }
        }