|
4748 | 4748 | </span> |
4749 | 4749 | </a> |
4750 | 4750 |
|
| 4751 | +</li> |
| 4752 | + |
| 4753 | + <li class="md-nav__item"> |
| 4754 | + <a href="#spotpython.utils.sampling.mmphi_intensive_update" class="md-nav__link"> |
| 4755 | + <span class="md-ellipsis"> |
| 4756 | + mmphi_intensive_update |
| 4757 | + </span> |
| 4758 | + </a> |
| 4759 | + |
4751 | 4760 | </li> |
4752 | 4761 |
|
4753 | 4762 | <li class="md-nav__item"> |
|
5148 | 5157 | </span> |
5149 | 5158 | </a> |
5150 | 5159 |
|
| 5160 | +</li> |
| 5161 | + |
| 5162 | + <li class="md-nav__item"> |
| 5163 | + <a href="#spotpython.utils.sampling.mmphi_intensive_update" class="md-nav__link"> |
| 5164 | + <span class="md-ellipsis"> |
| 5165 | + mmphi_intensive_update |
| 5166 | + </span> |
| 5167 | + </a> |
| 5168 | + |
5151 | 5169 | </li> |
5152 | 5170 |
|
5153 | 5171 | <li class="md-nav__item"> |
@@ -7463,6 +7481,226 @@ <h2 id="spotpython.utils.sampling.mmphi_intensive" class="doc doc-heading"> |
7463 | 7481 | <div class="doc doc-object doc-function"> |
7464 | 7482 |
|
7465 | 7483 |
|
| 7484 | +<h2 id="spotpython.utils.sampling.mmphi_intensive_update" class="doc doc-heading"> |
| 7485 | + <code class="highlight language-python"><span class="n">mmphi_intensive_update</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">new_point</span><span class="p">,</span> <span class="n">J</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">q</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="mf">2.0</span><span class="p">)</span></code> |
| 7486 | + |
| 7487 | +<a href="#spotpython.utils.sampling.mmphi_intensive_update" class="headerlink" title="Permanent link">¶</a></h2> |
| 7488 | + |
| 7489 | + |
| 7490 | + <div class="doc doc-contents "> |
| 7491 | + |
| 7492 | + <p>Updates the Morris-Mitchell intensive criterion for n+1 points by adding a new point to the design.</p> |
| 7493 | + |
| 7494 | + |
| 7495 | +<p><span class="doc-section-title">Parameters:</span></p> |
| 7496 | + <table> |
| 7497 | + <thead> |
| 7498 | + <tr> |
| 7499 | + <th>Name</th> |
| 7500 | + <th>Type</th> |
| 7501 | + <th>Description</th> |
| 7502 | + <th>Default</th> |
| 7503 | + </tr> |
| 7504 | + </thead> |
| 7505 | + <tbody> |
| 7506 | + <tr class="doc-section-item"> |
| 7507 | + <td><code>X</code></td> |
| 7508 | + <td> |
| 7509 | + <code><span title="numpy.ndarray">ndarray</span></code> |
| 7510 | + </td> |
| 7511 | + <td> |
| 7512 | + <div class="doc-md-description"> |
| 7513 | + <p>Existing sampling plan (shape: (n, d)).</p> |
| 7514 | + </div> |
| 7515 | + </td> |
| 7516 | + <td> |
| 7517 | + <em>required</em> |
| 7518 | + </td> |
| 7519 | + </tr> |
| 7520 | + <tr class="doc-section-item"> |
| 7521 | + <td><code>new_point</code></td> |
| 7522 | + <td> |
| 7523 | + <code><span title="numpy.ndarray">ndarray</span></code> |
| 7524 | + </td> |
| 7525 | + <td> |
| 7526 | + <div class="doc-md-description"> |
| 7527 | + <p>New point to add (shape: (d,)).</p> |
| 7528 | + </div> |
| 7529 | + </td> |
| 7530 | + <td> |
| 7531 | + <em>required</em> |
| 7532 | + </td> |
| 7533 | + </tr> |
| 7534 | + <tr class="doc-section-item"> |
| 7535 | + <td><code>J</code></td> |
| 7536 | + <td> |
| 7537 | + <code><span title="numpy.ndarray">ndarray</span></code> |
| 7538 | + </td> |
| 7539 | + <td> |
| 7540 | + <div class="doc-md-description"> |
| 7541 | + <p>Multiplicities of distances for the existing design.</p> |
| 7542 | + </div> |
| 7543 | + </td> |
| 7544 | + <td> |
| 7545 | + <em>required</em> |
| 7546 | + </td> |
| 7547 | + </tr> |
| 7548 | + <tr class="doc-section-item"> |
| 7549 | + <td><code>d</code></td> |
| 7550 | + <td> |
| 7551 | + <code><span title="numpy.ndarray">ndarray</span></code> |
| 7552 | + </td> |
| 7553 | + <td> |
| 7554 | + <div class="doc-md-description"> |
| 7555 | + <p>Unique distances for the existing design.</p> |
| 7556 | + </div> |
| 7557 | + </td> |
| 7558 | + <td> |
| 7559 | + <em>required</em> |
| 7560 | + </td> |
| 7561 | + </tr> |
| 7562 | + <tr class="doc-section-item"> |
| 7563 | + <td><code>q</code></td> |
| 7564 | + <td> |
| 7565 | + <code>float</code> |
| 7566 | + </td> |
| 7567 | + <td> |
| 7568 | + <div class="doc-md-description"> |
| 7569 | + <p>Exponent used in the computation of the metric. Defaults to 2.0.</p> |
| 7570 | + </div> |
| 7571 | + </td> |
| 7572 | + <td> |
| 7573 | + <code>2.0</code> |
| 7574 | + </td> |
| 7575 | + </tr> |
| 7576 | + <tr class="doc-section-item"> |
| 7577 | + <td><code>p</code></td> |
| 7578 | + <td> |
| 7579 | + <code>float</code> |
| 7580 | + </td> |
| 7581 | + <td> |
| 7582 | + <div class="doc-md-description"> |
| 7583 | + <p>Distance norm to use (e.g., p=1 for Manhattan, p=2 for Euclidean). Defaults to 2.0.</p> |
| 7584 | + </div> |
| 7585 | + </td> |
| 7586 | + <td> |
| 7587 | + <code>2.0</code> |
| 7588 | + </td> |
| 7589 | + </tr> |
| 7590 | + </tbody> |
| 7591 | + </table> |
| 7592 | + |
| 7593 | + |
| 7594 | + <p><span class="doc-section-title">Returns:</span></p> |
| 7595 | + <table> |
| 7596 | + <thead> |
| 7597 | + <tr> |
| 7598 | + <th>Type</th> |
| 7599 | + <th>Description</th> |
| 7600 | + </tr> |
| 7601 | + </thead> |
| 7602 | + <tbody> |
| 7603 | + <tr class="doc-section-item"> |
| 7604 | + <td> |
| 7605 | + <code>tuple[float, <span title="numpy.ndarray">ndarray</span>, <span title="numpy.ndarray">ndarray</span>]</code> |
| 7606 | + </td> |
| 7607 | + <td> |
| 7608 | + <div class="doc-md-description"> |
| 7609 | + <p>tuple[float, np.ndarray, np.ndarray]: Updated intensive_phiq, updated_J, updated_d.</p> |
| 7610 | + </div> |
| 7611 | + </td> |
| 7612 | + </tr> |
| 7613 | + </tbody> |
| 7614 | + </table> |
| 7615 | + |
| 7616 | + <details class="quote"> |
| 7617 | + <summary>Source code in <code>spotpython/utils/sampling.py</code></summary> |
| 7618 | + <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">956</span> |
| 7619 | +<span class="normal">957</span> |
| 7620 | +<span class="normal">958</span> |
| 7621 | +<span class="normal">959</span> |
| 7622 | +<span class="normal">960</span> |
| 7623 | +<span class="normal">961</span> |
| 7624 | +<span class="normal">962</span> |
| 7625 | +<span class="normal">963</span> |
| 7626 | +<span class="normal">964</span> |
| 7627 | +<span class="normal">965</span> |
| 7628 | +<span class="normal">966</span> |
| 7629 | +<span class="normal">967</span> |
| 7630 | +<span class="normal">968</span> |
| 7631 | +<span class="normal">969</span> |
| 7632 | +<span class="normal">970</span> |
| 7633 | +<span class="normal">971</span> |
| 7634 | +<span class="normal">972</span> |
| 7635 | +<span class="normal">973</span> |
| 7636 | +<span class="normal">974</span> |
| 7637 | +<span class="normal">975</span> |
| 7638 | +<span class="normal">976</span> |
| 7639 | +<span class="normal">977</span> |
| 7640 | +<span class="normal">978</span> |
| 7641 | +<span class="normal">979</span> |
| 7642 | +<span class="normal">980</span> |
| 7643 | +<span class="normal">981</span> |
| 7644 | +<span class="normal">982</span> |
| 7645 | +<span class="normal">983</span> |
| 7646 | +<span class="normal">984</span> |
| 7647 | +<span class="normal">985</span> |
| 7648 | +<span class="normal">986</span> |
| 7649 | +<span class="normal">987</span> |
| 7650 | +<span class="normal">988</span> |
| 7651 | +<span class="normal">989</span> |
| 7652 | +<span class="normal">990</span> |
| 7653 | +<span class="normal">991</span> |
| 7654 | +<span class="normal">992</span> |
| 7655 | +<span class="normal">993</span> |
| 7656 | +<span class="normal">994</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">mmphi_intensive_update</span><span class="p">(</span><span class="n">X</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">new_point</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">J</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">q</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">p</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mf">2.0</span><span class="p">)</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">]:</span> |
| 7657 | +<span class="w"> </span><span class="sd">"""</span> |
| 7658 | +<span class="sd"> Updates the Morris-Mitchell intensive criterion for n+1 points by adding a new point to the design.</span> |
| 7659 | + |
| 7660 | +<span class="sd"> Args:</span> |
| 7661 | +<span class="sd"> X (np.ndarray): Existing sampling plan (shape: (n, d)).</span> |
| 7662 | +<span class="sd"> new_point (np.ndarray): New point to add (shape: (d,)).</span> |
| 7663 | +<span class="sd"> J (np.ndarray): Multiplicities of distances for the existing design.</span> |
| 7664 | +<span class="sd"> d (np.ndarray): Unique distances for the existing design.</span> |
| 7665 | +<span class="sd"> q (float): Exponent used in the computation of the metric. Defaults to 2.0.</span> |
| 7666 | +<span class="sd"> p (float): Distance norm to use (e.g., p=1 for Manhattan, p=2 for Euclidean). Defaults to 2.0.</span> |
| 7667 | + |
| 7668 | +<span class="sd"> Returns:</span> |
| 7669 | +<span class="sd"> tuple[float, np.ndarray, np.ndarray]: Updated intensive_phiq, updated_J, updated_d.</span> |
| 7670 | +<span class="sd"> """</span> |
| 7671 | + <span class="n">n_points</span> <span class="o">=</span> <span class="n">X</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> |
| 7672 | + <span class="k">if</span> <span class="n">n_points</span> <span class="o"><</span> <span class="mi">1</span><span class="p">:</span> |
| 7673 | + <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"The existing design must contain at least one point."</span><span class="p">)</span> |
| 7674 | + |
| 7675 | + <span class="c1"># Compute distances between the new point and all existing points</span> |
| 7676 | + <span class="n">new_distances</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">new_point</span> <span class="o">-</span> <span class="n">X</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">ord</span><span class="o">=</span><span class="n">p</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_points</span><span class="p">)])</span> |
| 7677 | + |
| 7678 | + <span class="c1"># Combine old distances and new distances into a single list</span> |
| 7679 | + <span class="n">all_distances</span> <span class="o">=</span> <span class="p">[]</span> |
| 7680 | + <span class="k">for</span> <span class="n">dist</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">J</span><span class="p">):</span> |
| 7681 | + <span class="n">all_distances</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">dist</span><span class="p">]</span> <span class="o">*</span> <span class="n">count</span><span class="p">)</span> |
| 7682 | + <span class="n">all_distances</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">new_distances</span><span class="p">)</span> |
| 7683 | + |
| 7684 | + <span class="c1"># Find unique distances and their counts</span> |
| 7685 | + <span class="n">updated_d</span><span class="p">,</span> <span class="n">updated_J</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">(</span><span class="n">all_distances</span><span class="p">,</span> <span class="n">return_counts</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> |
| 7686 | + |
| 7687 | + <span class="c1"># Calculate the number of unique pairs of points</span> |
| 7688 | + <span class="n">M</span> <span class="o">=</span> <span class="p">(</span><span class="n">n_points</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">n_points</span> <span class="o">/</span> <span class="mi">2</span> |
| 7689 | + |
| 7690 | + <span class="c1"># Compute the updated intensive_phiq</span> |
| 7691 | + <span class="n">sum_term</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">updated_J</span> <span class="o">*</span> <span class="p">(</span><span class="n">updated_d</span> <span class="o">**</span> <span class="p">(</span><span class="o">-</span><span class="n">q</span><span class="p">)))</span> |
| 7692 | + <span class="n">intensive_phiq</span> <span class="o">=</span> <span class="p">(</span><span class="n">sum_term</span> <span class="o">/</span> <span class="n">M</span><span class="p">)</span> <span class="o">**</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">/</span> <span class="n">q</span><span class="p">)</span> |
| 7693 | + |
| 7694 | + <span class="k">return</span> <span class="n">intensive_phiq</span><span class="p">,</span> <span class="n">updated_J</span><span class="p">,</span> <span class="n">updated_d</span> |
| 7695 | +</code></pre></div></td></tr></table></div> |
| 7696 | + </details> |
| 7697 | + </div> |
| 7698 | + |
| 7699 | +</div> |
| 7700 | + |
| 7701 | +<div class="doc doc-object doc-function"> |
| 7702 | + |
| 7703 | + |
7466 | 7704 | <h2 id="spotpython.utils.sampling.mmsort" class="doc doc-heading"> |
7467 | 7705 | <code class="highlight language-python"><span class="n">mmsort</span><span class="p">(</span><span class="n">X3D</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="mf">1.0</span><span class="p">)</span></code> |
7468 | 7706 |
|
|
0 commit comments