Skip to content

Commit e0521f6

Browse files
committed
Deploying to gh-pages from @ a96dffb 🚀
1 parent fa377de commit e0521f6

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

generated/array_api_extra.at.html

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -301,22 +301,39 @@ <h1>array_api_extra.at<a class="headerlink" href="#array-api-extra-at" title="Li
301301
</dl>
302302
<div class="admonition warning">
303303
<p class="admonition-title">Warning</p>
304-
<p>(a) When you omit the <code class="docutils literal notranslate"><span class="pre">copy</span></code> parameter, you should always immediately overwrite
305-
the parameter array:</p>
304+
<p>(a) When you omit the <code class="docutils literal notranslate"><span class="pre">copy</span></code> parameter, you should never reuse the parameter
305+
array later on; ideally, you should reassign it immediately:</p>
306306
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">array_api_extra</span> <span class="k">as</span> <span class="nn">xpx</span>
307307
<span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">xpx</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
308308
</pre></div>
309309
</div>
310-
<p>The anti-pattern below must be avoided, as it will result in different
311-
behaviour on read-only versus writeable arrays:</p>
310+
<p>The above best practice pattern ensures that the behaviour won’t change depending
311+
on whether <code class="docutils literal notranslate"><span class="pre">x</span></code> is writeable or not, as the original <code class="docutils literal notranslate"><span class="pre">x</span></code> object is dereferenced
312+
as soon as <code class="docutils literal notranslate"><span class="pre">xpx.at</span></code> returns; this way there is no risk to accidentally update it
313+
twice.</p>
314+
<p>On the reverse, the anti-pattern below must be avoided, as it will result in
315+
different behaviour on read-only versus writeable arrays:</p>
312316
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">xp</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
313317
<span class="gp">&gt;&gt;&gt; </span><span class="n">y</span> <span class="o">=</span> <span class="n">xpx</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
314318
<span class="gp">&gt;&gt;&gt; </span><span class="n">z</span> <span class="o">=</span> <span class="n">xpx</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
315319
</pre></div>
316320
</div>
317-
<p>In the above example, <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">==</span> <span class="pre">[0,</span> <span class="pre">0,</span> <span class="pre">0]</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span> <span class="pre">==</span> <span class="pre">[2,</span> <span class="pre">0,</span> <span class="pre">0]</span></code> and z == <code class="docutils literal notranslate"><span class="pre">[0,</span> <span class="pre">3,</span> <span class="pre">0]</span></code>
318-
when <code class="docutils literal notranslate"><span class="pre">x</span></code> is read-only, whereas <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">==</span> <span class="pre">y</span> <span class="pre">==</span> <span class="pre">z</span> <span class="pre">==</span> <span class="pre">[2,</span> <span class="pre">3,</span> <span class="pre">0]</span></code> when <code class="docutils literal notranslate"><span class="pre">x</span></code> is
319-
writeable!</p>
321+
<p>In the above example, both calls to <code class="docutils literal notranslate"><span class="pre">xpx.at</span></code> update <code class="docutils literal notranslate"><span class="pre">x</span></code> in place <em>if possible</em>.
322+
This causes the behaviour to diverge depending on whether <code class="docutils literal notranslate"><span class="pre">x</span></code> is writeable or not:</p>
323+
<ul class="simple">
324+
<li><p>If <code class="docutils literal notranslate"><span class="pre">x</span></code> is writeable, then after the snippet above you’ll have
325+
<code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">==</span> <span class="pre">y</span> <span class="pre">==</span> <span class="pre">z</span> <span class="pre">==</span> <span class="pre">[2,</span> <span class="pre">3,</span> <span class="pre">0]</span></code></p></li>
326+
<li><p>If <code class="docutils literal notranslate"><span class="pre">x</span></code> is read-only, then you’ll end up with
327+
<code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">==</span> <span class="pre">[0,</span> <span class="pre">0,</span> <span class="pre">0]</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span> <span class="pre">==</span> <span class="pre">[2,</span> <span class="pre">0,</span> <span class="pre">0]</span></code> and <code class="docutils literal notranslate"><span class="pre">z</span> <span class="pre">==</span> <span class="pre">[0,</span> <span class="pre">3,</span> <span class="pre">0]</span></code>.</p></li>
328+
</ul>
329+
<p>The correct pattern to use if you want diverging outputs from the same input is
330+
to enforce copies:</p>
331+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">x</span> <span class="o">=</span> <span class="n">xp</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">])</span>
332+
<span class="gp">&gt;&gt;&gt; </span><span class="n">y</span> <span class="o">=</span> <span class="n">xpx</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># Never updates x</span>
333+
<span class="gp">&gt;&gt;&gt; </span><span class="n">z</span> <span class="o">=</span> <span class="n">xpx</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="c1"># May or may not update x in place</span>
334+
<span class="gp">&gt;&gt;&gt; </span><span class="k">del</span> <span class="n">x</span> <span class="c1"># avoid accidental reuse of x as we don&#39;t know its state anymore</span>
335+
</pre></div>
336+
</div>
320337
<p>(b) The array API standard does not support integer array indices.
321338
The behaviour of update methods when the index is an array of integers is
322339
undefined and will vary between backends; this is particularly true when the

0 commit comments

Comments
 (0)