Skip to content

Commit b1c67f9

Browse files
author
Documenter.jl
committed
build based on d43015f
1 parent f69ee4c commit b1c67f9

50 files changed

Lines changed: 312 additions & 242 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"documenter":{"documenter_version":"1.17.0","generation_timestamp":"2026-08-20T10:04:01","julia_version":"1.10.12"}}
1+
{"documenter":{"documenter_version":"1.17.0","generation_timestamp":"2026-08-20T22:00:53","julia_version":"1.10.12"}}
166 Bytes
Binary file not shown.

‎previews/PR3061/assets/documentercodeblocks/line-numbers.css‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
--ln-hl-bg: rgba(255, 208, 42, 0.18); /* highlighted line background */
1212
--ln-hl-gutter-bg: #ece2b8; /* opaque blend of hl over --ln-bg */
1313
--ln-hl-fg: #6a5c1e;
14+
--ln-copied: #22863a; /* permalink copied-confirmation check */
1415
}
1516
html.theme--documenter-dark {
1617
--ln-bg: #282f2f;
@@ -20,6 +21,7 @@ html.theme--documenter-dark {
2021
--ln-hl-bg: rgba(255, 208, 42, 0.10);
2122
--ln-hl-gutter-bg: #46442e;
2223
--ln-hl-fg: #d8c56a;
24+
--ln-copied: #3fb950;
2325
}
2426
/* Catppuccin themes: --ln-bg matches each theme's pre background (mantle),
2527
* --ln-border its pre border (surface2), accents from the catppuccin palette. */
@@ -31,6 +33,7 @@ html.theme--catppuccin-latte {
3133
--ln-hl-bg: rgba(223, 142, 29, 0.15);
3234
--ln-hl-gutter-bg: #e5d8c9;
3335
--ln-hl-fg: #7a5c0e;
36+
--ln-copied: #40a02b;
3437
}
3538
html.theme--catppuccin-frappe {
3639
--ln-bg: #292c3c;
@@ -40,6 +43,7 @@ html.theme--catppuccin-frappe {
4043
--ln-hl-bg: rgba(229, 200, 144, 0.10);
4144
--ln-hl-gutter-bg: #454349;
4245
--ln-hl-fg: #e5c890;
46+
--ln-copied: #a6d189;
4347
}
4448
html.theme--catppuccin-macchiato {
4549
--ln-bg: #1e2030;
@@ -49,6 +53,7 @@ html.theme--catppuccin-macchiato {
4953
--ln-hl-bg: rgba(238, 212, 159, 0.10);
5054
--ln-hl-gutter-bg: #3d3b40;
5155
--ln-hl-fg: #eed49f;
56+
--ln-copied: #a6da95;
5257
}
5358
html.theme--catppuccin-mocha {
5459
--ln-bg: #181825;
@@ -58,6 +63,7 @@ html.theme--catppuccin-mocha {
5863
--ln-hl-bg: rgba(249, 226, 175, 0.10);
5964
--ln-hl-gutter-bg: #3a3639;
6065
--ln-hl-fg: #f9e2af;
66+
--ln-copied: #a6e3a1;
6167
}
6268

6369
/* ---- structure ----
@@ -140,7 +146,8 @@ code.line-numbers .line.hl .line-num {
140146
color: var(--ln-hl-fg);
141147
}
142148

143-
/* ---- whole-block permalink button (sits left of the copy button) ---- */
149+
/* ---- permalink button (sits left of the copy button): a real <a> that
150+
copies the block/selection URL on click ---- */
144151
pre .block-link {
145152
opacity: 0.2;
146153
transition: opacity 0.2s;
@@ -155,6 +162,7 @@ pre .block-link {
155162
color: var(--ln-fg);
156163
cursor: pointer;
157164
text-align: center;
165+
text-decoration: none;
158166
}
159167
pre:hover .block-link,
160168
pre .block-link:focus {
@@ -164,6 +172,12 @@ pre .block-link:hover {
164172
color: var(--ln-fg-hover);
165173
background: rgba(128, 128, 128, 0.1);
166174
}
175+
/* post-copy confirmation: checkmark icon, held visible even off-hover */
176+
pre .block-link.copied,
177+
pre .block-link.copied:hover {
178+
color: var(--ln-copied);
179+
opacity: 1;
180+
}
167181
pre .block-link svg {
168182
width: 1.1em;
169183
height: 1.1em;

‎previews/PR3061/assets/documentercodeblocks/line-numbers.js‎

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
* </span></code></pre>
99
*
1010
* Line numbers render from CSS counters with zero JS. This script only adds the
11-
* client-side interactions: the whole-block permalink button, gutter
12-
* click/shift-click/drag selection, and hash restore.
11+
* client-side interactions: the permalink button (a real anchor that copies the
12+
* block/selection URL to the clipboard), gutter click/shift-click/drag
13+
* selection, and hash restore.
1314
*
1415
* Hash formats: #c-1a2b3c4d whole block
1516
* #c-1a2b3c4d-L5 single line
@@ -30,26 +31,81 @@
3031
'<svg viewBox="0 0 640 512" fill="currentColor" aria-hidden="true">' +
3132
'<path d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z"/></svg>';
3233

34+
const CHECK_SVG =
35+
'<svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true">' +
36+
'<path d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/></svg>';
37+
3338
let anchor = null; // { pre, line } from the last plain gutter click
3439
let drag = null; // { pre, wrap, start } while a gutter drag is in progress
3540
let suppressClick = false; // swallow the click generated by a finished drag
3641

3742
// ---- setup ------------------------------------------------------------
3843

44+
// The permalink is a real <a href="#c-…"> so the browser's own affordances
45+
// work: right-click → Copy Link, middle/ctrl-click → new tab (#17). A plain
46+
// left click sets the hash (as before) AND copies the URL to the clipboard,
47+
// confirmed by flashing the icon to a checkmark — mirroring the copy-code
48+
// button that sits next to it.
3949
function addPermalinks() {
4050
document.querySelectorAll('article pre[id^="c-"]').forEach(function (pre) {
41-
const btn = document.createElement("button");
42-
btn.className = "block-link";
43-
btn.setAttribute("aria-label", "Link to this code block");
44-
btn.title = "Link to this code block";
45-
btn.innerHTML = LINK_SVG;
46-
btn.addEventListener("click", function () {
47-
setHash("#" + pre.id);
51+
const link = document.createElement("a");
52+
link.className = "block-link";
53+
link.setAttribute("aria-label", "Copy link to this code block");
54+
link.title = "Copy link to this code block";
55+
link.href = "#" + pre.id;
56+
link.innerHTML = LINK_SVG;
57+
link.addEventListener("click", function (e) {
58+
if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey || e.button !== 0) {
59+
return; // modified click: native anchor behavior
60+
}
61+
e.preventDefault();
62+
// An active line selection in this block is what the user means to
63+
// share — keep it; otherwise (re)target the whole block.
64+
const m = HASH_RE.exec(location.hash);
65+
if (!(m && m[1] === pre.id && m[2])) setHash("#" + pre.id);
66+
copyText(location.href, link);
4867
});
49-
pre.appendChild(btn);
68+
pre.appendChild(link);
5069
});
5170
}
5271

72+
// Copy `text` to the clipboard and flash `link`'s icon to a checkmark.
73+
// navigator.clipboard requires a secure context (https or localhost); on
74+
// plain-http or file:// views fall back to a transient textarea +
75+
// execCommand. If both fail the click has still set the hash, which is the
76+
// pre-copy behavior.
77+
function copyText(text, link) {
78+
let copied;
79+
if (navigator.clipboard && window.isSecureContext) {
80+
copied = navigator.clipboard.writeText(text);
81+
} else {
82+
copied = new Promise(function (resolve, reject) {
83+
const ta = document.createElement("textarea");
84+
ta.value = text;
85+
ta.style.position = "fixed";
86+
ta.style.opacity = "0";
87+
document.body.appendChild(ta);
88+
ta.select();
89+
try {
90+
document.execCommand("copy") ? resolve() : reject(new Error("execCommand"));
91+
} catch (err) {
92+
reject(err);
93+
} finally {
94+
ta.remove();
95+
}
96+
});
97+
}
98+
copied.then(function () {
99+
link.innerHTML = CHECK_SVG;
100+
link.classList.add("copied");
101+
clearTimeout(link._copiedTimer);
102+
link._copiedTimer = setTimeout(function () {
103+
link.innerHTML = LINK_SVG;
104+
link.classList.remove("copied");
105+
}, 1500);
106+
}).catch(function () {});
107+
}
108+
53109
function armGutters() {
54110
document.querySelectorAll("article pre .code-lines").forEach(function (wrap) {
55111
wrap.addEventListener("mousedown", onGutterMouseDown);

‎previews/PR3061/background/duality/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,4 @@
7777
\max &amp; \sum b_k y_k \\
7878
\text{s.t.} \;\; &amp; C+C^\top - \sum (A_k+A_k^\top) y_k \in \mathcal{S}_+ \\
7979
&amp; C-C^\top - \sum(A_k-A_k^\top) y_k = 0
80-
\end{align}\]</p><p>and we recover <span>$Z = X + X^\top$</span>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../../manual/modification/">« Problem modification</a><a class="docs-footer-nextpage" href="../infeasibility_certificates/">Infeasibility certificates »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.17.0 on <span class="colophon-date" title="Thursday 20 August 2026 10:04">Thursday 20 August 2026</span>. Using Julia version 1.10.12.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
80+
\end{align}\]</p><p>and we recover <span>$Z = X + X^\top$</span>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../../manual/modification/">« Problem modification</a><a class="docs-footer-nextpage" href="../infeasibility_certificates/">Infeasibility certificates »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.17.0 on <span class="colophon-date" title="Thursday 20 August 2026 22:00">Thursday 20 August 2026</span>. Using Julia version 1.10.12.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>

‎previews/PR3061/background/infeasibility_certificates/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@
2525
\end{align}\]</p><p>and:</p><p class="math-container">\[-\sum_{i=1}^m b_i^\top (y_i + \eta d_i) &gt; -\sum_{i=1}^m b_i^\top y_i,\]</p><p>for any feasible dual solution <span>$y$</span>. The latter simplifies to <span>$-\sum_{i=1}^m b_i^\top d_i &gt; 0$</span>. For a maximization problem, the inequality is <span>$\sum_{i=1}^m b_i^\top d_i &lt; 0$</span>. (Note that these are the same inequality, modulo a <code>-</code> sign.)</p><p>If the solver has found a certificate of primal infeasibility:</p><ul><li><a href="../../reference/models/#MathOptInterface.TerminationStatus"><code>TerminationStatus</code></a> must be <code>INFEASIBLE</code></li><li><a href="../../reference/models/#MathOptInterface.DualStatus"><code>DualStatus</code></a> must be <code>INFEASIBILITY_CERTIFICATE</code></li><li><a href="../../reference/constraints/#MathOptInterface.ConstraintDual"><code>ConstraintDual</code></a> must be the corresponding value of <span>$d$</span></li><li><a href="../../reference/models/#MathOptInterface.DualObjectiveValue"><code>DualObjectiveValue</code></a> must be the value <span>$-\sum_{i=1}^m b_i^\top d_i$</span> for minimization problems and <span>$\sum_{i=1}^m b_i^\top d_i$</span> for maximization problems.</li></ul><div class="admonition is-info" id="Note-149a02b9d89f8214"><header class="admonition-header">Note<a class="admonition-anchor" href="#Note-149a02b9d89f8214" title="Permalink"></a></header><div class="admonition-body"><p>The choice of whether to scale the ray <span>$d$</span> to have magnitude <code>1</code> is left to the solver.</p></div></div><h3 id="Infeasibility-certificates-of-variable-bounds"><a class="docs-heading-anchor" href="#Infeasibility-certificates-of-variable-bounds">Infeasibility certificates of variable bounds</a><a id="Infeasibility-certificates-of-variable-bounds-1"></a><a class="docs-heading-anchor-permalink" href="#Infeasibility-certificates-of-variable-bounds" title="Permalink"></a></h3><p>Many linear solvers (for example, Gurobi) do not provide explicit access to the primal infeasibility certificate of a variable bound. However, given a set of linear constraints:</p><p class="math-container">\[\begin{align}
2626
l_A \le A x \le u_A \\
2727
l_x \le x \le u_x,
28-
\end{align}\]</p><p>the primal certificate of the variable bounds can be computed using the primal certificate associated with the affine constraints, <span>$d$</span>. (Note that <span>$d$</span> will have one element for each row of the <span>$A$</span> matrix, and that some or all of the elements in the vectors <span>$l_A$</span> and <span>$u_A$</span> may be <span>$\pm \infty$</span>. If both <span>$l_A$</span> and <span>$u_A$</span> are finite for some row, the corresponding element in `<code>d</code> must be <code>0</code>.)</p><p>Given <span>$d$</span>, compute <span>$\bar{d} = d^\top A$</span>. If the bound is finite, a certificate for the lower variable bound of <span>$x_i$</span> is <span>$\max\{\bar{d}_i, 0\}$</span>, and a certificate for the upper variable bound is <span>$\min\{\bar{d}_i, 0\}$</span>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../duality/">« Duality</a><a class="docs-footer-nextpage" href="../naming_conventions/">Naming conventions »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.17.0 on <span class="colophon-date" title="Thursday 20 August 2026 10:04">Thursday 20 August 2026</span>. Using Julia version 1.10.12.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
28+
\end{align}\]</p><p>the primal certificate of the variable bounds can be computed using the primal certificate associated with the affine constraints, <span>$d$</span>. (Note that <span>$d$</span> will have one element for each row of the <span>$A$</span> matrix, and that some or all of the elements in the vectors <span>$l_A$</span> and <span>$u_A$</span> may be <span>$\pm \infty$</span>. If both <span>$l_A$</span> and <span>$u_A$</span> are finite for some row, the corresponding element in `<code>d</code> must be <code>0</code>.)</p><p>Given <span>$d$</span>, compute <span>$\bar{d} = d^\top A$</span>. If the bound is finite, a certificate for the lower variable bound of <span>$x_i$</span> is <span>$\max\{\bar{d}_i, 0\}$</span>, and a certificate for the upper variable bound is <span>$\min\{\bar{d}_i, 0\}$</span>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../duality/">« Duality</a><a class="docs-footer-nextpage" href="../naming_conventions/">Naming conventions »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="auto">Automatic (OS)</option><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="catppuccin-latte">catppuccin-latte</option><option value="catppuccin-frappe">catppuccin-frappe</option><option value="catppuccin-macchiato">catppuccin-macchiato</option><option value="catppuccin-mocha">catppuccin-mocha</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.17.0 on <span class="colophon-date" title="Thursday 20 August 2026 22:00">Thursday 20 August 2026</span>. Using Julia version 1.10.12.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>

0 commit comments

Comments
 (0)