Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 925d05e241dbe3b9ea38e50d2b88728b > files > 106

m4ri-devel-20100817-1.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>M4RI: testsuite/test_multiplication.c</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">M4RI&#160;<span id="projectnumber">1.0.1</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<div class="title">testsuite/test_multiplication.c</div>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<span class="preprocessor">#include &quot;m4ri/m4ri.h&quot;</span>

<span class="keywordtype">int</span> mul_test_equality(<span class="keywordtype">int</span> m, <span class="keywordtype">int</span> l, <span class="keywordtype">int</span> n, <span class="keywordtype">int</span> k, <span class="keywordtype">int</span> cutoff) {
  <span class="keywordtype">int</span> ret  = 0;
  <a name="_a0"></a><a class="code" href="structmzd__t.html" title="Dense matrices over GF(2).">mzd_t</a> *A, *B, *C, *D, *E;
  
  printf(<span class="stringliteral">&quot;   mul: m: %4d, l: %4d, n: %4d, k: %2d, cutoff: %4d&quot;</span>,m,l,n,k,cutoff);

  <span class="comment">/* we create two random matrices */</span>
  A = <a name="a1"></a>mzd_init(m, l);
  B = mzd_init(l, n);
  <a name="a2"></a>mzd_randomize(A);
  mzd_randomize(B);

  <span class="comment">/* C = A*B via Strassen */</span>
  C = <a name="a3"></a>mzd_mul(NULL, A, B, cutoff);

  <span class="comment">/* D = A*B via M4RM, temporary buffers are managed internally */</span>
  D = <a name="a4"></a>mzd_mul_m4rm(    NULL, A, B, k);

  <span class="comment">/* E = A*B via naive cubic multiplication */</span>
  E = <a name="a5"></a>mzd_mul_naive(    NULL, A, B);

  <a name="a6"></a>mzd_free(A);
  mzd_free(B);

  <span class="keywordflow">if</span> (<a name="a7"></a>mzd_equal(C, D) != <a name="a8"></a><a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; Strassen != M4RM&quot;</span>);
    ret -=1;
  }

  <span class="keywordflow">if</span> (mzd_equal(D, E) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; M4RM != Naiv&quot;</span>);
    ret -= 1;
  }

  <span class="keywordflow">if</span> (mzd_equal(C, E) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; Strassen != Naiv&quot;</span>);
    ret -= 1;
  }

  mzd_free(C);
  mzd_free(D);
  mzd_free(E);

  <span class="keywordflow">if</span>(ret==0) {
    printf(<span class="stringliteral">&quot; ... passed\n&quot;</span>);
  } <span class="keywordflow">else</span> {
    printf(<span class="stringliteral">&quot; ... FAILED\n&quot;</span>);
  }

  <span class="keywordflow">return</span> ret;

}

<span class="keywordtype">int</span> sqr_test_equality(<span class="keywordtype">int</span> m, <span class="keywordtype">int</span> k, <span class="keywordtype">int</span> cutoff) {
  <span class="keywordtype">int</span> ret  = 0;
  <a class="code" href="structmzd__t.html" title="Dense matrices over GF(2).">mzd_t</a> *A, *C, *D, *E;
  
  printf(<span class="stringliteral">&quot;   sqr: m: %4d, k: %2d, cutoff: %4d&quot;</span>,m,k,cutoff);

  <span class="comment">/* we create one random matrix */</span>
  A = mzd_init(m, m);
  mzd_randomize(A);

  <span class="comment">/* C = A*A via Strassen */</span>
  C = mzd_mul(NULL, A, A, cutoff);

  <span class="comment">/* D = A*A via M4RM, temporary buffers are managed internally */</span>
  D = mzd_mul_m4rm(    NULL, A, A, k);

  <span class="comment">/* E = A*A via naive cubic multiplication */</span>
  E = mzd_mul_naive(    NULL, A, A);

  mzd_free(A);

  <span class="keywordflow">if</span> (mzd_equal(C, D) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; Strassen != M4RM&quot;</span>);
    ret -=1;
  }

  <span class="keywordflow">if</span> (mzd_equal(D, E) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; M4RM != Naiv&quot;</span>);
    ret -= 1;
  }

  <span class="keywordflow">if</span> (mzd_equal(C, E) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; Strassen != Naiv&quot;</span>);
    ret -= 1;
  }

  mzd_free(C);
  mzd_free(D);
  mzd_free(E);

  <span class="keywordflow">if</span>(ret==0) {
    printf(<span class="stringliteral">&quot; ... passed\n&quot;</span>);
  } <span class="keywordflow">else</span> {
    printf(<span class="stringliteral">&quot; ... FAILED\n&quot;</span>);
  }

  <span class="keywordflow">return</span> ret;
}

