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; } }
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; } }
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; } } }
public static bool save_matrix <T>(idx <T> m, FILE fp) where T : struct { int v; v = get_magic <T>(); if (fp.fwrite(v) != 1) { return(false); } v = m.order(); if (fp.fwrite(v) != 1) { return(false); } for (int i = 0; (i < m.order()) || (i < 3); ++i) { if (i < m.order()) { v = m.dim(i); } else { v = 1; } if (fp.fwrite(v) != 1) { return(false); } } loops.idx_aloop1(m, (i) => fp.fwrite(i.item)); return(true); }
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; }
/* 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; } }