<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Vipin Vijayan's page</title>
    <description>Random notes.</description>
    <link>https://vijayan.net/posts/tags/julia</link>
      <item>
        <title>
          <![CDATA[PageRank in Julia]]>
        </title>
        <link>https://vijayan.net/posts/39</link>
        <description>
          <![CDATA[<p>Using iterators and the linear map data structure to implement
PageRank.</p>
<div class="sourceCode" id="cb1" data-language="Julia"><pre
class="sourceCode Julia"><code class="sourceCode julia"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> <span class="fu">pagerank</span>(A, alpha<span class="op">=</span><span class="fl">0.85</span>, p <span class="op">=</span> <span class="fu">fill</span>(<span class="fl">1</span><span class="op">/</span><span class="fu">size</span>(A,<span class="fl">2</span>),<span class="fu">size</span>(A,<span class="fl">2</span>));</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>                  details<span class="op">=</span><span class="cn">false</span>, args<span class="op">...</span>)</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    S <span class="op">=</span> <span class="fl">1.0</span> <span class="op">./</span> (A <span class="op">*</span> <span class="fu">ones</span>(<span class="dt">Float64</span>,<span class="fu">size</span>(A,<span class="fl">2</span>)))</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>    D <span class="op">=</span> <span class="fu">find</span>(isinf,S) <span class="co"># S[i] = Inf if node i has no outlinks</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>    S[D] <span class="op">=</span> <span class="fl">0.0</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>    p <span class="op">=</span> p<span class="op">./</span><span class="fu">norm</span>(p,<span class="fl">1</span>)</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>    L <span class="op">=</span> <span class="fu">LinearMap</span><span class="dt">{Float64}</span>((y,x) <span class="op">-&gt;</span> <span class="cf">begin</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>                           <span class="fu">At_mul_B!</span>(y, A, S <span class="op">.*</span> x)</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>                           y <span class="op">.=</span> alpha <span class="op">.*</span> y <span class="op">.+</span> (alpha <span class="op">*</span> <span class="fu">sum</span>(x[D]) <span class="op">+</span> <span class="fl">1.0</span> <span class="op">-</span> alpha) <span class="op">.*</span> p</span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a>                           y</span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a>                           <span class="cf">end</span>, <span class="fu">size</span>(A,<span class="fl">1</span>), <span class="fu">size</span>(A,<span class="fl">2</span>))</span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a>    x <span class="op">=</span> <span class="fu">copy</span>(p)</span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a>    res <span class="op">=</span> <span class="fu">powermethod!</span>(L, x; args<span class="op">...</span>)</span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> details x, res, L <span class="cf">else</span> x <span class="cf">end</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span></code></pre></div>
<div class="sourceCode" id="cb2" data-language="Julia"><pre
class="sourceCode Julia"><code class="sourceCode julia"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">function</span> <span class="fu">powermethod!</span>(A, x, Ax<span class="op">=</span><span class="fu">similar</span>(x);</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>                      maxiter<span class="op">=</span><span class="fl">15</span>, tol<span class="op">=</span><span class="fu">eps</span>(<span class="dt">Float64</span>) <span class="op">*</span> <span class="fu">size</span>(A,<span class="fl">2</span>),</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>                      log<span class="op">=</span><span class="cn">true</span>, verbose<span class="op">=</span><span class="cn">true</span>)</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a>    T <span class="op">=</span> <span class="fu">eltype</span>(A)</span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a>    x <span class="op">./=</span> <span class="fu">norm</span>(x,<span class="fl">1</span>)</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a>    verbose <span class="op">&amp;&amp;</span> <span class="fu">println</span>(<span class="st">&quot;Running power method, maxiter = </span><span class="sc">$</span>maxiter<span class="st">, tol = </span><span class="sc">$</span>tol<span class="st">&quot;</span>)</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a>    history <span class="op">=</span> <span class="dt">Tuple</span>{<span class="dt">Int</span>,T,T}[]</span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a>    iter <span class="op">=</span> <span class="fl">0</span></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a>    radius <span class="op">=</span> <span class="fu">zero</span>(T)</span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a>    err <span class="op">=</span> <span class="cn">Inf</span></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a>    <span class="cf">while</span> iter <span class="op">&lt;=</span> maxiter</span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a>        <span class="fu">A_mul_B!</span>(Ax, A, x)</span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a>        radius <span class="op">=</span> <span class="fu">norm</span>(Ax,<span class="fl">1</span>)</span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a>        Ax <span class="op">./=</span> radius <span class="co"># want |x|_1 = 1</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a>        err <span class="op">=</span> <span class="fu">norm</span>(Ax<span class="op">-</span>x,<span class="fl">1</span>)</span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a>        verbose <span class="op">&amp;&amp;</span> <span class="pp">@show</span> iter,err,radius</span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a>        log <span class="op">&amp;&amp;</span> <span class="fu">push!</span>(history,(iter,err,radius))</span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a>        <span class="fu">copy!</span>(x, Ax)</span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a>        err <span class="op">&lt;</span> tol <span class="op">&amp;&amp;</span> <span class="cf">break</span></span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a>        iter <span class="op">+=</span> <span class="fl">1</span></span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a>    <span class="cf">end</span></span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a>    isconverged <span class="op">=</span> err <span class="op">&lt;</span> tol</span>
<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> log radius,x,history,isconverged <span class="cf">else</span> radius,x <span class="cf">end</span></span>
<span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span></span></code></pre></div>
<p>By Vipin Vijayan.</p>]]>
        </description>
        <pubDate>Sun, 28 Aug 2022 0:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://vijayan.net/posts/39</guid>
      </item>
  </channel>
</rss>