<span class="keywordtype">int</span> addmul_test_equality(<span class="keywordtype">int</span> m, <span class="keywordtype">int</span> l, <span class="keywordtype">int</span> n, <span class="keywordtype">int</span> k, <span class="keywordtype">int</span> cutoff) {
  <span class="keywordtype">int</span> ret  = 0;
  <a class="code" href="structmzd__t.html" title="Dense matrices over GF(2).">mzd_t</a> *A, *B, *C, *D, *E, *F;
  
  printf(<span class="stringliteral">&quot;addmul: m: %4d, l: %4d, n: %4d, k: %2d, cutoff: %4d&quot;</span>,m,l,n,k,cutoff);

  <span class="comment">/* we create two random matrices */</span>
  A = mzd_init(m, l);
  B = mzd_init(l, n);
  C = mzd_init(m, n);
  mzd_randomize(A);
  mzd_randomize(B);
  mzd_randomize(C);

  <span class="comment">/* D = C + A*B via M4RM, temporary buffers are managed internally */</span>
  D = <a name="a9"></a>mzd_copy(NULL, C);
  D = <a name="a10"></a>mzd_addmul_m4rm(D, A, B, k);

  <span class="comment">/* E = C + A*B via naiv cubic multiplication */</span>
  E = mzd_mul_m4rm(NULL, A, B, k);
  <a name="a11"></a>mzd_add(E, E, C);

  <span class="comment">/* F = C + A*B via naiv cubic multiplication */</span>
  F = mzd_copy(NULL, C);
  F = <a name="a12"></a>mzd_addmul(F, A, B, cutoff);

  mzd_free(A);
  mzd_free(B);
  mzd_free(C);

  <span class="keywordflow">if</span> (mzd_equal(D, E) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; M4RM != add,mul&quot;</span>);
    ret -=1;
  }
  <span class="keywordflow">if</span> (mzd_equal(E, F) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; add,mul = addmul&quot;</span>);
    ret -=1;
  }
  <span class="keywordflow">if</span> (mzd_equal(F, D) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; M4RM != addmul&quot;</span>);
    ret -=1;
  }

  <span class="keywordflow">if</span> (ret==0)
    printf(<span class="stringliteral">&quot; ... passed\n&quot;</span>);
  <span class="keywordflow">else</span>
    printf(<span class="stringliteral">&quot; ... FAILED\n&quot;</span>);


  mzd_free(D);
  mzd_free(E);
  mzd_free(F);
  <span class="keywordflow">return</span> ret;
}

<span class="keywordtype">int</span> addsqr_test_equality(<span class="keywordtype">int</span> m, <span class="keywordtype">int</span> k, <span class="keywordtype">int</span> cutoff) {
  <span class="keywordtype">int</span> ret  = 0;
  <a class="code" href="structmzd__t.html" title="Dense matrices over GF(2).">mzd_t</a> *A, *C, *D, *E, *F;
  
  printf(<span class="stringliteral">&quot;addsqr: m: %4d, k: %2d, cutoff: %4d&quot;</span>,m,k,cutoff);

  <span class="comment">/* we create two random matrices */</span>
  A = mzd_init(m, m);
  C = mzd_init(m, m);
  mzd_randomize(A);
  mzd_randomize(C);

  <span class="comment">/* D = C + A*B via M4RM, temporary buffers are managed internally */</span>
  D = mzd_copy(NULL, C);
  D = mzd_addmul_m4rm(D, A, A, k);

  <span class="comment">/* E = C + A*B via naive cubic multiplication */</span>
  E = mzd_mul_m4rm(NULL, A, A, k);
  mzd_add(E, E, C);

  <span class="comment">/* F = C + A*B via naive cubic multiplication */</span>
  F = mzd_copy(NULL, C);
  F = mzd_addmul(F, A, A, cutoff);

  mzd_free(A);
  mzd_free(C);

  <span class="keywordflow">if</span> (mzd_equal(D, E) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; M4RM != add,mul&quot;</span>);
    ret -=1;
  }
  <span class="keywordflow">if</span> (mzd_equal(E, F) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; add,mul = addmul&quot;</span>);
    ret -=1;
  }
  <span class="keywordflow">if</span> (mzd_equal(F, D) != <a class="code" href="misc_8h.html#aa8cecfc5c5c054d2875c03e77b7be15d" title="Pretty for 1.">TRUE</a>) {
    printf(<span class="stringliteral">&quot; M4RM != addmul&quot;</span>);
    ret -=1;
  }

  <span class="keywordflow">if</span> (ret==0)
    printf(<span class="stringliteral">&quot; ... passed\n&quot;</span>);
  <span class="keywordflow">else</span>
    printf(<span class="stringliteral">&quot; ... FAILED\n&quot;</span>);


  mzd_free(D);
  mzd_free(E);
  mzd_free(F);
  <span class="keywordflow">return</span> ret;
}

<span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {
  <span class="keywordtype">int</span> status = 0;
  
  status += mul_test_equality(1, 1, 1, 0, 1024);
  status += mul_test_equality(1, 128, 128, 0, 0);
  status += mul_test_equality(3, 131, 257, 0, 0);
  status += mul_test_equality(64, 64, 64, 0, 64);
  status += mul_test_equality(128, 128, 128, 0, 64);
  status += mul_test_equality(21, 171, 31, 0, 63); 
  status += mul_test_equality(21, 171, 31, 0, 131); 
  status += mul_test_equality(193, 65, 65, 10, 64);
  status += mul_test_equality(1025, 1025, 1025, 3, 256);
  status += mul_test_equality(2048, 2048, 4096, 0, 1024);
  status += mul_test_equality(4096, 3528, 4096, 0, 1024);
  status += mul_test_equality(1024, 1025, 1, 0, 1024);
  status += mul_test_equality(1000,1000,1000, 0, 256);
  status += mul_test_equality(1000,10,20, 0, 64);
  status += mul_test_equality(1710,1290,1000, 0, 256);
  status += mul_test_equality(1290, 1710, 200, 0, 64);
  status += mul_test_equality(1290, 1710, 2000, 0, 256);
  status += mul_test_equality(1290, 1290, 2000, 0, 64);
  status += mul_test_equality(1000, 210, 200, 0, 64);

  status += addmul_test_equality(1, 128, 128, 0, 0);
  status += addmul_test_equality(3, 131, 257, 0, 0);
  status += addmul_test_equality(64, 64, 64, 0, 64);
  status += addmul_test_equality(128, 128, 128, 0, 64);
  status += addmul_test_equality(21, 171, 31, 0, 63);
  status += addmul_test_equality(21, 171, 31, 0, 131);
  status += addmul_test_equality(193, 65, 65, 10, 64);
  status += addmul_test_equality(1025, 1025, 1025, 3, 256);
  status += addmul_test_equality(4096, 4096, 4096, 0, 2048);
  status += addmul_test_equality(1000,1000,1000, 0, 256);
  status += addmul_test_equality(1000,10,20, 0, 64);
  status += addmul_test_equality(1710,1290,1000, 0, 256);
  status += addmul_test_equality(1290, 1710, 200, 0, 64);
  status += addmul_test_equality(1290, 1710, 2000, 0, 256);
  status += addmul_test_equality(1290, 1290, 2000, 0, 64);
  status += addmul_test_equality(1000, 210, 200, 0, 64);

  status += sqr_test_equality(1, 0, 1024);
  status += sqr_test_equality(128, 0, 0);
  status += sqr_test_equality(131, 0, 0);
  status += sqr_test_equality(64,  0, 64);
  status += sqr_test_equality(128, 0, 64);
  status += sqr_test_equality(171, 0, 63); 
  status += sqr_test_equality(171, 0, 131); 
  status += sqr_test_equality(193, 10, 64);
  status += sqr_test_equality(1025, 3, 256);
  status += sqr_test_equality(2048, 0, 1024);
  status += sqr_test_equality(3528, 0, 1024);
  status += sqr_test_equality(1000, 0, 256);
  status += sqr_test_equality(1000, 0, 64);
  status += sqr_test_equality(1710, 0, 256);
  status += sqr_test_equality(1290, 0, 64);
  status += sqr_test_equality(2000, 0, 256);
  status += sqr_test_equality(2000, 0, 64);
  status += sqr_test_equality(210, 0, 64);

  status += addsqr_test_equality(1, 0, 0);
  status += addsqr_test_equality(131, 0, 0);
  status += addsqr_test_equality(64,  0, 64);
  status += addsqr_test_equality(128, 0, 64);
  status += addsqr_test_equality(171, 0, 63);
  status += addsqr_test_equality(171, 0, 131);
  status += addsqr_test_equality(193, 10, 64);
  status += addsqr_test_equality(1025, 3, 256);
  status += addsqr_test_equality(4096, 0, 2048);
  status += addsqr_test_equality(1000, 0, 256);
  status += addsqr_test_equality(1000, 0, 64);
  status += addsqr_test_equality(1710, 0, 256);
  status += addsqr_test_equality(1290, 0, 64);
  status += addsqr_test_equality(2000, 0, 256);
  status += addsqr_test_equality(2000, 0, 64);
  status += addsqr_test_equality(210, 0, 64);

  <span class="keywordflow">if</span> (status == 0) {
    printf(<span class="stringliteral">&quot;All tests passed.\n&quot;</span>);
    <span class="keywordflow">return</span> 0;
  } <span class="keywordflow">else</span> {
    <span class="keywordflow">return</span> -1;
  }
}
</pre></div> </div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Sat Apr 23 2011 for M4RI by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>