<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN"
                  "JATS-archivearticle1.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">jrepstat</journal-id>
<journal-title-group>
<journal-title>Journal of Reproducible Statistics</journal-title>
</journal-title-group>
<publisher>
<publisher-name>FAIR Press</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<title-group>
<article-title>The Constrained LASSO is a Portfolio: A numerical check of the CLA–LASSO identity under constraints</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0009-9771-3501</contrib-id>
<name>
<surname>Schmelzer</surname>
<given-names>Thomas</given-names>
</name>
<aff>Jebel Quant Research, Abu Dhabi</aff>
</contrib>
</contrib-group>
<pub-date date-type="pub" publication-format="electronic">
<year>2026</year>
</pub-date>
<volume>1</volume>
<elocation-id>10</elocation-id>
<history>
<date date-type="received" iso-8601-date="2026-10-25"><day>25</day><month>10</month><year>2026</year></date>
<date date-type="accepted" iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</history>
<permissions>
<license license-type="open-access" xlink:href="https://creativecommons.org/licenses/by/4.0/">
<license-p>This is an open access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution and reproduction in any medium provided the original work is properly cited.</license-p>
</license>
</permissions>
<self-uri content-type="html" xlink:href="https://jrepstat.fairpressjournals.com/articles/the-constrained-lasso-is-a-portfolio-a-numerical-check-of-the-cla-lasso-identity-under-constraints/"/>
<abstract>
<p>Schmelzer and Hastie showed that the solution path of the constrained LASSO and the path of Markowitz's Critical Line Algorithm (CLA) are the same curve. This note checks that identity numerically. It poses a constrained regression as a portfolio and hands it to a released CLA written for portfolios. On caps, signs, equality and inequality rows, monotone fits and zero sums, on simulated and real data, up to 500 predictors and on problems built to break a path algorithm, the paths reproduce LARS, an interior-point solver and three independent path algorithms, and meet the LASSO's optimality conditions to rounding, or to 10⁻⁹ where a path with more predictors than observations nears an interpolating fit. A design with two nearly identical columns is declined with an error rather than answered wrongly. With more predictors than observations the paths stay exact, where the path algorithms for general constraints add a ridge that moves the end of the path.</p>
</abstract>
<kwd-group kwd-group-type="author">
<kwd>constrained LASSO</kwd>
<kwd>critical line algorithm</kwd>
<kwd>solution path</kwd>
<kwd>compositional data</kwd>
<kwd>portfolio optimisation</kwd>
<kwd>reproducibility</kwd>
</kwd-group>
<custom-meta-group>
<custom-meta>
<meta-name>data-availability-route</meta-name>
<meta-value>open</meta-value>
</custom-meta>
</custom-meta-group>
</article-meta>
</front>
<body>
<sec id="secU003Aexample">
  <title><named-content content-type="header-section-number">1</named-content>
  A constrained regression</title>
  <p>Tibshirani
  (<xref alt="1996" rid="ref-tibshirani1996" ref-type="bibr">1996</xref>)
  introduced the LASSO as least squares with a single constraint, a
  budget on the <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  norm of the coefficients: <disp-formula><alternatives>
  <tex-math><![CDATA[\min_\beta\ \tfrac12\lVert y-X\beta\rVert _2^2\quad\text{s.t.}\quad\lVert \beta\rVert _1\le t,
  \qquad\text{or equivalently}\qquad
  \min_\beta\ \tfrac12\lVert y-X\beta\rVert _2^2+\lambda\lVert \beta\rVert _1 .]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mi>β</mml:mi></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>X</mml:mi><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mspace width="1.0em"></mml:mspace><mml:mtext mathvariant="normal">s.t.</mml:mtext><mml:mspace width="1.0em"></mml:mspace><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>t</mml:mi><mml:mo>,</mml:mo><mml:mspace width="2.0em"></mml:mspace><mml:mtext mathvariant="normal">or equivalently</mml:mtext><mml:mspace width="2.0em"></mml:mspace><mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mi>β</mml:mi></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>X</mml:mi><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mi>λ</mml:mi><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></disp-formula>
  LARS
  (<xref alt="Efron et al., 2004" rid="ref-efron2004" ref-type="bibr">Efron
  et al., 2004</xref>) and the homotopy method
  (<xref alt="Osborne et al., 2000" rid="ref-osborne2000" ref-type="bibr">Osborne
  et al., 2000</xref>) compute the solution for every
  <inline-formula><alternatives>
  <tex-math><![CDATA[t]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>,
  or every <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>,
  at once. The solution is piecewise linear in the parameter, so the
  whole <italic>path</italic> is a finite list of
  <italic>knots</italic>. scikit-learn’s
  <monospace>lars_path</monospace>
  (<xref alt="Pedregosa et al., 2011" rid="ref-sklearn" ref-type="bibr"><named-content content-type="nocase">Pedregosa
  et al.</named-content>, 2011</xref>) takes
  <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[y]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>y</mml:mi></mml:math></alternatives></inline-formula>
  and one option, <monospace>positive</monospace>, for nonnegative
  coefficients. There is no place for any other constraint.</p>
  <p>Many regressions need one. The diabetes data that LARS was
  introduced with
  (<xref alt="Efron et al., 2004" rid="ref-efron2004" ref-type="bibr">Efron
  et al., 2004</xref>) illustrate what a constraint can do:
  <inline-formula><alternatives>
  <tex-math><![CDATA[n=442]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn>442</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  patients, ten standardised baseline variables and, as the response, a
  measure of disease progression a year later. Six of the variables are
  blood serum measurements, and three of them are closely related
  measures of cholesterol: total cholesterol
  (<monospace>s1</monospace>), LDL (<monospace>s2</monospace>) and HDL
  (<monospace>s3</monospace>). Least squares plays them off against each
  other. It gives total cholesterol a coefficient of
  <inline-formula><alternatives>
  <tex-math><![CDATA[-792]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:mn>792</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  and LDL one of <inline-formula><alternatives>
  <tex-math><![CDATA[477]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>477</mml:mn></mml:math></alternatives></inline-formula>:
  two large effects of opposite sign that mostly cancel. HDL gets
  <inline-formula><alternatives>
  <tex-math><![CDATA[101]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>101</mml:mn></mml:math></alternatives></inline-formula>,
  as if more of it made the disease progress faster. Low HDL is a risk
  factor for incident diabetes
  (<xref alt="Wilson et al., 2007" rid="ref-wilson2007" ref-type="bibr"><named-content content-type="nocase">Wilson
  et al.</named-content>, 2007</xref>); the response here is progression
  in patients who have the disease, so that finding suggests a negative
  sign but does not establish one. The LASSO path ends at the
  least-squares fit, so it gets there too. A cap on every coefficient,
  <inline-formula><alternatives>
  <tex-math><![CDATA[|\beta_j|\le u]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  stops the offsetting. We take <inline-formula><alternatives>
  <tex-math><![CDATA[u=396.1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>u</mml:mi><mml:mo>=</mml:mo><mml:mn>396.1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  half the largest least-squares coefficient, a value chosen after
  seeing the fit. The example shows what a cap does to offsetting
  coefficients; it is not offered as a better model of the disease.</p>
  <p>Figure <xref alt="1" rid="figU003Aexample">1</xref> shows what the
  cap does. Without it the path passes the cap at ten of its 13 knots
  and ends with HDL positive. With it no coefficient passes the cap, and
  HDL stays negative along the whole path, although no sign is imposed.
  That does not hang on the choice of <inline-formula><alternatives>
  <tex-math><![CDATA[u]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>u</mml:mi></mml:math></alternatives></inline-formula>:
  every whole-number cap up to 637 keeps HDL negative along the whole
  path, and only looser caps let it turn positive. That is a property of
  these data, not a finding about HDL. The capped path has 13 knots.</p>
  <fig id="figU003Aexample">
    <caption><p>The opening example: the diabetes LASSO path without and
    with the cap <inline-formula><alternatives>
    <tex-math><![CDATA[|\beta_j|\le u=396.1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>u</mml:mi><mml:mo>=</mml:mo><mml:mn>396.1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
    The shaded bands are beyond the cap. Left: the plain LASSO, the path
    <monospace>lars_path</monospace> computes; the coefficients that
    pass the cap are in orange. Right: every coefficient capped. Lines:
    the exact path, by the CLA in the penalty form. Circles: an
    interior-point solve at the midpoint of every segment. The
    horizontal axis is <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>,
    decreasing to the right, on a symmetric-log scale: logarithmic above
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda_{\max}/50]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>λ</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub><mml:mi>/</mml:mi><mml:mn>50</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and linear below it, so that the end of the path at
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    is shown.</p></caption>
    <graphic mimetype="application" mime-subtype="pdf" xlink:href="example.pdf" />
  </fig>
  <p>Both panels are exact paths. They come from the Critical Line
  Algorithm (CLA), which Markowitz
  (<xref alt="1956" rid="ref-markowitz1956" ref-type="bibr">1956</xref>)
  wrote for portfolios, applied to one of the two encodings described
  below. The open-source package <monospace>cvxcla</monospace>
  (<xref alt="Schmelzer, 2026a" rid="ref-cvxcla" ref-type="bibr">Schmelzer,
  2026a</xref>) carries them out (Algorithm 1), and the right panel is
  one call:</p>
  <preformat>from cvxcla import Lasso
knots = Lasso(X, y, lower=-u * np.ones(p), upper=u * np.ones(p)).path</preformat>
  <p>The same call also takes signs (a bound of zero), equality rows
  <monospace>a, b</monospace> and inequality rows
  <monospace>g, h</monospace>, and picks the encoding that fits
  them.</p>
  <p><bold>What this note shows</bold> Schmelzer and Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>)
  prove that the CLA and the constrained LASSO
  (<xref alt="Gaines et al., 2018" rid="ref-gaines2018" ref-type="bibr">Gaines
  et al., 2018</xref>;
  <xref alt="James et al., 2020" rid="ref-james2020" ref-type="bibr">James
  et al., 2020</xref>) trace the same curve;
  Table <xref alt="1" rid="tabU003Adictionary">1</xref> gives the
  dictionary. Portfolio managers have always needed constraints, such as
  a budget, position limits and sector exposures, and Markowitz built
  them into the CLA from the start. So a CLA written for portfolios,
  with a thin layer that poses the regression as a portfolio, should
  give exact constrained-LASSO paths. This note shows that it does, or
  stops with an error where its arithmetic cannot be trusted, and checks
  every path against references that know nothing of portfolios. The
  layer is two encodings,
  Propositions <xref alt="1" rid="propU003Apenalty">1</xref>
  and <xref alt="2" rid="propU003Abudget">2</xref>. The propositions
  need nothing from Schmelzer &amp; Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>)
  beyond the classical equivalence of the bound and penalty forms of the
  LASSO; that paper supplies the general identity of which they are
  instances. The checks also exposed two defects in the CLA that refused
  ordinary portfolio problems too, a tie for the largest expected return
  and a covariance of low rank. Both were fixed in
  <monospace>cvxcla</monospace> 2.6.0
  (<xref alt="Schmelzer, 2026a" rid="ref-cvxcla" ref-type="bibr">Schmelzer,
  2026a</xref>). Drawing the hostile problems of
  Section <xref alt="5.4" rid="secU003Ahostile">5.4</xref> over more
  seeds exposed three more, on a design whose columns are nearly
  collinear: two in the check that a bound held along a segment is still
  optimal, which refused a correct path, and one in the plain LASSO
  homotopy, which lost the second of two events at the same
  <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>.
  All three were fixed in 2.7.1, the release used here. Brodie et
  al. (<xref alt="2009" rid="ref-brodie2009" ref-type="bibr">2009</xref>)
  put an <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  penalty on Markowitz portfolios to make them sparse, and a companion
  note
  (<xref alt="Schmelzer, 2026b" rid="ref-lassonote" ref-type="bibr">Schmelzer,
  2026b</xref>) computes efficient frontiers with a LASSO solver. Both
  use regression to build portfolios. This note goes the other way.
  Section <xref alt="2" rid="secU003Acla">2</xref> recalls the CLA,
  Section <xref alt="3" rid="secU003Aencodings">3</xref> gives the two
  encodings, Section <xref alt="4" rid="secU003Astarts">4</xref> says
  where the path starts and ends and collects them in Algorithm 1,
  Section <xref alt="5" rid="secU003Aevidence">5</xref> checks the
  paths, and Section <xref alt="6" rid="secU003Alimits">6</xref> gives
  the limits.</p>
  <table-wrap>
    <caption>
      <p>The dictionary between the two problems
      (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
      &amp; Hastie, 2026</xref>).</p>
    </caption>
    <table id="tabU003Adictionary">
      <thead>
        <tr>
          <th align="left">regression</th>
          <th align="left">portfolio</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td align="left">coefficient <inline-formula><alternatives>
          <tex-math><![CDATA[\beta_j]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:math></alternatives></inline-formula></td>
          <td align="left">position in asset
          <inline-formula><alternatives>
          <tex-math><![CDATA[j]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>j</mml:mi></mml:math></alternatives></inline-formula></td>
        </tr>
        <tr>
          <td align="left"><inline-formula><alternatives>
          <tex-math><![CDATA[X^{\top}X]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="left">covariance of the asset returns</td>
        </tr>
        <tr>
          <td align="left"><inline-formula><alternatives>
          <tex-math><![CDATA[X^{\top}y]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="left">expected returns (penalty form: a
          benchmark)</td>
        </tr>
        <tr>
          <td align="left"><inline-formula><alternatives>
          <tex-math><![CDATA[\lVert \beta\rVert _1]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula></td>
          <td align="left">gross exposure</td>
        </tr>
        <tr>
          <td align="left">penalty <inline-formula><alternatives>
          <tex-math><![CDATA[\lambda]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula></td>
          <td align="left">risk tolerance <inline-formula><alternatives>
          <tex-math><![CDATA[\gamma]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
          (penalty form)</td>
        </tr>
        <tr>
          <td align="left">bound <inline-formula><alternatives>
          <tex-math><![CDATA[\lVert \beta\rVert _1\le t]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="left">leverage cap <inline-formula><alternatives>
          <tex-math><![CDATA[t]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>,
          <inline-formula><alternatives>
          <tex-math><![CDATA[\gamma=1/t]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
          (budget form)</td>
        </tr>
        <tr>
          <td align="left"><inline-formula><alternatives>
          <tex-math><![CDATA[A\beta=b]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
          <inline-formula><alternatives>
          <tex-math><![CDATA[l\le\beta\le u]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>l</mml:mi><mml:mo>≤</mml:mo><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="left">budget rows and position limits</td>
        </tr>
        <tr>
          <td align="left">knot of the LASSO path</td>
          <td align="left">turning point of the CLA</td>
        </tr>
      </tbody>
    </table>
  </table-wrap>
  <p>The <italic>penalty form</italic>
  (Section <xref alt="3.1" rid="secU003Apenalty">3.1</xref>) keeps
  <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
  as the parameter and takes bounds, equality rows
  <inline-formula><alternatives>
  <tex-math><![CDATA[A\beta=b]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and inequality rows <inline-formula><alternatives>
  <tex-math><![CDATA[C\beta\le h]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>;
  it is the general form. The <italic>budget form</italic>
  (Section <xref alt="3.2" rid="secU003Abudget">3.2</xref>) keeps the
  <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  budget, as Markowitz’s long-only, fully invested problem with a cash
  asset, and takes homogeneous constraints such as the zero sum
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf{1}^{\top}\beta=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  of compositional data in one run.</p>
  <p><bold>Related work</bold> Exact paths of the constrained LASSO are
  not new. Gaines, Kim and Zhou
  (<xref alt="2018" rid="ref-gaines2018" ref-type="bibr">2018</xref>)
  derive a path algorithm from its optimality conditions that takes
  general linear rows. For <inline-formula><alternatives>
  <tex-math><![CDATA[C\beta=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  alone, the Python package <monospace>c-lasso</monospace>
  (<xref alt="Simpson et al., 2021" rid="ref-classo" ref-type="bibr">Simpson
  et al., 2021</xref>) has a path algorithm with a small ridge term
  added. For zero sums on blocks of coefficients, the comlasso algorithm
  of Jeon et
  al. (<xref alt="2020" rid="ref-jeon2020" ref-type="bibr">2020</xref>)
  traces the exact path, also with <inline-formula><alternatives>
  <tex-math><![CDATA[p>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  None was derived with portfolios in mind, so
  Section <xref alt="5" rid="secU003Aevidence">5</xref> runs all three
  as independent checks. Hobson, Butcher and Lentati
  (<xref alt="2026" rid="ref-hobson2026" ref-type="bibr">2026</xref>)
  revisit Gaines et al. with CLASSO. The linear system of Gaines et
  al. is singular whenever a sign constraint binds on a zero
  coefficient, so CLASSO takes the direction from a small quadratic
  program instead. In the CLA a sign or a cap is a bound, not a row, so
  that singularity does not arise. CLASSO adds a ridge when
  <inline-formula><alternatives>
  <tex-math><![CDATA[n<p]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>&lt;</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  and its code had not been released when we wrote, so we do not run it.
  The CLA is an active-set method of the same kind, written for
  portfolios and used here as released. With
  <inline-formula><alternatives>
  <tex-math><![CDATA[p>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  the other path algorithms for general constraints add a ridge, which
  decides where their path ends; the CLA needs none
  (Section <xref alt="4" rid="secU003Astarts">4</xref>). Microbiome
  studies often have more taxa than samples, so this is the case a user
  of the zero-sum LASSO meets first.
  Table <xref alt="6" rid="tabU003Asoftware">6</xref> collects what each
  accepts.</p>
  <p><bold>Notation</bold> The design is <inline-formula><alternatives>
  <tex-math><![CDATA[X\in\mathbb{R}^{n\times p}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>X</mml:mi><mml:mo>∈</mml:mo><mml:msup><mml:mi mathvariant="double-struck">ℝ</mml:mi><mml:mrow><mml:mi>n</mml:mi><mml:mo>×</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  with <inline-formula><alternatives>
  <tex-math><![CDATA[n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula>
  observations and <inline-formula><alternatives>
  <tex-math><![CDATA[p]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>p</mml:mi></mml:math></alternatives></inline-formula>
  predictors, and the response is <inline-formula><alternatives>
  <tex-math><![CDATA[y\in\mathbb{R}^n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>y</mml:mi><mml:mo>∈</mml:mo><mml:msup><mml:mi mathvariant="double-struck">ℝ</mml:mi><mml:mi>n</mml:mi></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
  Write <inline-formula><alternatives>
  <tex-math><![CDATA[G=X^{\top}X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>G</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[c=X^{\top}y]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  The constrained LASSO is
  <styled-content id="eqU003Alasso"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:lasso}
  \mathrm{L}_\lambda:\quad
  \min_\beta\ \tfrac12\lVert y-X\beta\rVert _2^2+\lambda\lVert \beta\rVert _1
  \quad\text{s.t.}\quad A\beta=b,\quad C\beta\le h,\quad l\le\beta\le u,
  \end{equation} \qquad(1)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub><mml:mo>:</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mi>β</mml:mi></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msubsup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>X</mml:mi><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn><mml:mn>2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mi>λ</mml:mi><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mspace width="1.0em"></mml:mspace><mml:mtext mathvariant="normal">s.t.</mml:mtext><mml:mspace width="1.0em"></mml:mspace><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>l</mml:mi><mml:mo>≤</mml:mo><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>u</mml:mi><mml:mo>,</mml:mo></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[A\in\mathbb{R}^{m\times p}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mo>∈</mml:mo><mml:msup><mml:mi mathvariant="double-struck">ℝ</mml:mi><mml:mrow><mml:mi>m</mml:mi><mml:mo>×</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[C\in\mathbb{R}^{k\times p}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mo>∈</mml:mo><mml:msup><mml:mi mathvariant="double-struck">ℝ</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>×</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[l_j\le0\le u_j]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mn>0</mml:mn><mml:mo>≤</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
  infinite entries allowed, and a nonempty feasible set. A bound that
  excludes zero, such as <inline-formula><alternatives>
  <tex-math><![CDATA[\beta_j\ge\ell]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:mi>ℓ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[\ell>0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ℓ</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  is written as the row <inline-formula><alternatives>
  <tex-math><![CDATA[-\beta_j\le-\ell]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mi>−</mml:mi><mml:mi>ℓ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  With no rows and infinite bounds it is Tibshirani’s LASSO. We assume,
  as
  (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026</xref>) does, that <inline-formula><alternatives>
  <tex-math><![CDATA[\mathrm{L}_\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  has a unique minimiser <inline-formula><alternatives>
  <tex-math><![CDATA[\beta(\lambda)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  for every <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda>0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  Without constraints this holds when the columns of
  <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
  are in general position
  (<xref alt="R. J. Tibshirani, 2013" rid="ref-tibshirani2013" ref-type="bibr">R.
  J. Tibshirani, 2013</xref>), and with constraints when
  <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
  has full column rank
  (<xref alt="Hobson et al., 2026" rid="ref-hobson2026" ref-type="bibr">Hobson
  et al., 2026</xref>, Theorem 6). For constrained problems with
  <inline-formula><alternatives>
  <tex-math><![CDATA[p>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  we know of no such result. The checks of
  Section <xref alt="5" rid="secU003Aevidence">5</xref> test optimality,
  not uniqueness: where the minimiser is not unique, they confirm that
  the path is a path of minimisers.</p>
</sec>
<sec id="secU003Acla">
  <title><named-content content-type="header-section-number">2</named-content>
  The Critical Line Algorithm</title>
  <p>The CLA starts with the portfolio of highest expected return and
  lowers the risk tolerance; between corners, the <italic>turning
  points</italic> or knots, the optimal portfolio moves along a straight
  line. Precisely, it solves the family of quadratic programs
  <styled-content id="eqU003Acla"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:cla}
  \mathrm{P}_\gamma:\quad
  \min_x\ \tfrac12\,x^{\top}\Sigma x-(q+\gamma\mu)^{\top}x
  \quad\text{s.t.}\quad Ax=b,\quad Cx\le h,\quad l\le x\le u,
  \end{equation} \qquad(2)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="normal">P</mml:mi><mml:mi>γ</mml:mi></mml:msub><mml:mo>:</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mi>x</mml:mi></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:mspace width="0.167em"></mml:mspace><mml:msup><mml:mi>x</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>x</mml:mi><mml:mo>−</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>q</mml:mi><mml:mo>+</mml:mo><mml:mi>γ</mml:mi><mml:mi>μ</mml:mi><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>⊤</mml:mi></mml:msup><mml:mi>x</mml:mi><mml:mspace width="1.0em"></mml:mspace><mml:mtext mathvariant="normal">s.t.</mml:mtext><mml:mspace width="1.0em"></mml:mspace><mml:mi>A</mml:mi><mml:mi>x</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>C</mml:mi><mml:mi>x</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>l</mml:mi><mml:mo>≤</mml:mo><mml:mi>x</mml:mi><mml:mo>≤</mml:mo><mml:mi>u</mml:mi><mml:mo>,</mml:mo></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>2</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  for every <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
  from <inline-formula><alternatives>
  <tex-math><![CDATA[+\infty]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>+</mml:mi><mml:mi>∞</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  down to <inline-formula><alternatives>
  <tex-math><![CDATA[0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0</mml:mn></mml:math></alternatives></inline-formula>,
  with <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma\succeq0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>≽</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  Markowitz’s algorithm
  (<xref alt="Markowitz, 1956" rid="ref-markowitz1956" ref-type="bibr">Markowitz,
  1956</xref>) handles general linear constraints; we write them as
  equality rows, inequality rows and bounds, the form
  <monospace>cvxcla</monospace> takes. Here
  <inline-formula><alternatives>
  <tex-math><![CDATA[x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>x</mml:mi></mml:math></alternatives></inline-formula>
  is the vector of holdings, <inline-formula><alternatives>
  <tex-math><![CDATA[\Sigma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>
  the covariance, <inline-formula><alternatives>
  <tex-math><![CDATA[\mu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>μ</mml:mi></mml:math></alternatives></inline-formula>
  the expected returns and <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
  the risk tolerance. The term <inline-formula><alternatives>
  <tex-math><![CDATA[q]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>q</mml:mi></mml:math></alternatives></inline-formula>
  is a benchmark. With <inline-formula><alternatives>
  <tex-math><![CDATA[q=\Sigma\bar x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>q</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:mrow></mml:math></alternatives></inline-formula>
  the objective is, up to a constant, the tracking variance against a
  portfolio <inline-formula><alternatives>
  <tex-math><![CDATA[\bar x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:math></alternatives></inline-formula>
  less <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma\mu^{\top}x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>x</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>:
  the same CLA after the bounds and right-hand side are shifted by
  <inline-formula><alternatives>
  <tex-math><![CDATA[\bar x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:math></alternatives></inline-formula>.
  With <inline-formula><alternatives>
  <tex-math><![CDATA[q=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>q</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  it is Markowitz’s problem.</p>
  <p><bold>Segments</bold> Write <inline-formula><alternatives>
  <tex-math><![CDATA[g=\Sigma x-q-\gamma\mu+A^{\top}\nu+C^{\top}\eta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>g</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mi>x</mml:mi><mml:mo>−</mml:mo><mml:mi>q</mml:mi><mml:mo>−</mml:mo><mml:mi>γ</mml:mi><mml:mi>μ</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi>A</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>ν</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi>C</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>η</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  for the gradient of the Lagrangian. A point
  <inline-formula><alternatives>
  <tex-math><![CDATA[x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>x</mml:mi></mml:math></alternatives></inline-formula>
  with multipliers <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\eta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>η</mml:mi></mml:math></alternatives></inline-formula>
  is optimal when <inline-formula><alternatives>
  <tex-math><![CDATA[g_j=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>g</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  on the <italic>free</italic> coordinates
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal{F}=\{j:l_j<x_j<u_j\}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">ℱ</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mi>j</mml:mi><mml:mo>:</mml:mo><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[g_j\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>g</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  where <inline-formula><alternatives>
  <tex-math><![CDATA[x_j=l_j]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
  and <inline-formula><alternatives>
  <tex-math><![CDATA[g_j\le0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>g</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  where <inline-formula><alternatives>
  <tex-math><![CDATA[x_j=u_j]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
  In addition <inline-formula><alternatives>
  <tex-math><![CDATA[\eta\ge0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>η</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  with <inline-formula><alternatives>
  <tex-math><![CDATA[\eta_i=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>η</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  on every row that is slack, <inline-formula><alternatives>
  <tex-math><![CDATA[C_ix<h_i]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mi>x</mml:mi><mml:mo>&lt;</mml:mo><mml:msub><mml:mi>h</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
  Call the coordinates at a bound <italic>blocked</italic>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal{B}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>,
  and the rows held tight <italic>active</italic>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal{R}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℛ</mml:mi></mml:math></alternatives></inline-formula>.
  An active row is held as an equality. In the system below it is
  stacked under <inline-formula><alternatives>
  <tex-math><![CDATA[A]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>A</mml:mi></mml:math></alternatives></inline-formula>,
  with its right-hand side <inline-formula><alternatives>
  <tex-math><![CDATA[h_i]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>h</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  under <inline-formula><alternatives>
  <tex-math><![CDATA[b]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>b</mml:mi></mml:math></alternatives></inline-formula>
  and its multiplier <inline-formula><alternatives>
  <tex-math><![CDATA[\eta_i]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  under <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>;
  the slack rows take no part. To keep the display short,
  <inline-formula><alternatives>
  <tex-math><![CDATA[A]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>A</mml:mi></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[b]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>b</mml:mi></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  stand for these stacks. With <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal{F}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℱ</mml:mi></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal{B}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal{R}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℛ</mml:mi></mml:math></alternatives></inline-formula>
  fixed, <inline-formula><alternatives>
  <tex-math><![CDATA[x_\mathcal{F}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\nu]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
  solve the bordered system
  <styled-content id="eqU003Aborder"><disp-formula><alternatives>
  <tex-math><![CDATA[\begin{equation}
  \label{eq:border}
  \begin{bmatrix}\Sigma_{\mathcal{F}\mathcal{F}}&A_\mathcal{F}^{\top}\\A_\mathcal{F}&0\end{bmatrix}
  \begin{bmatrix}x_\mathcal{F}\\\nu\end{bmatrix}
  =\begin{bmatrix}q_\mathcal{F}-\Sigma_{\mathcal{F}\mathcal{B}}x_\mathcal{B}\\b-A_\mathcal{B}x_\mathcal{B}\end{bmatrix}
  +\gamma\begin{bmatrix}\mu_\mathcal{F}\\0\end{bmatrix},
  \end{equation} \qquad(3)]]></tex-math>
  <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mrow><mml:mo stretchy="true" form="prefix">[</mml:mo><mml:mtable><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msub><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi mathvariant="script">ℱ</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:mrow></mml:msub></mml:mtd><mml:mtd columnalign="center" style="text-align: center"><mml:msubsup><mml:mi>A</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi><mml:mi>⊤</mml:mi></mml:msubsup></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:msub></mml:mtd><mml:mtd columnalign="center" style="text-align: center"><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable><mml:mo stretchy="true" form="postfix">]</mml:mo></mml:mrow><mml:mrow><mml:mo stretchy="true" form="prefix">[</mml:mo><mml:mtable><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:mi>ν</mml:mi></mml:mtd></mml:mtr></mml:mtable><mml:mo stretchy="true" form="postfix">]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mrow><mml:mo stretchy="true" form="prefix">[</mml:mo><mml:mtable><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msub><mml:mi>q</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mi mathvariant="normal">Σ</mml:mi><mml:mrow><mml:mi mathvariant="script">ℱ</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:mrow></mml:msub><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:mi>b</mml:mi><mml:mo>−</mml:mo><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:mtd></mml:mtr></mml:mtable><mml:mo stretchy="true" form="postfix">]</mml:mo></mml:mrow><mml:mo>+</mml:mo><mml:mi>γ</mml:mi><mml:mrow><mml:mo stretchy="true" form="prefix">[</mml:mo><mml:mtable><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msub><mml:mi>μ</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable><mml:mo stretchy="true" form="postfix">]</mml:mo></mml:mrow><mml:mo>,</mml:mo></mml:mrow><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>3</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
  so <inline-formula><alternatives>
  <tex-math><![CDATA[x_\mathcal{F}=\alpha+\gamma\delta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="script">ℱ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>α</mml:mi><mml:mo>+</mml:mo><mml:mi>γ</mml:mi><mml:mi>δ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[\nu=\nu_0+\gamma\nu_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ν</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>ν</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:mi>γ</mml:mi><mml:msub><mml:mi>ν</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  are affine in <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>.
  The gradient on the blocked coordinates is affine too,
  <inline-formula><alternatives>
  <tex-math><![CDATA[g_\mathcal{B}=g_0+\gamma g_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>g</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>g</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:mi>γ</mml:mi><mml:msub><mml:mi>g</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
  One factorisation and two right-hand sides give the whole segment.</p>
  <p><bold>Events</bold> Lowering <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>,
  the segment ends at the first of four events
  (<xref alt="Schmelzer &amp; Hastie, 2026, Section 2.1" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026, Section 2.1</xref>): a free coordinate reaches a
  bound, a blocked coordinate’s gradient changes sign, a slack row
  becomes tight, or an active row’s multiplier falls to zero. Each is
  the root of an affine function of <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>,
  such as <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma=-g_{0j}/g_{1j}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mi>−</mml:mi><mml:msub><mml:mi>g</mml:mi><mml:mrow><mml:mn>0</mml:mn><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mi>/</mml:mi><mml:msub><mml:mi>g</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
  The coordinate or row concerned changes sides,
  <xref alt="(3)" rid="eqU003Aborder">(3)</xref> is solved again, and
  the walk continues; with no event left, the last segment runs to
  <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.</p>
  <p><bold>The start</bold> As <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma\to\infty]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>→</mml:mo><mml:mi>∞</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  the linear term dominates, and the path starts at a vertex maximising
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mu^{\top}x]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>μ</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>x</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  over the feasible set. A linear program finds it. Suppose the
  maximiser is unique, and as many of its coordinates lie strictly
  inside their bounds as there are equality rows and rows tight at it.
  Then the bordered matrix in
  <xref alt="(3)" rid="eqU003Aborder">(3)</xref> is nonsingular and the
  walk can begin. This is the nondegenerate case;
  <monospace>cvxcla</monospace> declines a degenerate start.</p>
</sec>
<sec id="secU003Aencodings">
  <title><named-content content-type="header-section-number">3</named-content>
  Two encodings</title>
  <sec id="secU003Apenalty">
    <title><named-content content-type="header-section-number">3.1</named-content>
    The penalty form</title>
    <p>The first encoding reads the penalty
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda\lVert \beta\rVert _1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    as a cost: every unit of gross position, long or short, costs
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
    units of return. To make that a linear cost, each coefficient is
    split into a long and a short position, both nonnegative. The
    constraints on <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    become constraints on the positions, unchanged in kind.</p>
    <p>Formally, let <inline-formula><alternatives>
    <tex-math><![CDATA[S]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>S</mml:mi></mml:math></alternatives></inline-formula>
    have a column <inline-formula><alternatives>
    <tex-math><![CDATA[e_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>e</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    for every <inline-formula><alternatives>
    <tex-math><![CDATA[j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>j</mml:mi></mml:math></alternatives></inline-formula>
    with <inline-formula><alternatives>
    <tex-math><![CDATA[u_j>0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and a column <inline-formula><alternatives>
    <tex-math><![CDATA[-e_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:msub><mml:mi>e</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    for every <inline-formula><alternatives>
    <tex-math><![CDATA[j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>j</mml:mi></mml:math></alternatives></inline-formula>
    with <inline-formula><alternatives>
    <tex-math><![CDATA[l_j<0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    so that <inline-formula><alternatives>
    <tex-math><![CDATA[\beta=Sz]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>S</mml:mi><mml:mi>z</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    with <inline-formula><alternatives>
    <tex-math><![CDATA[z\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
    Let <inline-formula><alternatives>
    <tex-math><![CDATA[\bar u]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>u</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:math></alternatives></inline-formula>
    collect the matching bounds <inline-formula><alternatives>
    <tex-math><![CDATA[u_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[-l_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>−</mml:mi><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
    A coefficient whose bounds are both zero is fixed and can be
    dropped. Every <inline-formula><alternatives>
    <tex-math><![CDATA[j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>j</mml:mi></mml:math></alternatives></inline-formula>
    then has at least one column, and <inline-formula><alternatives>
    <tex-math><![CDATA[S]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>S</mml:mi></mml:math></alternatives></inline-formula>
    has full row rank.</p>
    <p id="propU003Apenalty">
      <p><bold>Proposition 1</bold> (Penalty as cost). <italic>For
      <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda>0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[\beta(\lambda)=Sz(\lambda)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
      where <inline-formula><alternatives>
      <tex-math><![CDATA[z(\lambda)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      solves the CLA instance <inline-formula><alternatives>
      <tex-math><![CDATA[\mathrm{P}_\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">P</mml:mi><mml:mi>γ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
      with <disp-formula><alternatives>
      <tex-math><![CDATA[\Sigma=S^{\top}GS,\quad \mu=-\mathbf{1},\quad q=S^{\top}c,\quad
      \text{rows } ASz=b,\ CSz\le h,\quad 0\le z\le\bar u,\quad \gamma=\lambda .]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>G</mml:mi><mml:mi>S</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>μ</mml:mi><mml:mo>=</mml:mo><mml:mi>−</mml:mi><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>q</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>c</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mrow><mml:mtext mathvariant="normal">rows </mml:mtext><mml:mspace width="0.333em"></mml:mspace></mml:mrow><mml:mi>A</mml:mi><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi><mml:mo>,</mml:mo><mml:mspace width="0.222em"></mml:mspace><mml:mi>C</mml:mi><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mn>0</mml:mn><mml:mo>≤</mml:mo><mml:mi>z</mml:mi><mml:mo>≤</mml:mo><mml:mover><mml:mi>u</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mi>λ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></disp-formula>
      Moreover <inline-formula><alternatives>
      <tex-math><![CDATA[q]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>q</mml:mi></mml:math></alternatives></inline-formula>
      lies in the range of <inline-formula><alternatives>
      <tex-math><![CDATA[\Sigma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>,
      so the benchmark reading of
      Section <xref alt="2" rid="secU003Acla">2</xref> applies: the
      program tracks a least-squares fit and pays
      <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
      for every unit of gross position.</italic></p>
    </p>
    <p><italic>Proof.</italic> Up to the constant
    <inline-formula><alternatives>
    <tex-math><![CDATA[\tfrac12\lVert y\rVert ^2]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
    the CLA objective at <inline-formula><alternatives>
    <tex-math><![CDATA[\gamma=\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    is <inline-formula><alternatives>
    <tex-math><![CDATA[\tfrac12\lVert y-XSz\rVert ^2+\lambda\mathbf{1}^{\top}z]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msup><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>y</mml:mi><mml:mo>−</mml:mo><mml:mi>X</mml:mi><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mi>λ</mml:mi><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>z</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
    For a fixed <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    feasible in <xref alt="(1)" rid="eqU003Alasso">(1)</xref>, the
    smallest <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbf{1}^{\top}z]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>z</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    over <inline-formula><alternatives>
    <tex-math><![CDATA[z\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    with <inline-formula><alternatives>
    <tex-math><![CDATA[Sz=\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mi>β</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[z\le\bar u]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>≤</mml:mo><mml:mover><mml:mi>u</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:mrow></mml:math></alternatives></inline-formula>
    is <inline-formula><alternatives>
    <tex-math><![CDATA[\lVert \beta\rVert _1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>.
    The rows hold for every such <inline-formula><alternatives>
    <tex-math><![CDATA[z]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>z</mml:mi></mml:math></alternatives></inline-formula>,
    since they constrain only <inline-formula><alternatives>
    <tex-math><![CDATA[Sz=\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mi>β</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
    It is attained by putting <inline-formula><alternatives>
    <tex-math><![CDATA[\beta_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    on the column of its sign, which respects
    <inline-formula><alternatives>
    <tex-math><![CDATA[\bar u]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>u</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:math></alternatives></inline-formula>
    because <inline-formula><alternatives>
    <tex-math><![CDATA[l_j\le\beta_j\le u_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>.
    The minimum of the CLA program over <inline-formula><alternatives>
    <tex-math><![CDATA[z]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>z</mml:mi></mml:math></alternatives></inline-formula>
    is therefore the minimum of <inline-formula><alternatives>
    <tex-math><![CDATA[\mathrm{L}_\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    over <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>.
    At a minimiser no coordinate holds both signs, since lowering both
    by the same amount keeps <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    and reduces the cost by <inline-formula><alternatives>
    <tex-math><![CDATA[2\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2</mml:mn><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    times that amount. Hence <inline-formula><alternatives>
    <tex-math><![CDATA[Sz(\lambda)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    minimises <inline-formula><alternatives>
    <tex-math><![CDATA[\mathrm{L}_\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>,
    and by uniqueness equals <inline-formula><alternatives>
    <tex-math><![CDATA[\beta(\lambda)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>.
    For the range claim, <inline-formula><alternatives>
    <tex-math><![CDATA[c=X^{\top}y]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    lies in the range of <inline-formula><alternatives>
    <tex-math><![CDATA[G]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>G</mml:mi></mml:math></alternatives></inline-formula>,
    say <inline-formula><alternatives>
    <tex-math><![CDATA[c=Gv]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:mi>G</mml:mi><mml:mi>v</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
    Since <inline-formula><alternatives>
    <tex-math><![CDATA[S]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>S</mml:mi></mml:math></alternatives></inline-formula>
    has full row rank, <inline-formula><alternatives>
    <tex-math><![CDATA[v=S\bar x]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mi>S</mml:mi><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:mrow></mml:math></alternatives></inline-formula>
    for some <inline-formula><alternatives>
    <tex-math><![CDATA[\bar x]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:math></alternatives></inline-formula>,
    and then <inline-formula><alternatives>
    <tex-math><![CDATA[q=S^{\top}GS\bar x=\Sigma\bar x]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>q</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>G</mml:mi><mml:mi>S</mml:mi><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Σ</mml:mi><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:mrow></mml:math></alternatives></inline-formula>,
    where <inline-formula><alternatives>
    <tex-math><![CDATA[S\bar x]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>S</mml:mi><mml:mover><mml:mi>x</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:mrow></mml:math></alternatives></inline-formula>
    is a least-squares fit. ◻</p>
    <p>The covariance <inline-formula><alternatives>
    <tex-math><![CDATA[S^{\top}GS]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>G</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    is singular when both signs of a coefficient are allowed, but
    <xref alt="(3)" rid="eqU003Aborder">(3)</xref> is not. For
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda>0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    the proof keeps the two halves of a coefficient out of
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal{F}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℱ</mml:mi></mml:math></alternatives></inline-formula>
    together. On the free coordinates <inline-formula><alternatives>
    <tex-math><![CDATA[\Sigma]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="normal">Σ</mml:mi></mml:math></alternatives></inline-formula>
    is then positive definite on the null space of the active rows, the
    standing assumption of Schmelzer &amp; Hastie
    (<xref alt="2026, Section 2" rid="ref-perspective" ref-type="bibr">2026,
    Section 2</xref>). The halves come apart only at
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    which rounding can move to <inline-formula><alternatives>
    <tex-math><![CDATA[\gamma\approx10^{-16}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>≈</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>;
    <monospace>cvxcla</monospace> treats an event whose parameter is
    round-off as one at <inline-formula><alternatives>
    <tex-math><![CDATA[\gamma=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.</p>
    <p>Figure <xref alt="2" rid="figU003Apath">2</xref>(a) shows the
    penalty form on the diabetes data
    (<xref alt="Efron et al., 2004" rid="ref-efron2004" ref-type="bibr">Efron
    et al., 2004</xref>), where there are no constraints and LARS can
    check every knot.</p>
    <fig id="figU003Apath">
      <caption><p>The diabetes LASSO path
      (<xref alt="Efron et al., 2004" rid="ref-efron2004" ref-type="bibr">Efron
      et al., 2004</xref>), both ways. <italic>(a)</italic> The CLA in
      the penalty form (lines) and the knots
      <monospace>lars_path</monospace> returns
      (<xref alt="Pedregosa et al., 2011" rid="ref-sklearn" ref-type="bibr"><named-content content-type="nocase">Pedregosa
      et al.</named-content>, 2011</xref>) (circles); all 13 agree to
      <inline-formula><alternatives>
      <tex-math><![CDATA[6.9\times 10^{-14}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
      relative. <italic>(b)</italic> The same path seen by the budget
      form as a portfolio: the long and short positions
      <inline-formula><alternatives>
      <tex-math><![CDATA[Sw]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>S</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      and the cash weight <inline-formula><alternatives>
      <tex-math><![CDATA[w_0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>w</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
      share a budget of one, against the leverage
      <inline-formula><alternatives>
      <tex-math><![CDATA[t=1/\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mi>γ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
      Cash enters at <inline-formula><alternatives>
      <tex-math><![CDATA[t=\lVert \beta(0)\rVert _1=3460]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>0</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn>3460</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      the end of the LASSO path; to its right the least-squares fit is
      diluted by cash.</p></caption>
      <p><inline-graphic mimetype="application" mime-subtype="pdf" xlink:href="path.pdf">
        <alt-text>image</alt-text>
      </inline-graphic>
      <inline-graphic mimetype="application" mime-subtype="pdf" xlink:href="portfolio.pdf">
        <alt-text>image</alt-text>
      </inline-graphic></p>
    </fig>
  </sec>
  <sec id="secU003Abudget">
    <title><named-content content-type="header-section-number">3.2</named-content>
    The budget form</title>
    <p>With <inline-formula><alternatives>
    <tex-math><![CDATA[A\beta=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    the penalty form starts degenerate
    (Section <xref alt="4" rid="secU003Astarts">4</xref>). The second
    encoding starts instead from the bound
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lVert \beta\rVert _1\le t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    a cap <inline-formula><alternatives>
    <tex-math><![CDATA[t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>
    on the leverage, whose path is that of
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathrm{L}_\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    indexed by <inline-formula><alternatives>
    <tex-math><![CDATA[t=\lVert \beta(\lambda)\rVert _1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
    &amp; Hastie, 2026</xref>, Theorem 1), and divides by
    <inline-formula><alternatives>
    <tex-math><![CDATA[t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>.
    The split coefficients then add up to at most one, which is
    Markowitz’s own setting. A cash asset with no risk and no return
    holds the rest.</p>
    <p id="propU003Abudget">
      <p><bold>Proposition 2</bold> (Budget as simplex). <italic>Suppose
      <inline-formula><alternatives>
      <tex-math><![CDATA[b=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[l_j,u_j\in\{0,\pm\infty\}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mi>±</mml:mi><mml:mi>∞</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
      so that every constraint is homogeneous. Write
      <inline-formula><alternatives>
      <tex-math><![CDATA[\beta=tSw]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>t</mml:mi><mml:mi>S</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      with <inline-formula><alternatives>
      <tex-math><![CDATA[w\ge0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      and add a riskless asset <inline-formula><alternatives>
      <tex-math><![CDATA[w_0\ge0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      with <inline-formula><alternatives>
      <tex-math><![CDATA[\mathbf{1}^{\top}w+w_0=1]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
      Then for <inline-formula><alternatives>
      <tex-math><![CDATA[t>0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      the bound-form LASSO is the CLA instance
      <disp-formula><alternatives>
      <tex-math><![CDATA[\Sigma=\begin{bmatrix}S^{\top}GS&0\\0&0\end{bmatrix},\quad
      \mu=\begin{bmatrix}S^{\top}c\\0\end{bmatrix},\quad q=0,\quad \gamma=1/t,]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="normal">Σ</mml:mi><mml:mo>=</mml:mo><mml:mrow><mml:mo stretchy="true" form="prefix">[</mml:mo><mml:mtable><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>G</mml:mi><mml:mi>S</mml:mi></mml:mtd><mml:mtd columnalign="center" style="text-align: center"><mml:mn>0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:mn>0</mml:mn></mml:mtd><mml:mtd columnalign="center" style="text-align: center"><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable><mml:mo stretchy="true" form="postfix">]</mml:mo></mml:mrow><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>μ</mml:mi><mml:mo>=</mml:mo><mml:mrow><mml:mo stretchy="true" form="prefix">[</mml:mo><mml:mtable><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>c</mml:mi></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="center" style="text-align: center"><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable><mml:mo stretchy="true" form="postfix">]</mml:mo></mml:mrow><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>q</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mspace width="1.0em"></mml:mspace><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mi>/</mml:mi><mml:mi>t</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></alternatives></disp-formula>
      with rows <inline-formula><alternatives>
      <tex-math><![CDATA[\mathbf{1}^{\top}w+w_0=1]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>w</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[ASw=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>S</mml:mi><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      and bounds <inline-formula><alternatives>
      <tex-math><![CDATA[w,w_0\ge0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>w</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn>0</mml:mn></mml:msub><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
      This is Markowitz’s long-only, fully invested problem with a cash
      asset of zero variance and zero return. If
      <inline-formula><alternatives>
      <tex-math><![CDATA[\eta]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>η</mml:mi></mml:math></alternatives></inline-formula>
      is the multiplier of the budget row and
      <inline-formula><alternatives>
      <tex-math><![CDATA[\nu]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ν</mml:mi></mml:math></alternatives></inline-formula>
      those of <inline-formula><alternatives>
      <tex-math><![CDATA[ASw=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>S</mml:mi><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      then <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda=t\eta]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mi>t</mml:mi><mml:mi>η</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      and the LASSO’s multipliers for <inline-formula><alternatives>
      <tex-math><![CDATA[A\beta=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      are <inline-formula><alternatives>
      <tex-math><![CDATA[t\nu]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mi>ν</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</italic></p>
    </p>
    <p><italic>Proof.</italic> As in
    Proposition <xref alt="1" rid="propU003Apenalty">1</xref>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lVert \beta\rVert _1\le t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>≤</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    is <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbf{1}^{\top}z\le t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>z</mml:mi><mml:mo>≤</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    for the split <inline-formula><alternatives>
    <tex-math><![CDATA[z=tw]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mi>t</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    and <inline-formula><alternatives>
    <tex-math><![CDATA[w_0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>w</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
    is its slack. The constraint <inline-formula><alternatives>
    <tex-math><![CDATA[ASz=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    is unchanged by the scale <inline-formula><alternatives>
    <tex-math><![CDATA[t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>,
    which is where homogeneity is needed. A nonzero right-hand side
    would become <inline-formula><alternatives>
    <tex-math><![CDATA[b/t=\gamma b]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mi>/</mml:mi><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mi>γ</mml:mi><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    a constraint that moves with the parameter. Substituting
    <inline-formula><alternatives>
    <tex-math><![CDATA[z=tw]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mi>t</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    gives the objective <inline-formula><alternatives>
    <tex-math><![CDATA[t^2(\tfrac12w^{\top}S^{\top}GSw-\gamma c^{\top}Sw)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>t</mml:mi><mml:mn>2</mml:mn></mml:msup><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:msup><mml:mi>w</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>G</mml:mi><mml:mi>S</mml:mi><mml:mi>w</mml:mi><mml:mo>−</mml:mo><mml:mi>γ</mml:mi><mml:msup><mml:mi>c</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>S</mml:mi><mml:mi>w</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    plus a constant, and dividing by <inline-formula><alternatives>
    <tex-math><![CDATA[t^2>0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>t</mml:mi><mml:mn>2</mml:mn></mml:msup><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    gives <inline-formula><alternatives>
    <tex-math><![CDATA[\mathrm{P}_\gamma]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">P</mml:mi><mml:mi>γ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>.
    For the multipliers, multiply the CLA’s stationarity row for a free
    coordinate, <inline-formula><alternatives>
    <tex-math><![CDATA[(S^{\top}GSw)_j-\gamma(S^{\top}c)_j+\eta+(S^{\top}A^{\top}\nu)_j=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>G</mml:mi><mml:mi>S</mml:mi><mml:mi>w</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>−</mml:mo><mml:mi>γ</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>c</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi>η</mml:mi><mml:mo>+</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:msup><mml:mi>A</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>ν</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    by <inline-formula><alternatives>
    <tex-math><![CDATA[t]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>t</mml:mi></mml:math></alternatives></inline-formula>.
    This gives <inline-formula><alternatives>
    <tex-math><![CDATA[(S^{\top}(G\beta-c))_j+t\eta+(S^{\top}A^{\top}t\nu)_j=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>G</mml:mi><mml:mi>β</mml:mi><mml:mo>−</mml:mo><mml:mi>c</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi>t</mml:mi><mml:mi>η</mml:mi><mml:mo>+</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:msup><mml:mi>A</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>t</mml:mi><mml:mi>ν</mml:mi><mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    the LASSO’s stationarity condition with penalty
    <inline-formula><alternatives>
    <tex-math><![CDATA[t\eta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mi>η</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    and constraint multipliers <inline-formula><alternatives>
    <tex-math><![CDATA[t\nu]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mi>ν</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
    The cash row reads <inline-formula><alternatives>
    <tex-math><![CDATA[\eta\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>η</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    while cash is held at zero. ◻</p>
    <p>The two forms give the same knots unless the support’s sign
    vector lies in the span of the active constraint normals
    (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
    &amp; Hastie, 2026</xref>, ​Corollary 1 and Proposition 1). Under a
    zero sum that never happens: a nonzero
    <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    that sums to zero has coefficients of both signs.</p>
  </sec>
</sec>
<sec id="secU003Astarts">
  <title><named-content content-type="header-section-number">4</named-content>
  Where the path starts and ends</title>
  <p>The two encodings differ most at the ends of the path. A
  nondegenerate start lets the walk begin at once; a degenerate one
  needs a relaxation.</p>
  <p><bold>Nondegenerate starts</bold> In the penalty form without
  equality rows the starting vertex is <inline-formula><alternatives>
  <tex-math><![CDATA[z=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>:
  all positions are closed, because each costs more than it can earn.
  The first event is the first entry, at <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma=\max_j|c_j|]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>c</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  over the allowed signs, which is LARS’s <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda_{\max}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>λ</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:math></alternatives></inline-formula>.
  Rows <inline-formula><alternatives>
  <tex-math><![CDATA[C\beta\le h]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  with <inline-formula><alternatives>
  <tex-math><![CDATA[h>0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>h</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  are slack at <inline-formula><alternatives>
  <tex-math><![CDATA[z=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  so they leave the start unchanged, and a row joins the active set when
  the path reaches it, like a bound. With equality rows, or a row with
  <inline-formula><alternatives>
  <tex-math><![CDATA[h_r<0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>h</mml:mi><mml:mi>r</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  that leaves <inline-formula><alternatives>
  <tex-math><![CDATA[z=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  infeasible, the start is the linear program
  <inline-formula><alternatives>
  <tex-math><![CDATA[\min\mathbf{1}^{\top}z]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">min</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>z</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  over <inline-formula><alternatives>
  <tex-math><![CDATA[ASz=b]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[CSz\le h]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>S</mml:mi><mml:mi>z</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[0\le z\le\bar u]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>0</mml:mn><mml:mo>≤</mml:mo><mml:mi>z</mml:mi><mml:mo>≤</mml:mo><mml:mover><mml:mi>u</mml:mi><mml:mo accent="true">‾</mml:mo></mml:mover></mml:mrow></mml:math></alternatives></inline-formula>:
  the point of smallest <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  norm on the constraint set. For generic <inline-formula><alternatives>
  <tex-math><![CDATA[A]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>A</mml:mi></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[b\ne0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>≠</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  it is a unique vertex with <inline-formula><alternatives>
  <tex-math><![CDATA[m]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>m</mml:mi></mml:math></alternatives></inline-formula>
  nonzeros, and the path holds still there,
  <inline-formula><alternatives>
  <tex-math><![CDATA[\delta=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>δ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  until a second coefficient enters. In general, every constrained LASSO
  path is constant from some <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>λ</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  on, at a least-squares fit over the feasible points of smallest
  <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  norm, and <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda_0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>λ</mml:mi><mml:mn>0</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  takes the place of <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda_{\max}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>λ</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026</xref>, Proposition 3). That fit can take a
  quadratic program to find. Under the fully invested constraint
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf{1}^{\top}\beta=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  of sparse portfolio regression
  (<xref alt="Brodie et al., 2009" rid="ref-brodie2009" ref-type="bibr">Brodie
  et al., 2009</xref>) every long-only <inline-formula><alternatives>
  <tex-math><![CDATA[\beta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
  in the simplex has <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert \beta\rVert _1=1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mn>1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  so the starting linear program is not unique;
  <monospace>cvxcla</monospace> starts on the tied face where its
  quadratic term is smallest, which is that fit.</p>
  <p>In the budget form the start, at <inline-formula><alternatives>
  <tex-math><![CDATA[\gamma=\infty]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mi>∞</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[t=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  is the linear program <inline-formula><alternatives>
  <tex-math><![CDATA[\max c^{\top}Sw]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>S</mml:mi><mml:mi>w</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  over the simplex: put the whole budget on the best asset. Without
  equality rows that is the predictor most correlated with the response.
  It enters with the sign of its correlation and with
  <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda=\lim\eta/\gamma=\max_j|c_j|]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mrow><mml:mi mathvariant="normal">lim</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>η</mml:mi><mml:mi>/</mml:mi><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>c</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
  just as in LARS. Under <inline-formula><alternatives>
  <tex-math><![CDATA[\mathbf{1}^{\top}\beta=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  it is one long and one short position of weight
  <inline-formula><alternatives>
  <tex-math><![CDATA[\tfrac12]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle></mml:math></alternatives></inline-formula>
  each, the most and the least correlated predictors, entering together.
  That is why two coefficients leave zero at once in
  Figure <xref alt="3" rid="figU003Areal">3</xref>. Both starts are
  generically unique and nondegenerate.</p>
  <p><bold>Degenerate starts</bold> With <inline-formula><alternatives>
  <tex-math><![CDATA[b=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  the penalty form’s starting vertex is <inline-formula><alternatives>
  <tex-math><![CDATA[z=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
  with no free coordinates for <inline-formula><alternatives>
  <tex-math><![CDATA[m>0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>m</mml:mi><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
  rows. This is a degenerate vertex: the multipliers at the start are
  not determined by the active set, and
  <xref alt="(3)" rid="eqU003Aborder">(3)</xref> is singular. For
  homogeneous equality rows with signs the budget form is the remedy,
  because rescaling to the simplex moves the start off the origin. It
  cannot take rows or caps, which move with the parameter once rescaled
  (Proposition <xref alt="2" rid="propU003Abudget">2</xref>). Caps or
  inequality rows under a zero sum therefore leave only the penalty
  form, which starts degenerate there. So do homogeneous rows
  (<inline-formula><alternatives>
  <tex-math><![CDATA[h=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>h</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>),
  such as the ordering constraints of a monotone fit: all are tight at
  <inline-formula><alternatives>
  <tex-math><![CDATA[\beta=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.</p>
  <p><monospace>cvxcla</monospace> resolves both by relaxation, an
  implementation device rather than part of the method. It traces the
  problem twice, with the homogeneous rows relaxed to
  <inline-formula><alternatives>
  <tex-math><![CDATA[h_r=\varepsilon]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>h</mml:mi><mml:mi>r</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>ε</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[2\varepsilon]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2</mml:mn><mml:mi>ε</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and a zero sum to <inline-formula><alternatives>
  <tex-math><![CDATA[A\beta=\varepsilon Ad]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>ε</mml:mi><mml:mi>A</mml:mi><mml:mi>d</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[2\varepsilon Ad]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2</mml:mn><mml:mi>ε</mml:mi><mml:mi>A</mml:mi><mml:mi>d</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  for a generic feasible point <inline-formula><alternatives>
  <tex-math><![CDATA[d]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>d</mml:mi></mml:math></alternatives></inline-formula>.
  In release 2.7.1, <inline-formula><alternatives>
  <tex-math><![CDATA[\varepsilon]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ε</mml:mi></mml:math></alternatives></inline-formula>
  is <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-6}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  times the scale <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert c\rVert _\infty/\max_jG_{jj}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>c</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub><mml:mi>/</mml:mi><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  of a coefficient, then <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-7}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>7</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-8}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  times it if needed. Both runs start nondegenerate. The relaxation
  enters only the right-hand side of
  <xref alt="(3)" rid="eqU003Aborder">(3)</xref>, so where the two runs
  pass through the same active sets their knots are affine in
  <inline-formula><alternatives>
  <tex-math><![CDATA[\varepsilon]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ε</mml:mi></mml:math></alternatives></inline-formula>,
  and <inline-formula><alternatives>
  <tex-math><![CDATA[2(\lambda_k,\beta_k)(\varepsilon)-(\lambda_k,\beta_k)(2\varepsilon)]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2</mml:mn><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>λ</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ε</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>−</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>λ</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>2</mml:mn><mml:mi>ε</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
  is the knot at <inline-formula><alternatives>
  <tex-math><![CDATA[\varepsilon=0]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ε</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
  That condition cannot be checked in advance.
  <monospace>cvxcla</monospace> therefore returns the extrapolated path
  only if a linear program finds multipliers that satisfy the optimality
  conditions of <xref alt="(1)" rid="eqU003Alasso">(1)</xref> at every
  knot and segment midpoint, to <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-9}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  relative to <inline-formula><alternatives>
  <tex-math><![CDATA[\lVert c\rVert _\infty]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>c</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub></mml:math></alternatives></inline-formula>.
  Otherwise it retries with the next <inline-formula><alternatives>
  <tex-math><![CDATA[\varepsilon]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ε</mml:mi></mml:math></alternatives></inline-formula>
  and, after the last, declines. The extrapolation only proposes a path;
  the certificate is what guarantees the path returned. The paths it
  returns are checked again, like every other path, in
  Section <xref alt="5" rid="secU003Aevidence">5</xref>.</p>
  <p><bold>The end of the path</bold> As <inline-formula><alternatives>
  <tex-math><![CDATA[\lambda\to0^+]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>→</mml:mo><mml:msup><mml:mn>0</mml:mn><mml:mo>+</mml:mo></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
  the path ends at the least-squares fit of smallest
  <inline-formula><alternatives>
  <tex-math><![CDATA[\ell_1]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
  norm under the constraints
  (<xref alt="Schmelzer &amp; Hastie, 2026" rid="ref-perspective" ref-type="bibr">Schmelzer
  &amp; Hastie, 2026</xref>, Proposition 3). In the budget form this is
  where cash leaves its bound, its gradient
  <inline-formula><alternatives>
  <tex-math><![CDATA[\eta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>η</mml:mi></mml:math></alternatives></inline-formula>
  reaching zero (Figure <xref alt="2" rid="figU003Apath">2</xref>(b)),
  and the run stops there. With <inline-formula><alternatives>
  <tex-math><![CDATA[p>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  the end is an interpolating fit, and there that event wins a tie,
  since every correlation vanishes together with
  <inline-formula><alternatives>
  <tex-math><![CDATA[\eta]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>η</mml:mi></mml:math></alternatives></inline-formula>.
  <inline-formula><alternatives>
  <tex-math><![CDATA[X^{\top}X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  is then singular, but the bordered system needs a positive definite
  Hessian only on the null space of the active rows, the standing
  assumption of Schmelzer &amp; Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>),
  so the free set can outgrow the rank of <inline-formula><alternatives>
  <tex-math><![CDATA[X]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>.
  The other path algorithms for general constraints add a ridge:
  <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-4}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  in Gaines et al. when <inline-formula><alternatives>
  <tex-math><![CDATA[n<p]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>&lt;</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
  <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-3}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>3</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  in <monospace>c-lasso</monospace>, and <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-4}\max_j G_{jj}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
  in CLASSO. At that ridge the authors of CLASSO report objectives up to
  <inline-formula><alternatives>
  <tex-math><![CDATA[4\times10^{-2}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  relative, above the unregularised ones
  (<xref alt="Hobson et al., 2026" rid="ref-hobson2026" ref-type="bibr">Hobson
  et al., 2026</xref>, Table 3). Each then traces a nearby problem whose
  path ends elsewhere.</p>
  <p><bold>Algorithm 1: the constrained LASSO path from a
  CLA.</bold></p>
  <list list-type="order">
    <list-item>
      <p>Form <inline-formula><alternatives>
      <tex-math><![CDATA[G=X^{\top}X]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>G</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[c=X^{\top}y]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>y</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      and the split <inline-formula><alternatives>
      <tex-math><![CDATA[S]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>S</mml:mi></mml:math></alternatives></inline-formula>
      of Section <xref alt="3.1" rid="secU003Apenalty">3.1</xref>.</p>
    </list-item>
    <list-item>
      <p>If there are equality rows and every constraint is homogeneous
      (<inline-formula><alternatives>
      <tex-math><![CDATA[b=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[l_j,u_j\in\{0,\pm\infty\}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mi>±</mml:mi><mml:mi>∞</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
      no inequality rows), use the budget form of
      Proposition <xref alt="2" rid="propU003Abudget">2</xref>. Run the
      CLA from <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma=\infty]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mi>∞</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      and stop when cash leaves zero. A turning point at
      <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
      with budget multiplier <inline-formula><alternatives>
      <tex-math><![CDATA[\eta]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>η</mml:mi></mml:math></alternatives></inline-formula>
      is the knot <inline-formula><alternatives>
      <tex-math><![CDATA[\beta=Sw/\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>S</mml:mi><mml:mi>w</mml:mi><mml:mi>/</mml:mi><mml:mi>γ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      at <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda=\eta/\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mi>η</mml:mi><mml:mi>/</mml:mi><mml:mi>γ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</p>
    </list-item>
    <list-item>
      <p>Otherwise use the penalty form of
      Proposition <xref alt="1" rid="propU003Apenalty">1</xref> and run
      the CLA from <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma=\infty]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>=</mml:mo><mml:mi>∞</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      to <inline-formula><alternatives>
      <tex-math><![CDATA[0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0</mml:mn></mml:math></alternatives></inline-formula>.
      A turning point at <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
      is the knot <inline-formula><alternatives>
      <tex-math><![CDATA[\beta=Sz]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>S</mml:mi><mml:mi>z</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      at <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda=\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mi>γ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
      With <inline-formula><alternatives>
      <tex-math><![CDATA[b\ne0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>≠</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      or a row with <inline-formula><alternatives>
      <tex-math><![CDATA[h_r<0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>h</mml:mi><mml:mi>r</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      the start is the feasible point of smallest
      <inline-formula><alternatives>
      <tex-math><![CDATA[\ell_1]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>ℓ</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:math></alternatives></inline-formula>
      norm.</p>
    </list-item>
    <list-item>
      <p>If the start is degenerate, trace the penalty form twice, with
      the homogeneous rows relaxed by <inline-formula><alternatives>
      <tex-math><![CDATA[\varepsilon]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ε</mml:mi></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[2\varepsilon]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2</mml:mn><mml:mi>ε</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
      extrapolate the knots to <inline-formula><alternatives>
      <tex-math><![CDATA[\varepsilon=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ε</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      and return the path only if it passes the certificate.</p>
    </list-item>
    <list-item>
      <p>Between two knots <inline-formula><alternatives>
      <tex-math><![CDATA[\beta]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
      is affine in <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>,
      so any other point on the path is an interpolation.</p>
    </list-item>
  </list>
  <p><monospace>cvxcla.Lasso(X, y, a=A, b=b, g=C, h=h, lower=l, upper=u)</monospace>
  (release 2.7.1) carries out steps 1–5 and returns the knots. With no
  constraint at all it traces the plain LASSO by a homotopy instead.</p>
</sec>
<sec id="secU003Aevidence">
  <title><named-content content-type="header-section-number">5</named-content>
  Numerical evidence</title>
  <p>Each check tests a prediction of Schmelzer &amp; Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>).
  Their Lemma 1 makes <inline-formula><alternatives>
  <tex-math><![CDATA[\mathrm{L}_\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
  and the CLA one parametric quadratic program, so the penalty form
  should return the knots of <inline-formula><alternatives>
  <tex-math><![CDATA[\mathrm{L}_\lambda]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="normal">L</mml:mi><mml:mi>λ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>:
  LARS tests this knot by knot where it applies, and the interior-point
  solver and the optimality conditions everywhere. Their Theorem 1 and
  Corollary 1 give the bound form the same knots, so the budget form
  should return them too: comlasso and <monospace>c-lasso</monospace>
  test this on the zero sums.</p>
  <sec id="secU003Achecks">
    <title><named-content content-type="header-section-number">5.1</named-content>
    Test problems and checks</title>
    <p>Table <xref alt="2" rid="tabU003Aevidence">2</xref> lists the
    test problems and their constraints. The diabetes problems use the
    data of Section <xref alt="1" rid="secU003Aexample">1</xref>, with
    the response centred, and <italic>Box</italic> is the opening
    example. <italic>Nonnegative</italic> carries the one constraint
    <monospace>lars_path</monospace> accepts. In
    <italic>Cholesterol</italic>, <inline-formula><alternatives>
    <tex-math><![CDATA[h]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>h</mml:mi></mml:math></alternatives></inline-formula>
    is half the least-squares net effect of the three cholesterol
    measures, and the two rows bind at the end of the path.
    <italic>Pinned</italic> fits the first patient exactly, one
    nonhomogeneous equality row; its path holds still at its starting
    vertex until <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=4053]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>4053</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
    <italic>Wide</italic> is a Gaussian design with 8 nonzero
    coefficients and noise of standard deviation
    <inline-formula><alternatives>
    <tex-math><![CDATA[0.5]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.5</mml:mn></mml:math></alternatives></inline-formula>.
    <italic>Zero-sum</italic> is a regression on compositional data in
    the style of Lin et
    al. (<xref alt="Lin et al., 2014" rid="ref-lin2014" ref-type="bibr">Lin
    et al., 2014</xref>), with the log-shares of
    <inline-formula><alternatives>
    <tex-math><![CDATA[p]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>p</mml:mi></mml:math></alternatives></inline-formula>
    parts as predictors. A composition is known only up to scale, so
    only a zero sum makes the fit independent of the units. Five parts
    have nonzero true coefficients. The signs of <italic>Zero-sum,
    signs</italic> fall on the even-numbered parts, which the truth
    meets. The caps of <italic>Zero-sum, caps</italic> are at half the
    largest zero-sum least-squares coefficient.
    <italic>Monotone</italic> is a Gaussian design with
    <inline-formula><alternatives>
    <tex-math><![CDATA[n=100]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[p=10]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>10</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and an ordered truth, under the rows <inline-formula><alternatives>
    <tex-math><![CDATA[\beta_j-\beta_{j+1}\le0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub><mml:mo>≤</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
    <italic>Sum to one</italic> predicts one unit’s outcomes over 40
    periods from those of 20 donors with weights that sum to one. Unlike
    the classic synthetic control
    (<xref alt="Abadie et al., 2010" rid="ref-abadie2010" ref-type="bibr">Abadie
    et al., 2010</xref>), which also requires the weights to be
    nonnegative, the weights here may be negative; adding the signs
    would be one more bound. <italic>Floor</italic>, not in the table,
    is the diabetes LASSO with <inline-formula><alternatives>
    <tex-math><![CDATA[\beta_{\texttt{bmi}}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>β</mml:mi><mml:mtext mathvariant="monospace">𝚋𝚖𝚒</mml:mtext></mml:msub></mml:math></alternatives></inline-formula>
    at least half its least-squares value, a row that leaves
    <inline-formula><alternatives>
    <tex-math><![CDATA[\beta=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    infeasible. Its path has 13 knots. It lies within
    <inline-formula><alternatives>
    <tex-math><![CDATA[1.1\times 10^{-10}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    of an interior-point solve at every midpoint and meets the
    optimality conditions to <inline-formula><alternatives>
    <tex-math><![CDATA[1.0\times 10^{-15}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
    <italic>sCD14</italic> is the same model on real data from a study
    of the gut microbiome in HIV infection
    (<xref alt="Noguera-Julian et al., 2016" rid="ref-noguerajulian2016" ref-type="bibr"><named-content content-type="nocase">Noguera-Julian
    et al.</named-content>, 2016</xref>), as distributed with the R
    package <monospace>coda4microbiome</monospace>
    (<xref alt="Calle et al., 2023" rid="ref-calle2023" ref-type="bibr">Calle
    et al., 2023</xref>). The predictors come from the counts of 60
    bacterial genera in 151 stool samples, and the response is the level
    of sCD14, a marker of inflammation, in thousands. Each count gets a
    pseudocount of one, since a zero has no logarithm, and the
    predictors are the centred log-shares. Its path has 60 knots
    (Figure <xref alt="3" rid="figU003Areal">3</xref>). Like the
    diabetes problems, <italic>sCD14</italic> is a computational
    demonstration on real data. No biological inference is intended, and
    none should be drawn from its path.</p>
    <fig id="figU003Areal">
      <caption><p>The zero-sum LASSO of sCD14 on the log-shares of 60
      genera
      (<xref alt="Noguera-Julian et al., 2016" rid="ref-noguerajulian2016" ref-type="bibr"><named-content content-type="nocase">Noguera-Julian
      et al.</named-content>, 2016</xref>): the path by the CLA in the
      budget form. The eight genera largest at
      <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
      are drawn in a colourblind-safe palette
      (<xref alt="Okabe &amp; Ito, 2008" rid="ref-okabe2008" ref-type="bibr">Okabe
      &amp; Ito, 2008</xref>) and labelled at their right-hand end, the
      others in grey, with an interior-point solve at every third
      segment midpoint for those eight (circles).
      Table <xref alt="2" rid="tabU003Aevidence">2</xref> checks every
      midpoint of every coefficient. The axis is that of
      Figure <xref alt="1" rid="figU003Aexample">1</xref>:
      <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
      decreasing, symmetric-log, linear below
      <inline-formula><alternatives>
      <tex-math><![CDATA[\lambda_{\max}/50]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>λ</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub><mml:mi>/</mml:mi><mml:mn>50</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>.
      A computational demonstration; no biological inference is
      drawn.</p></caption>
      <graphic mimetype="application" mime-subtype="pdf" xlink:href="scd14.pdf" />
    </fig>
    <p>Every path comes from <monospace>cvxcla.Lasso</monospace> 2.7.1.
    The bounds are passed even where they are infinite, so that the CLA
    computes it. Where LARS applies it is the reference, compared knot
    by knot in both <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>.
    Elsewhere the reference is an interior-point solve (Clarabel through
    CVXPY, tolerances <inline-formula><alternatives>
    <tex-math><![CDATA[10^{-12}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>)
    at the midpoint of every segment. There the path is affine in
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>,
    so it is known exactly from its two ends. This comparison is only as
    sharp as the solver. Its largest gap in
    Table <xref alt="2" rid="tabU003Aevidence">2</xref> is
    <inline-formula><alternatives>
    <tex-math><![CDATA[4.8\times 10^{-8}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
    relative, on a path whose optimality conditions hold to rounding.
    The third check evaluates the optimality conditions of
    <xref alt="(1)" rid="eqU003Alasso">(1)</xref> directly at every knot
    and along every segment. Its unknowns are the multipliers
    <inline-formula><alternatives>
    <tex-math><![CDATA[\kappa]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>κ</mml:mi></mml:math></alternatives></inline-formula>
    of <inline-formula><alternatives>
    <tex-math><![CDATA[A\beta=b]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\eta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>η</mml:mi></mml:math></alternatives></inline-formula>
    of the active rows of <inline-formula><alternatives>
    <tex-math><![CDATA[C\beta\le h]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
    A linear program chooses them, under <inline-formula><alternatives>
    <tex-math><![CDATA[\eta\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>η</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    to minimise one number <inline-formula><alternatives>
    <tex-math><![CDATA[\tau]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>τ</mml:mi></mml:math></alternatives></inline-formula>:
    the largest violation of all the conditions below, taken jointly.
    Each condition, written as an inequality
    <inline-formula><alternatives>
    <tex-math><![CDATA[\phi_i(\kappa,\eta)\le0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ϕ</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>κ</mml:mi><mml:mo>,</mml:mo><mml:mi>η</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>≤</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    that is affine in the multipliers, becomes the row
    <inline-formula><alternatives>
    <tex-math><![CDATA[\phi_i(\kappa,\eta)\le\tau]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>ϕ</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>κ</mml:mi><mml:mo>,</mml:mo><mml:mi>η</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>≤</mml:mo><mml:mi>τ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    and the program minimises <inline-formula><alternatives>
    <tex-math><![CDATA[\tau]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>τ</mml:mi></mml:math></alternatives></inline-formula>.
    Its optimum is zero exactly when <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    is optimal. The violation is then evaluated again, exactly, at the
    multipliers found, so the solver’s own tolerance cannot hide one. A
    small reported value therefore certifies optimality to that size,
    and a real violation cannot be masked: no choice of multipliers
    brings it below the optimum of the program. With
    <inline-formula><alternatives>
    <tex-math><![CDATA[r=G\beta-c+A^{\top}\kappa+C^{\top}\eta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>r</mml:mi><mml:mo>=</mml:mo><mml:mi>G</mml:mi><mml:mi>β</mml:mi><mml:mo>−</mml:mo><mml:mi>c</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi>A</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>κ</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi>C</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>η</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    the conditions are <inline-formula><alternatives>
    <tex-math><![CDATA[r_j=-\lambda\operatorname{sign}\beta_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>−</mml:mi><mml:mi>λ</mml:mi><mml:mrow><mml:mi mathvariant="normal">sign</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    on the interior of the support; <inline-formula><alternatives>
    <tex-math><![CDATA[|r_j|\le\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>r</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    at zero, or only <inline-formula><alternatives>
    <tex-math><![CDATA[r_j\ge-\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:mi>−</mml:mi><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    under <inline-formula><alternatives>
    <tex-math><![CDATA[\beta_j\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[r_j\le\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    under <inline-formula><alternatives>
    <tex-math><![CDATA[\beta_j\le0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>;
    <inline-formula><alternatives>
    <tex-math><![CDATA[r_j\le-\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:mi>−</mml:mi><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    at a cap <inline-formula><alternatives>
    <tex-math><![CDATA[u_j>0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>&gt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[r_j\ge\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    at a floor <inline-formula><alternatives>
    <tex-math><![CDATA[l_j<0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>;
    <inline-formula><alternatives>
    <tex-math><![CDATA[\eta\ge0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>η</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>;
    and primal feasibility. The check covers each segment whole, not
    only its midpoint, as Hobson et
    al. (<xref alt="2026" rid="ref-hobson2026" ref-type="bibr">2026</xref>)
    do. Which coefficients are zero, at a bound or free, and which rows
    are active, is read off the midpoint. With that fixed, and the
    multipliers taken affine between the two ends, every condition is
    affine in <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>.
    It holds along the whole segment if it holds at both ends. A linear
    program finds multipliers at both ends under the midpoint’s pattern,
    and both ends must fit that pattern: inside a segment no coefficient
    may change sign or leave a bound, and no row may come loose. A path
    that is right at both ends of a segment and at its midpoint, but
    cuts across a knot, fails this check. The published tests include
    one
    (<monospace>test_segment_check_sees_between_samples</monospace>).
    With <inline-formula><alternatives>
    <tex-math><![CDATA[p=1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[y=1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>y</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and the cap <inline-formula><alternatives>
    <tex-math><![CDATA[\beta\le\tfrac12]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle></mml:mrow></mml:math></alternatives></inline-formula>,
    the path is zero down to <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    then <inline-formula><alternatives>
    <tex-math><![CDATA[1-\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mi>λ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    up to the cap at <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=\tfrac12]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle></mml:mrow></mml:math></alternatives></inline-formula>.
    A single segment from <inline-formula><alternatives>
    <tex-math><![CDATA[(\lambda,\beta)=(\tfrac54,0)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>λ</mml:mi><mml:mo>,</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>5</mml:mn><mml:mn>4</mml:mn></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo><mml:mn>0</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    to <inline-formula><alternatives>
    <tex-math><![CDATA[(\tfrac14,\tfrac12)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>4</mml:mn></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac><mml:mn>1</mml:mn><mml:mn>2</mml:mn></mml:mfrac></mml:mstyle><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    misses both knots, yet meets the path at its ends and at its
    midpoint, where the largest violation of the optimality conditions
    is 0. The segment check returns 0.25, relative to
    <inline-formula><alternatives>
    <tex-math><![CDATA[\lVert c\rVert _\infty]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>c</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub></mml:math></alternatives></inline-formula>.
    The largest violation, relative to <inline-formula><alternatives>
    <tex-math><![CDATA[\lVert c\rVert _\infty]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>c</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub></mml:math></alternatives></inline-formula>,
    is the last column of the table.</p>
    <table-wrap>
      <caption>
        <p>The CLA against LARS (knot by knot) and against an
        interior-point solver (IPM, at segment midpoints).
        <italic>Gap</italic>: largest discrepancy, relative to the
        largest coefficient. <italic>KKT</italic>: largest violation of
        the optimality conditions of
        <xref alt="(1)" rid="eqU003Alasso">(1)</xref> at every knot and
        along every segment, relative to <inline-formula><alternatives>
        <tex-math><![CDATA[\lVert c\rVert _\infty]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mrow><mml:mo stretchy="true" form="prefix">‖</mml:mo><mml:mi>c</mml:mi><mml:mo stretchy="true" form="postfix">‖</mml:mo></mml:mrow><mml:mi>∞</mml:mi></mml:msub></mml:math></alternatives></inline-formula>.</p>
      </caption>
      <table id="tabU003Aevidence">
        <thead>
          <tr>
            <th align="left">problem</th>
            <th align="left">constraint</th>
            <th align="right"><inline-formula><alternatives>
            <tex-math><![CDATA[n]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula></th>
            <th align="right"><inline-formula><alternatives>
            <tex-math><![CDATA[p]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>p</mml:mi></mml:math></alternatives></inline-formula></th>
            <th align="right">knots</th>
            <th align="left">ref.</th>
            <th align="center">gap</th>
            <th align="center">KKT</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">plain</td>
            <td align="left">none</td>
            <td align="right">442</td>
            <td align="right">10</td>
            <td align="right">13</td>
            <td align="left">LARS</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[6.9\times10^{-14}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.1\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">nonnegative</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\beta\ge0]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>β</mml:mi><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">442</td>
            <td align="right">10</td>
            <td align="right">6</td>
            <td align="left">LARS</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.5\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.1\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">wide</td>
            <td align="left">none, <inline-formula><alternatives>
            <tex-math><![CDATA[p>n]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">40</td>
            <td align="right">100</td>
            <td align="right">53</td>
            <td align="left">LARS</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[4.2\times10^{-13}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[6.1\times10^{-16}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">box</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[|\beta_j|\le u]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">442</td>
            <td align="right">10</td>
            <td align="right">13</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[4.8\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.2\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">cholesterol</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[|\beta_{\mathrm{s1}}+\beta_{\mathrm{s2}}+\beta_{\mathrm{s3}}|\le h]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mrow><mml:mi mathvariant="normal">s</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mrow><mml:mi mathvariant="normal">s</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mrow><mml:mi mathvariant="normal">s</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">442</td>
            <td align="right">10</td>
            <td align="right">14</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.4\times10^{-9}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.1\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">pinned</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[x_1^{\top}\beta=y_1]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msubsup><mml:mi>x</mml:mi><mml:mn>1</mml:mn><mml:mi>⊤</mml:mi></mml:msubsup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">442</td>
            <td align="right">10</td>
            <td align="right">18</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.6\times10^{-10}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.6\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">zero-sum</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\mathbf{1}^{\top}\beta=0]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">60</td>
            <td align="right">30</td>
            <td align="right">30</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.1\times10^{-10}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.0\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">zero-sum, signs</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\mathbf{1}^{\top}\beta=0]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
            <inline-formula><alternatives>
            <tex-math><![CDATA[\beta_{2j}\ge0]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mrow><mml:mn>2</mml:mn><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>≥</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">60</td>
            <td align="right">30</td>
            <td align="right">21</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.1\times10^{-11}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.0\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">zero-sum, caps</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\mathbf{1}^{\top}\beta=0]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
            <inline-formula><alternatives>
            <tex-math><![CDATA[|\beta_j|\le u]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:mo>≤</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">60</td>
            <td align="right">30</td>
            <td align="right">35</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.4\times10^{-9}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[5.3\times10^{-16}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">monotone</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\beta_j\le\beta_{j+1}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>β</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>β</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">100</td>
            <td align="right">10</td>
            <td align="right">13</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[4.6\times10^{-12}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[9.5\times10^{-16}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>9.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">sum to one</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\mathbf{1}^{\top}\beta=1]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">40</td>
            <td align="right">20</td>
            <td align="right">19</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.3\times10^{-9}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[7.5\times10^{-16}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>7.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>16</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">sCD14</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\mathbf{1}^{\top}\beta=0]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn mathvariant="bold">𝟏</mml:mn><mml:mi>⊤</mml:mi></mml:msup><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">151</td>
            <td align="right">60</td>
            <td align="right">60</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[8.8\times10^{-10}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>8.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.1\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
  </sec>
  <sec id="secU003Aaccuracy">
    <title><named-content content-type="header-section-number">5.2</named-content>
    Accuracy</title>
    <p>The CLA returns LARS’s knots to <inline-formula><alternatives>
    <tex-math><![CDATA[10^{-13}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>,
    including on the wide design, where 53 knots carry the path to the
    interpolating fit. The KKT residuals are at the level of rounding
    throughout, including on the problems LARS cannot take. In positive
    mode <monospace>lars_path</monospace> labels as
    <inline-formula><alternatives>
    <tex-math><![CDATA[\alpha=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>α</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    a point that is the path at <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=30.65]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:mn>30.65</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    so the CLA’s last knot is compared with
    <monospace>scipy.optimize.nnls</monospace>
    (<xref alt="Lawson &amp; Hanson, 1974" rid="ref-lawson1974" ref-type="bibr">Lawson
    &amp; Hanson, 1974</xref>) instead.</p>
  </sec>
  <sec id="secU003Ascale">
    <title><named-content content-type="header-section-number">5.3</named-content>
    Scale and cost</title>
    <p>Table <xref alt="3" rid="tabU003Ascale">3</xref> extends the test
    to simulated zero-sum problems of up to
    <inline-formula><alternatives>
    <tex-math><![CDATA[p=500]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>500</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    parts, each size drawn with three seeds. At that size a midpoint
    solve per segment would cost more than the path itself, so the table
    reports only the optimality conditions. They hold to rounding. A
    second check at the largest size comes from the other encoding. The
    penalty form, relaxed, returns the same 542 knots to
    <inline-formula><alternatives>
    <tex-math><![CDATA[8.5\times 10^{-15}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>8.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
    as it does on every zero-sum problem here
    (<monospace>figures/encodings.tex</monospace>). For a sense of cost,
    take a grid of 100 interior-point solves (Clarabel through CVXPY,
    compiled once with <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>λ</mml:mi></mml:math></alternatives></inline-formula>
    as a parameter). It costs about 90 times as much as the whole CLA
    path at <inline-formula><alternatives>
    <tex-math><![CDATA[p=100]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    340 times at <inline-formula><alternatives>
    <tex-math><![CDATA[p=500]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>500</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    and 14 to 110 times on the constrained diabetes and zero-sum
    problems of Table <xref alt="2" rid="tabU003Aevidence">2</xref>.
    Each step was run once to warm up and then timed 11 times, 3 times
    at the sizes of Table <xref alt="3" rid="tabU003Ascale">3</xref>, on
    an Apple M4 Pro. The ratios are of the medians; the ratio of any two
    paired runs stays within 8% of it. These are the only numbers the
    script does not write into the text. The grid also misses every knot
    between grid points.</p>
    <table-wrap>
      <caption>
        <p>The budget form on simulated zero-sum problems of growing
        size, over three seeds: the range of the knot counts, and the
        largest KKT violation at every knot and along every segment, as
        in Table <xref alt="2" rid="tabU003Aevidence">2</xref>.</p>
      </caption>
      <table id="tabU003Ascale">
        <thead>
          <tr>
            <th align="right"><inline-formula><alternatives>
            <tex-math><![CDATA[n]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula></th>
            <th align="right"><inline-formula><alternatives>
            <tex-math><![CDATA[p]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>p</mml:mi></mml:math></alternatives></inline-formula></th>
            <th align="right">knots</th>
            <th align="center">KKT</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">200</td>
            <td align="right">100</td>
            <td align="right">100–108</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.1\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="right">400</td>
            <td align="right">200</td>
            <td align="right">208–224</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.2\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="right">1000</td>
            <td align="right">500</td>
            <td align="right">538–542</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.1\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
  </sec>
  <sec id="secU003Ahostile">
    <title><named-content content-type="header-section-number">5.4</named-content>
    Hostile problems</title>
    <p>Table <xref alt="4" rid="tabU003Astress">4</xref> adds problems
    chosen to make a path algorithm fail, each drawn with ten seeds (7
    to 16), and reports the worst case. <italic>Correlated</italic> is a
    Gaussian design with <inline-formula><alternatives>
    <tex-math><![CDATA[n=100]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[p=40]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>40</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    in which every pair of columns has correlation 0.99999. It is run
    alone, under a box and under a zero sum. <italic>Duplicate</italic>
    adds to the diabetes data an eleventh column,
    <monospace>bmi</monospace> plus noise of
    <inline-formula><alternatives>
    <tex-math><![CDATA[1.0\times 10^{-4}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    or <inline-formula><alternatives>
    <tex-math><![CDATA[1.0\times 10^{-6}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    times its spread, so that two columns nearly coincide; it is run
    alone and under the cap of <italic>Box</italic>. <italic>Wide,
    zero-sum</italic> puts a zero sum on <italic>Wide</italic>, where
    <inline-formula><alternatives>
    <tex-math><![CDATA[p>n]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.</p>
    <p>Every path that is traced meets the optimality conditions to
    <inline-formula><alternatives>
    <tex-math><![CDATA[9.6\times 10^{-12}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>9.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    or better. The gaps to the references grow with the conditioning.
    Against LARS the gap stays below <inline-formula><alternatives>
    <tex-math><![CDATA[\operatorname{cond}(X)^2]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">cond</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:msup><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    times the machine epsilon, and LARS’s own KKT residual is at most
    <inline-formula><alternatives>
    <tex-math><![CDATA[2.0\times 10^{-13}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>:
    both paths are right. The same reading covers a minimiser that is
    not unique. LARS and the CLA may then trace different paths of
    minimisers, and a gap between them is no defect as long as both meet
    the optimality conditions; the certificate, not the agreement, is
    what each path is held to. Against the interior-point solver the gap
    reaches <inline-formula><alternatives>
    <tex-math><![CDATA[1.5\times 10^{-2}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    on <italic>Duplicate</italic>, where two nearly identical columns
    leave the minimiser all but unique: the solver can split the weight
    between the twins differently at almost the same objective. Even
    there the solver’s objective is never lower than the path’s by more
    than <inline-formula><alternatives>
    <tex-math><![CDATA[4.8\times 10^{-13}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
    relative, which is within its tolerance.</p>
    <p><monospace>cvxcla</monospace> declines <italic>Duplicate</italic>
    at <inline-formula><alternatives>
    <tex-math><![CDATA[1.0\times 10^{-6}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    without a cap for every seed, because both twins become free
    (Section <xref alt="6" rid="secU003Alimits">6</xref>). Under the cap
    it declines two of the ten seeds, for the same reason: on those
    draws both twins become free before the cap binds. On the others
    they never are both free, and the path is exact. Nothing else is
    declined. <italic>Wide, zero-sum</italic>, with
    <inline-formula><alternatives>
    <tex-math><![CDATA[\operatorname{cond}(X)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">cond</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    near <inline-formula><alternatives>
    <tex-math><![CDATA[10^{16}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mn>16</mml:mn></mml:msup></mml:math></alternatives></inline-formula>,
    is traced, with the largest residual in the table
    (Section <xref alt="4" rid="secU003Astarts">4</xref>).</p>
    <table-wrap>
      <caption>
        <p>Hostile problems, through the checks of
        Table <xref alt="2" rid="tabU003Aevidence">2</xref>, the worst
        over ten seeds. <italic>Declined</italic>:
        <monospace>cvxcla</monospace> stops with an error. The duplicate
        column is <monospace>bmi</monospace> plus noise of the given
        size, relative to its spread.</p>
      </caption>
      <table id="tabU003Astress">
        <thead>
          <tr>
            <th align="left">problem</th>
            <th align="right"><inline-formula><alternatives>
            <tex-math><![CDATA[n]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>n</mml:mi></mml:math></alternatives></inline-formula></th>
            <th align="right"><inline-formula><alternatives>
            <tex-math><![CDATA[p]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>p</mml:mi></mml:math></alternatives></inline-formula></th>
            <th align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[\operatorname{cond}(X)]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">cond</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula></th>
            <th align="right">knots</th>
            <th align="left">ref.</th>
            <th align="center">gap</th>
            <th align="center">KKT</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">correlated</td>
            <td align="right">100</td>
            <td align="right">40</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[5.6\times10^{3}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>3</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">43–49</td>
            <td align="left">LARS</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.8\times10^{-9}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.9\times10^{-13}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">correlated, box</td>
            <td align="right">100</td>
            <td align="right">40</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[5.6\times10^{3}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>3</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">47–59</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.7\times10^{-6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.0\times10^{-13}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">correlated, zero-sum</td>
            <td align="right">100</td>
            <td align="right">40</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[5.6\times10^{3}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>3</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">40–42</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[4.3\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[5.1\times10^{-13}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">duplicate <inline-formula><alternatives>
            <tex-math><![CDATA[10^{-4}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula></td>
            <td align="right">442</td>
            <td align="right">11</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[3.2\times10^{4}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>4</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">14–16</td>
            <td align="left">LARS</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.4\times10^{-7}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>7</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.2\times10^{-13}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>13</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">duplicate <inline-formula><alternatives>
            <tex-math><![CDATA[10^{-4}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>,
            box</td>
            <td align="right">442</td>
            <td align="right">11</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[3.2\times10^{4}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>4</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">14–16</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.9\times10^{-3}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[4.0\times10^{-14}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">duplicate <inline-formula><alternatives>
            <tex-math><![CDATA[10^{-6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula></td>
            <td align="right">442</td>
            <td align="right">11</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[3.2\times10^{6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>6</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center" colspan="4">declined</td>
          </tr>
          <tr>
            <td align="left">duplicate <inline-formula><alternatives>
            <tex-math><![CDATA[10^{-6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>,
            box</td>
            <td align="right">442</td>
            <td align="right">11</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[3.2\times10^{6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>6</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">14 (2 declined)</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.5\times10^{-2}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.6\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">wide, zero-sum</td>
            <td align="right">40</td>
            <td align="right">100</td>
            <td align="left"><inline-formula><alternatives>
            <tex-math><![CDATA[5.8\times10^{15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>15</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="right">50–78</td>
            <td align="left">IPM</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.7\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[9.6\times10^{-12}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>9.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
  </sec>
  <sec id="secU003Awide">
    <title><named-content content-type="header-section-number">5.5</named-content>
    More predictors than observations</title>
    <p>A zero sum alone with <inline-formula><alternatives>
    <tex-math><![CDATA[p>n]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    is covered by comlasso
    (<xref alt="Jeon et al., 2020" rid="ref-jeon2020" ref-type="bibr">Jeon
    et al., 2020</xref>) too, so
    Table <xref alt="5" rid="tabU003Awide">5</xref> puts on
    <italic>Wide</italic> (<inline-formula><alternatives>
    <tex-math><![CDATA[n=40]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn>40</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[p=100]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    ten seeds) the constraints comlasso does not take. They are
    nonnegativity; a box at half the largest coefficient of the
    least-squares fit of smallest norm; two binding inequality rows that
    cap the net effect of three predictors, as in
    <italic>Cholesterol</italic>; the row of <italic>Pinned</italic>;
    and a zero sum with the signs of <italic>Zero-sum, signs</italic> or
    with the caps of the box. <monospace>cvxcla</monospace> declines
    none of them. Every path meets the optimality conditions to
    <inline-formula><alternatives>
    <tex-math><![CDATA[1.3\times 10^{-9}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    or better along every segment. The largest residuals come at the end
    of a path, near <inline-formula><alternatives>
    <tex-math><![CDATA[\lambda=10^{-4}\lambda_{\max}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>λ</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup><mml:msub><mml:mi>λ</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
    where the fit almost interpolates; elsewhere they are at rounding.
    The largest is on one seed of <italic>Zero-sum, signs</italic>, with
    <inline-formula><alternatives>
    <tex-math><![CDATA[\operatorname{cond}(X)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">cond</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    near <inline-formula><alternatives>
    <tex-math><![CDATA[10^{16}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mn>16</mml:mn></mml:msup></mml:math></alternatives></inline-formula>.
    and the interior-point solver agrees to
    <inline-formula><alternatives>
    <tex-math><![CDATA[4.2\times 10^{-6}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>.
    Its objective is never lower than the path’s by more than
    <inline-formula><alternatives>
    <tex-math><![CDATA[8.1\times 10^{-12}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>8.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
    relative. That happens only near the end of a path, where the fit
    almost interpolates and the objective is small.</p>
    <table-wrap>
      <caption>
        <p>More predictors than observations,
        <inline-formula><alternatives>
        <tex-math><![CDATA[n=40]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn>40</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
        and <inline-formula><alternatives>
        <tex-math><![CDATA[p=100]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
        under constraints beyond a zero sum, through the checks of
        Table <xref alt="2" rid="tabU003Aevidence">2</xref> against the
        interior-point solver, the worst over ten seeds. None is
        declined.</p>
      </caption>
      <table id="tabU003Awide">
        <thead>
          <tr>
            <th align="left"><italic>Wide</italic> with</th>
            <th align="right">knots</th>
            <th align="center">gap</th>
            <th align="center">KKT</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">nonnegative</td>
            <td align="right">48–100</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[3.5\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>3.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[5.6\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>5.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">box</td>
            <td align="right">92–315</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.7\times10^{-6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.3\times10^{-14}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">inequality rows</td>
            <td align="right">50–78</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[8.0\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>8.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.4\times10^{-11}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.4</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>11</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">pinned</td>
            <td align="right">51–73</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[6.6\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[9.7\times10^{-15}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>9.7</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">zero-sum, signs</td>
            <td align="right">44–78</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[9.3\times10^{-8}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>9.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>8</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[1.3\times10^{-9}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>9</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
          <tr>
            <td align="left">zero-sum, caps</td>
            <td align="right">88–389</td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[4.2\times10^{-6}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
            <td align="center"><inline-formula><alternatives>
            <tex-math><![CDATA[2.2\times10^{-12}]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.2</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula></td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
  </sec>
  <sec id="secU003Aindependent">
    <title><named-content content-type="header-section-number">5.6</named-content>
    Three independent path algorithms</title>
    <p>Three path algorithms derived for the LASSO, with no reference to
    portfolios, can be run against the CLA. Started at the exact first
    knot, all three trace its path, up to the ridge two of them add.</p>
    <p>comlasso
    (<xref alt="Jeon et al., 2020" rid="ref-jeon2020" ref-type="bibr">Jeon
    et al., 2020</xref>) traces the exact path under zero sums on blocks
    of coefficients, with no ridge and with
    <inline-formula><alternatives>
    <tex-math><![CDATA[p>n]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    so it should agree with the CLA with no workaround. Its authors
    publish it as an R package built for R 3.2. We load it unchanged
    (Code availability) and run it on <italic>Zero-sum</italic>,
    <italic>sCD14</italic> and <italic>Wide, zero-sum</italic>. It
    returns the CLA’s knots, to <inline-formula><alternatives>
    <tex-math><![CDATA[4.3\times 10^{-15}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>4.3</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>15</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    relative to the largest coefficient on the first two and to
    <inline-formula><alternatives>
    <tex-math><![CDATA[1.5\times 10^{-10}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    on <italic>Wide, zero-sum</italic> over the ten seeds.</p>
    <p>The algorithm of Gaines et
    al. (<xref alt="2018" rid="ref-gaines2018" ref-type="bibr">2018</xref>)
    ships in MATLAB and in Julia. We ported the Julia package to Julia 1
    without changing the algorithm (Code availability) and ran it on
    every problem of
    Table <xref alt="2" rid="tabU003Aevidence">2</xref>. Started at the
    exact first knot, where that is simple to state, it agrees with the
    CLA to <inline-formula><alternatives>
    <tex-math><![CDATA[2.9\times 10^{-14}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.9</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    on the five such problems with <inline-formula><alternatives>
    <tex-math><![CDATA[n\ge p]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>≥</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>:
    box, cholesterol, plain, sCD14 and zero-sum. On
    <italic>Wide</italic>, where <inline-formula><alternatives>
    <tex-math><![CDATA[n<p]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>&lt;</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    its ridge keeps it <inline-formula><alternatives>
    <tex-math><![CDATA[2.8\times 10^{-2}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>2.8</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    away. As shipped, its own start puts it off the path on all 12
    problems, by <inline-formula><alternatives>
    <tex-math><![CDATA[1.6\times 10^{-5}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.6</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>5</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    to <inline-formula><alternatives>
    <tex-math><![CDATA[1.1\times 10^{2}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    relative to the largest coefficient. It takes the first knot from a
    linear program that does not involve <inline-formula><alternatives>
    <tex-math><![CDATA[y]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>y</mml:mi></mml:math></alternatives></inline-formula>,
    and calls a coefficient active above an absolute threshold of
    <inline-formula><alternatives>
    <tex-math><![CDATA[10^{-4}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>.</p>
    <p><monospace>c-lasso</monospace>
    (<xref alt="Simpson et al., 2021" rid="ref-classo" ref-type="bibr">Simpson
    et al., 2021</xref>) has a path algorithm for
    <inline-formula><alternatives>
    <tex-math><![CDATA[C\beta=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    alone, without bounds or signs, so it runs on
    <italic>Zero-sum</italic>, <italic>sCD14</italic> and <italic>Wide,
    zero-sum</italic>. It adds a ridge term
    <inline-formula><alternatives>
    <tex-math><![CDATA[10^{-3}I]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>3</mml:mn></mml:mrow></mml:msup><mml:mi>I</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    to <inline-formula><alternatives>
    <tex-math><![CDATA[X^{\top}X]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mi>X</mml:mi><mml:mi>⊤</mml:mi></mml:msup><mml:mi>X</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    fixed in the package, and that term is the whole of its distance to
    the CLA. On the first two its 100 grid points lie up to
    <inline-formula><alternatives>
    <tex-math><![CDATA[6.1\times 10^{-5}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>5</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    from the CLA path as shipped, relative to the largest coefficient.
    With the ridge set to <inline-formula><alternatives>
    <tex-math><![CDATA[10^{-12}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
    by hand they lie <inline-formula><alternatives>
    <tex-math><![CDATA[6.0\times 10^{-14}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>6.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>14</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    from it. With <inline-formula><alternatives>
    <tex-math><![CDATA[p>n]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    the same ridge is not small. On <italic>Wide, zero-sum</italic>,
    <monospace>c-lasso</monospace> as shipped lies 0.41 to 0.60 times
    the largest coefficient from the CLA over the ten seeds, and
    <inline-formula><alternatives>
    <tex-math><![CDATA[1.5\times 10^{-10}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>
    with the ridge at <inline-formula><alternatives>
    <tex-math><![CDATA[10^{-12}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>.</p>
  </sec>
</sec>
<sec id="secU003Alimits">
  <title><named-content content-type="header-section-number">6</named-content>
  Limits and when to use it</title>
  <p>When two columns nearly coincide and both become free, moving
  weight from one to the other barely changes the fit. Unless an active
  row forbids that move, <xref alt="(3)" rid="eqU003Aborder">(3)</xref>
  is then singular to working precision and
  <monospace>cvxcla</monospace> stops (<italic>Duplicate</italic> at
  <inline-formula><alternatives>
  <tex-math><![CDATA[1.0\times 10^{-6}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1.0</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
  Table <xref alt="4" rid="tabU003Astress">4</xref>). This is the
  general-position assumption of
  Section <xref alt="1" rid="secU003Aexample">1</xref>, failing in
  floating point. Dropping or merging one of the two columns before
  tracing avoids it. A relaxation can also fail its certificate, when
  knots of the exact path lie closer together than the relaxation moves
  them; here none was declined. Finally, we do not prove that the walk
  terminates. The non-terminating examples of Hobson et
  al. (<xref alt="2026" rid="ref-hobson2026" ref-type="bibr">2026</xref>)
  need multipliers that are not unique, which a nonsingular
  <xref alt="(3)" rid="eqU003Aborder">(3)</xref> rules out, and every
  walk here ended.</p>
  <p><bold>When to use it</bold> <monospace>cvxcla.Lasso</monospace> is
  for LASSO paths under constraints <monospace>lars_path</monospace>
  does not take: caps, signs on some coefficients, equality and
  inequality rows and zero sums, also with
  <inline-formula><alternatives>
  <tex-math><![CDATA[p>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>.
  It returns the knots at less cost than a grid of interior-point solves
  (Section <xref alt="5.3" rid="secU003Ascale">5.3</xref>). For the
  plain or positive LASSO, <monospace>lars_path</monospace> is enough.
  Two nearly identical columns should be merged first.
  Table <xref alt="6" rid="tabU003Asoftware">6</xref> lists what each
  path algorithm accepts.</p>
  <table-wrap>
    <caption>
      <p>What each exact path algorithm accepts. <italic>Rows</italic>:
      a bound or sign is written as an inequality row.
      <italic>All</italic>: <monospace>positive=True</monospace> makes
      every coefficient nonnegative, none can be chosen alone.
      <monospace>c-lasso</monospace> takes
      <inline-formula><alternatives>
      <tex-math><![CDATA[C\beta=0]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>;
      comlasso takes zero sums on blocks of coefficients. The ridges are
      <inline-formula><alternatives>
      <tex-math><![CDATA[10^{-3}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>3</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
      in <monospace>c-lasso</monospace>, <inline-formula><alternatives>
      <tex-math><![CDATA[10^{-4}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
      in Gaines et al. when <inline-formula><alternatives>
      <tex-math><![CDATA[n<p]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>n</mml:mi><mml:mo>&lt;</mml:mo><mml:mi>p</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
      and <inline-formula><alternatives>
      <tex-math><![CDATA[10^{-4}\max_jG_{jj}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
      in CLASSO, whose code was not released when we wrote; its column
      is from its paper
      (<xref alt="Hobson et al., 2026" rid="ref-hobson2026" ref-type="bibr">Hobson
      et al., 2026</xref>).</p>
    </caption>
    <table id="tabU003Asoftware">
      <thead>
        <tr>
          <th align="left"></th>
          <th align="center"><monospace>lars_path</monospace></th>
          <th align="center"><monospace>c-lasso</monospace></th>
          <th align="center">comlasso</th>
          <th align="center">Gaines et al.</th>
          <th align="center">CLASSO</th>
          <th align="center"><monospace>cvxcla</monospace></th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td align="left">caps <inline-formula><alternatives>
          <tex-math><![CDATA[l\le\beta\le u]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>l</mml:mi><mml:mo>≤</mml:mo><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>u</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center">–</td>
          <td align="center">–</td>
          <td align="center">–</td>
          <td align="center">rows</td>
          <td align="center">rows</td>
          <td align="center">yes</td>
        </tr>
        <tr>
          <td align="left">per-coefficient signs</td>
          <td align="center">all</td>
          <td align="center">–</td>
          <td align="center">–</td>
          <td align="center">rows</td>
          <td align="center">rows</td>
          <td align="center">yes</td>
        </tr>
        <tr>
          <td align="left">equality rows <inline-formula><alternatives>
          <tex-math><![CDATA[A\beta=b]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>A</mml:mi><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mi>b</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center">–</td>
          <td align="center"><inline-formula><alternatives>
          <tex-math><![CDATA[b=0]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>b</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center">zero sums</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
        </tr>
        <tr>
          <td align="left">inequality rows
          <inline-formula><alternatives>
          <tex-math><![CDATA[C\beta\le h]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>C</mml:mi><mml:mi>β</mml:mi><mml:mo>≤</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center">–</td>
          <td align="center">–</td>
          <td align="center">–</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
        </tr>
        <tr>
          <td align="left">zero sums</td>
          <td align="center">–</td>
          <td align="center">yes</td>
          <td align="center">on blocks</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
        </tr>
        <tr>
          <td align="left"><inline-formula><alternatives>
          <tex-math><![CDATA[p>n]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
          <td align="center">yes</td>
        </tr>
        <tr>
          <td align="left"><inline-formula><alternatives>
          <tex-math><![CDATA[p>n]]></tex-math>
          <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
          without a ridge</td>
          <td align="center">yes</td>
          <td align="center">–</td>
          <td align="center">yes</td>
          <td align="center">–</td>
          <td align="center">–</td>
          <td align="center">yes</td>
        </tr>
      </tbody>
    </table>
  </table-wrap>
  <p>We do not compare run times with comlasso, the algorithm of Gaines
  et al. or <monospace>c-lasso</monospace>. None runs here as its
  authors would run it today: comlasso is R code built for R 3.2 and
  read under R 4, the algorithm of Gaines et al. is our port of
  Julia 0.6 code, and <monospace>c-lasso</monospace> returns a grid of
  its own with a ridge. A timing across R, Julia and Python would
  measure the languages and the ports as much as the algorithms. A user
  choosing among them should first ask which constraints each accepts,
  and then time them on their own problem.</p>
</sec>
<sec id="secU003Aconclusion">
  <title><named-content content-type="header-section-number">7</named-content>
  Conclusion</title>
  <p>The checks here support the identity of Schmelzer and Hastie
  (<xref alt="2026" rid="ref-perspective" ref-type="bibr">2026</xref>)
  wherever the encodings reach. On every problem, a CLA written for
  portfolios returns the exact knots, or stops with an error where its
  arithmetic cannot be trusted. With <inline-formula><alternatives>
  <tex-math><![CDATA[p>n]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>p</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
  the paths stay exact with no ridge, where the other path algorithms
  for general constraints trace a ridged problem that ends
  elsewhere.</p>
</sec>
<sec id="data-and-code-availability" sec-type="data-availability">
  <title>Data and Code Availability</title>
  <p>The software is in
  <monospace>preprints/constrained_lasso/</monospace> of
  <ext-link ext-link-type="uri" xlink:href="https://github.com/Jebel-Quant/lasso">https://github.com/Jebel-Quant/lasso</ext-link>,
  under the MIT licence. Each script has a lockfile that fixes Python
  3.12 and every package by version and hash.
  <monospace>python/make_figures.py</monospace> computes every path with
  <monospace>cvxcla.Lasso</monospace> 2.7.1
  (<xref alt="Schmelzer, 2026a" rid="ref-cvxcla" ref-type="bibr">Schmelzer,
  2026a</xref>), runs every check, and writes every figure, table and
  number the text quotes. <monospace>python/classo_check.py</monospace>
  runs <monospace>c-lasso</monospace> 1.0.11.
  <monospace>R/comlasso_check.R</monospace> runs comlasso 0.2 under
  R 4.6.1, locally and in CI. The package was built for R 3.2, and R 4
  refuses to install a package built before R 4.0, so the script does
  not install it. It fetches the package from its authors’ repository at
  a pinned commit, checks its SHA-256, and reads its functions from the
  package’s serialized code with <monospace>lazyLoad</monospace>,
  unchanged. comlasso is plain R, with no compiled code, so nothing in
  it depends on the R 3 build; its one dependency,
  <monospace>Rglpk</monospace>, comes from a dated CRAN snapshot.
  <monospace>julia/classopath.jl</monospace> ports
  <monospace>ConstrainedLasso.jl</monospace>, written for Julia 0.6, to
  Julia 1.12, with each departure marked; none changes the algorithm.
  <monospace>julia/gaines_check.jl</monospace> runs it in a pinned
  environment. The sCD14 data are not redistributed:
  <monospace>python/fetch_scd14.py</monospace> downloads
  <monospace>coda4microbiome</monospace> 0.2.4 from CRAN or, should CRAN
  drop it, from a dated snapshot of Posit Package Manager. It checks the
  SHA-256 of the tarball, and that of the data file inside it, which is
  the same byte for byte in both. <monospace>make figures</monospace>
  runs all five, in CI as well.</p>
  <p>Every random design is drawn inside
  <monospace>python/make_figures.py</monospace> from a seed recorded
  there: seed 7 for the problems of
  Table <xref alt="2" rid="tabU003Aevidence">2</xref>, seeds 7 to 9 for
  Table <xref alt="3" rid="tabU003Ascale">3</xref>, and seeds 7 to 16
  for Tables <xref alt="4" rid="tabU003Astress">4</xref>
  and <xref alt="5" rid="tabU003Awide">5</xref>. On a fixed platform the
  discrete results reproduce exactly: the knot counts, which problems
  are declined, and whether each path passes the certificate. A test
  runs the problems of Tables <xref alt="3" rid="tabU003Ascale">3</xref>
  and <xref alt="4" rid="tabU003Astress">4</xref> twice and checks that
  they do. Only residuals near rounding vary, and only in their last
  digits.</p>
  <p>The lockfiles fix the software, not the hardware: those residuals
  also differ in the last digits on another CPU, so the tests use
  tolerances between <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-12}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>12</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>
  and <inline-formula><alternatives>
  <tex-math><![CDATA[10^{-10}]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msup><mml:mn>10</mml:mn><mml:mrow><mml:mi>−</mml:mi><mml:mn>10</mml:mn></mml:mrow></mml:msup></mml:math></alternatives></inline-formula>,
  and costs are given only as ratios.</p>
  <p><bold>Competing interests</bold> The author works at Jebel Quant
  Research, which hosts the code, and maintains
  <monospace>cvxcla</monospace>, which computes every path. The checks
  are the author’s; the references they compare against are not. LARS,
  Clarabel, comlasso, <monospace>ConstrainedLasso.jl</monospace> and
  <monospace>c-lasso</monospace> were written by others, and the
  optimality conditions need no solver. There are no other competing
  interests.</p>
  <p><bold>Acknowledgements</bold> I thank Trevor Hastie for many
  helpful discussions.</p>
</sec>
</body>
<back><ref-list><ref id="ref1"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Abadie</surname><given-names>Alberto</given-names></name><name><surname>Diamond</surname><given-names>Alexis</given-names></name><name><surname>Hainmueller</surname><given-names>Jens</given-names></name></person-group><article-title>Synthetic Control Methods for Comparative Case Studies: Estimating the Effect of California’s Tobacco Control Program</article-title><source>Journal of the American Statistical Association</source><year>2010</year><volume>105</volume><issue>490</issue><fpage>493</fpage><lpage>505</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1198/jasa.2009.ap08746</pub-id></element-citation></ref><ref id="ref2"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Brodie</surname><given-names>Joshua</given-names></name><name><surname>Daubechies</surname><given-names>Ingrid</given-names></name><name><surname>De Mol</surname><given-names>Christine</given-names></name><name><surname>Giannone</surname><given-names>Domenico</given-names></name><name><surname>Loris</surname><given-names>Ignace</given-names></name></person-group><article-title>Sparse and stable Markowitz portfolios</article-title><source>Proceedings of the National Academy of Sciences</source><year>2009</year><volume>106</volume><issue>30</issue><fpage>12267</fpage><lpage>12272</lpage><publisher-name>National Academy of Sciences</publisher-name><pub-id pub-id-type="doi">10.1073/pnas.0904287106</pub-id></element-citation></ref><ref id="ref3"><mixed-citation>Calle, M. L., Pujolassos, M., &amp; Susín, A. (2023). coda4microbiome: Compositional data analysis for microbiome cross-sectional and longitudinal studies. BMC Bioinformatics, 24, 82. https://doi.org/10.1186/s12859-023-05205-3</mixed-citation></ref><ref id="ref4"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Efron</surname><given-names>Bradley</given-names></name><name><surname>Hastie</surname><given-names>Trevor</given-names></name><name><surname>Johnstone</surname><given-names>Iain</given-names></name><name><surname>Tibshirani</surname><given-names>Robert</given-names></name></person-group><article-title>Least angle regression</article-title><source>The Annals of Statistics</source><year>2004</year><volume>32</volume><issue>2</issue><fpage>407</fpage><lpage>499</lpage><publisher-name>Institute of Mathematical Statistics</publisher-name><pub-id pub-id-type="doi">10.1214/009053604000000067</pub-id></element-citation></ref><ref id="ref5"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Gaines</surname><given-names>Brian R.</given-names></name><name><surname>Kim</surname><given-names>Juhyun</given-names></name><name><surname>Zhou</surname><given-names>Hua</given-names></name></person-group><article-title>Algorithms for Fitting the Constrained Lasso</article-title><source>Journal of Computational and Graphical Statistics</source><year>2018</year><volume>27</volume><issue>4</issue><fpage>861</fpage><lpage>871</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/10618600.2018.1473777</pub-id></element-citation></ref><ref id="ref6"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Hobson</surname><given-names>Michael</given-names></name><name><surname>Butcher</surname><given-names>Luke</given-names></name><name><surname>Lentati</surname><given-names>Lindley</given-names></name></person-group><article-title>CLASSO: a practical primal path-following algorithm for the constrained LASSO</article-title><year>2026</year><publisher-name>arXiv</publisher-name><pub-id pub-id-type="doi">10.48550/arXiv.2610.17024</pub-id></element-citation></ref><ref id="ref7"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>James</surname><given-names>Gareth M.</given-names></name><name><surname>Paulson</surname><given-names>Courtney</given-names></name><name><surname>Rusmevichientong</surname><given-names>Paat</given-names></name></person-group><article-title>Penalized and Constrained Optimization: An Application to High-Dimensional Website Advertising</article-title><source>Journal of the American Statistical Association</source><year>2020</year><volume>115</volume><issue>529</issue><fpage>107</fpage><lpage>122</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.2019.1609970</pub-id></element-citation></ref><ref id="ref8"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Jeon</surname><given-names>Jong-June</given-names></name><name><surname>Kim</surname><given-names>Yongdai</given-names></name><name><surname>Won</surname><given-names>Sungho</given-names></name><name><surname>Choi</surname><given-names>Hosik</given-names></name></person-group><article-title>Primal path algorithm for compositional data analysis</article-title><source>Computational Statistics &amp; Data Analysis</source><year>2020</year><volume>148</volume><fpage>106958</fpage><publisher-name>Elsevier BV</publisher-name><pub-id pub-id-type="doi">10.1016/j.csda.2020.106958</pub-id></element-citation></ref><ref id="ref9"><mixed-citation>Lawson, C. L., &amp; Hanson, R. J. (1974). Solving least squares problems. Prentice-Hall.</mixed-citation></ref><ref id="ref10"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Lin</surname><given-names>W.</given-names></name><name><surname>Shi</surname><given-names>P.</given-names></name><name><surname>Feng</surname><given-names>R.</given-names></name><name><surname>Li</surname><given-names>H.</given-names></name></person-group><article-title>Variable selection in regression with compositional covariates</article-title><source>Biometrika</source><year>2014</year><volume>101</volume><issue>4</issue><fpage>785</fpage><lpage>797</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/biomet/asu031</pub-id></element-citation></ref><ref id="ref11"><mixed-citation>Markowitz, H. M. (1956). The optimization of a quadratic function subject to linear constraints. Naval Research Logistics Quarterly, 3(1–2), 111–133. https://doi.org/10.1002/nav.3800030110</mixed-citation></ref><ref id="ref12"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Noguera-Julian</surname><given-names>Marc</given-names></name><name><surname>Rocafort</surname><given-names>Muntsa</given-names></name><name><surname>Guillén</surname><given-names>Yolanda</given-names></name><name><surname>Rivera</surname><given-names>Javier</given-names></name><name><surname>Casadellà</surname><given-names>Maria</given-names></name><name><surname>Nowak</surname><given-names>Piotr</given-names></name><name><surname>Hildebrand</surname><given-names>Falk</given-names></name><name><surname>Zeller</surname><given-names>Georg</given-names></name><name><surname>Parera</surname><given-names>Mariona</given-names></name><name><surname>Bellido</surname><given-names>Rocío</given-names></name><name><surname>Rodríguez</surname><given-names>Cristina</given-names></name><name><surname>Carrillo</surname><given-names>Jorge</given-names></name><name><surname>Mothe</surname><given-names>Beatriz</given-names></name><name><surname>Coll</surname><given-names>Josep</given-names></name><name><surname>Bravo</surname><given-names>Isabel</given-names></name><name><surname>Estany</surname><given-names>Carla</given-names></name><name><surname>Herrero</surname><given-names>Cristina</given-names></name><name><surname>Saz</surname><given-names>Jorge</given-names></name><name><surname>Sirera</surname><given-names>Guillem</given-names></name><name><surname>Torrela</surname><given-names>Ariadna</given-names></name><name><surname>Navarro</surname><given-names>Jordi</given-names></name><name><surname>Crespo</surname><given-names>Manel</given-names></name><name><surname>Brander</surname><given-names>Christian</given-names></name><name><surname>Negredo</surname><given-names>Eugènia</given-names></name><name><surname>Blanco</surname><given-names>Julià</given-names></name><name><surname>Guarner</surname><given-names>Francisco</given-names></name><name><surname>Calle</surname><given-names>Maria Luz</given-names></name><name><surname>Bork</surname><given-names>Peer</given-names></name><name><surname>Sönnerborg</surname><given-names>Anders</given-names></name><name><surname>Clotet</surname><given-names>Bonaventura</given-names></name><name><surname>Paredes</surname><given-names>Roger</given-names></name></person-group><article-title>Gut Microbiota Linked to Sexual Preference and HIV Infection</article-title><source>EBioMedicine</source><year>2016</year><volume>5</volume><fpage>135</fpage><lpage>146</lpage><publisher-name>Elsevier BV</publisher-name><pub-id pub-id-type="doi">10.1016/j.ebiom.2016.01.032</pub-id></element-citation></ref><ref id="ref13"><mixed-citation>Okabe, M., &amp; Ito, K. (2008). Color universal design (CUD): How to make figures and presentations that are friendly to colorblind people. https://jfly.uni-koeln.de/color/</mixed-citation></ref><ref id="ref14"><mixed-citation>Osborne, M. R., Presnell, B., &amp; Turlach, B. A. (2000). A new approach to variable selection in least squares problems. IMA Journal of Numerical Analysis, 20(3), 389–403. https://doi.org/10.1093/imanum/20.3.389</mixed-citation></ref><ref id="ref15"><mixed-citation>Pedregosa, F. et al. (2011). Scikit-learn: Machine learning in python. Journal of Machine Learning Research, 12, 2825–2830.</mixed-citation></ref><ref id="ref16"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Schmelzer</surname><given-names>Thomas</given-names></name></person-group><article-title>cvxcla: The Critical Line Algorithm with an Operator Interface in Python</article-title><year>2026</year><publisher-name>Elsevier BV</publisher-name><pub-id pub-id-type="doi">10.2139/ssrn.7583179</pub-id></element-citation></ref><ref id="ref17"><mixed-citation>Schmelzer, T. (2026b). The efficient frontier from a LASSO solver: A numerical check of the CLA–LASSO identity. Journal of Reproducible Statistics, 1. https://doi.org/10.68365/jrepstat.2026.7</mixed-citation></ref><ref id="ref18"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Schmelzer</surname><given-names>Thomas</given-names></name><name><surname>Hastie</surname><given-names>Trevor</given-names></name></person-group><article-title>The Critical Line Algorithm and the Constrained LASSO: One Curve, Two Literatures</article-title><year>2026</year><publisher-name>arXiv</publisher-name><pub-id pub-id-type="doi">10.48550/arXiv.2609.25704</pub-id></element-citation></ref><ref id="ref19"><mixed-citation>Simpson, L., Combettes, P. L., &amp; Müller, C. L. (2021). C-lasso – a Python package for constrained sparse and robust regression and classification. Journal of Open Source Software, 6(57), 2844. https://doi.org/10.21105/joss.02844</mixed-citation></ref><ref id="ref20"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Tibshirani</surname><given-names>Robert</given-names></name></person-group><article-title>Regression Shrinkage and Selection Via the Lasso</article-title><source>Journal of the Royal Statistical Society Series B: Statistical Methodology</source><year>1996</year><volume>58</volume><issue>1</issue><fpage>267</fpage><lpage>288</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1111/j.2517-6161.1996.tb02080.x</pub-id></element-citation></ref><ref id="ref21"><mixed-citation>Tibshirani, R. J. (2013). The lasso problem and uniqueness. Electronic Journal of Statistics, 7, 1456–1490. https://doi.org/10.1214/13-EJS815</mixed-citation></ref><ref id="ref22"><mixed-citation>Wilson, P. W. F., Meigs, J. B., Sullivan, L., et al. (2007). Prediction of incident diabetes mellitus in middle-aged adults: The Framingham Offspring Study. Archives of Internal Medicine, 167(10), 1068–1074. https://doi.org/10.1001/archinte.167.10.1068</mixed-citation></ref></ref-list>
<ref-list>
  <title>References</title>
  <ref id="ref-abadie2010">
    <mixed-citation>Abadie, A., Diamond, A., &amp; Hainmueller, J.
    (2010). Synthetic control methods for comparative case studies:
    Estimating the effect of California’s tobacco control program.
    <italic>Journal of the American Statistical Association</italic>,
    <italic>105</italic>(490), 493–505.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1198/jasa.2009.ap08746">https://doi.org/10.1198/jasa.2009.ap08746</ext-link></mixed-citation>
  </ref>
  <ref id="ref-brodie2009">
    <mixed-citation>Brodie, J., Daubechies, I., De Mol, C., Giannone,
    D., &amp; Loris, I. (2009). Sparse and stable Markowitz portfolios.
    <italic>Proceedings of the National Academy of Sciences</italic>,
    <italic>106</italic>(30), 12267–12272.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1073/pnas.0904287106">https://doi.org/10.1073/pnas.0904287106</ext-link></mixed-citation>
  </ref>
  <ref id="ref-calle2023">
    <mixed-citation>Calle, M. L., Pujolassos, M., &amp; Susín, A.
    (2023). coda4microbiome: Compositional data analysis for microbiome
    cross-sectional and longitudinal studies. <italic>BMC
    Bioinformatics</italic>, <italic>24</italic>, 82.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1186/s12859-023-05205-3">https://doi.org/10.1186/s12859-023-05205-3</ext-link></mixed-citation>
  </ref>
  <ref id="ref-efron2004">
    <mixed-citation>Efron, B., Hastie, T., Johnstone, I., &amp;
    Tibshirani, R. (2004). Least angle regression. <italic>The Annals of
    Statistics</italic>, <italic>32</italic>(2), 407–499.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1214/009053604000000067">https://doi.org/10.1214/009053604000000067</ext-link></mixed-citation>
  </ref>
  <ref id="ref-gaines2018">
    <mixed-citation>Gaines, B. R., Kim, J., &amp; Zhou, H. (2018).
    Algorithms for fitting the constrained lasso. <italic>Journal of
    Computational and Graphical Statistics</italic>,
    <italic>27</italic>(4), 861–871.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/10618600.2018.1473777">https://doi.org/10.1080/10618600.2018.1473777</ext-link></mixed-citation>
  </ref>
  <ref id="ref-hobson2026">
    <mixed-citation>Hobson, M., Butcher, L., &amp; Lentati, L. (2026).
    <italic>CLASSO: A practical primal path-following algorithm for the
    constrained LASSO</italic>. arXiv preprint arXiv:2610.17024.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.48550/arXiv.2610.17024">https://doi.org/10.48550/arXiv.2610.17024</ext-link></mixed-citation>
  </ref>
  <ref id="ref-james2020">
    <mixed-citation>James, G. M., Paulson, C., &amp; Rusmevichientong,
    P. (2020). Penalized and constrained optimization: An application to
    high-dimensional website advertising. <italic>Journal of the
    American Statistical Association</italic>,
    <italic>115</italic>(529), 107–122.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/01621459.2019.1609970">https://doi.org/10.1080/01621459.2019.1609970</ext-link></mixed-citation>
  </ref>
  <ref id="ref-jeon2020">
    <mixed-citation>Jeon, J.-J., Kim, Y., Won, S., &amp; Choi, H.
    (2020). Primal path algorithm for compositional data analysis.
    <italic>Computational Statistics &amp; Data Analysis</italic>,
    <italic>148</italic>, 106958.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/j.csda.2020.106958">https://doi.org/10.1016/j.csda.2020.106958</ext-link></mixed-citation>
  </ref>
  <ref id="ref-lawson1974">
    <mixed-citation>Lawson, C. L., &amp; Hanson, R. J. (1974).
    <italic>Solving least squares problems</italic>.
    Prentice-Hall.</mixed-citation>
  </ref>
  <ref id="ref-lin2014">
    <mixed-citation>Lin, W., Shi, P., Feng, R., &amp; Li, H. (2014).
    Variable selection in regression with compositional covariates.
    <italic>Biometrika</italic>, <italic>101</italic>(4), 785–797.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/biomet/asu031">https://doi.org/10.1093/biomet/asu031</ext-link></mixed-citation>
  </ref>
  <ref id="ref-markowitz1956">
    <mixed-citation>Markowitz, H. M. (1956). The optimization of a
    quadratic function subject to linear constraints. <italic>Naval
    Research Logistics Quarterly</italic>, <italic>3</italic>(1–2),
    111–133.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/nav.3800030110">https://doi.org/10.1002/nav.3800030110</ext-link></mixed-citation>
  </ref>
  <ref id="ref-noguerajulian2016">
    <mixed-citation><named-content content-type="nocase">Noguera-Julian,
    M., Rocafort, M., Guillén, Y., et al.</named-content> (2016). Gut
    microbiota linked to sexual preference and HIV infection.
    <italic>EBioMedicine</italic>, <italic>5</italic>, 135–146.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/j.ebiom.2016.01.032">https://doi.org/10.1016/j.ebiom.2016.01.032</ext-link></mixed-citation>
  </ref>
  <ref id="ref-okabe2008">
    <mixed-citation>Okabe, M., &amp; Ito, K. (2008). <italic>Color
    universal design (CUD): How to make figures and presentations that
    are friendly to colorblind people</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://jfly.uni-koeln.de/color/">https://jfly.uni-koeln.de/color/</ext-link></mixed-citation>
  </ref>
  <ref id="ref-osborne2000">
    <mixed-citation>Osborne, M. R., Presnell, B., &amp; Turlach, B. A.
    (2000). A new approach to variable selection in least squares
    problems. <italic>IMA Journal of Numerical Analysis</italic>,
    <italic>20</italic>(3), 389–403.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/imanum/20.3.389">https://doi.org/10.1093/imanum/20.3.389</ext-link></mixed-citation>
  </ref>
  <ref id="ref-sklearn">
    <mixed-citation><named-content content-type="nocase">Pedregosa, F.
    et al.</named-content> (2011). Scikit-learn: Machine learning in
    python. <italic>Journal of Machine Learning Research</italic>,
    <italic>12</italic>, 2825–2830.</mixed-citation>
  </ref>
  <ref id="ref-cvxcla">
    <mixed-citation>Schmelzer, T. (2026a). <italic>Cvxcla: The critical
    line algorithm with an operator interface in python</italic>. SSRN
    preprint 7583179.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.2139/ssrn.7583179">https://doi.org/10.2139/ssrn.7583179</ext-link></mixed-citation>
  </ref>
  <ref id="ref-lassonote">
    <mixed-citation>Schmelzer, T. (2026b). The efficient frontier from a
    LASSO solver: A numerical check of the CLA–LASSO identity.
    <italic>Journal of Reproducible Statistics</italic>,
    <italic>1</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.68365/jrepstat.2026.7">https://doi.org/10.68365/jrepstat.2026.7</ext-link></mixed-citation>
  </ref>
  <ref id="ref-perspective">
    <mixed-citation>Schmelzer, T., &amp; Hastie, T. (2026). <italic>The
    critical line algorithm and the constrained LASSO: One curve, two
    literatures</italic>. arXiv preprint arXiv:2609.25704.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.48550/arXiv.2609.25704">https://doi.org/10.48550/arXiv.2609.25704</ext-link></mixed-citation>
  </ref>
  <ref id="ref-classo">
    <mixed-citation>Simpson, L., Combettes, P. L., &amp; Müller, C. L.
    (2021). C-lasso – a Python package for constrained sparse and robust
    regression and classification. <italic>Journal of Open Source
    Software</italic>, <italic>6</italic>(57), 2844.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.21105/joss.02844">https://doi.org/10.21105/joss.02844</ext-link></mixed-citation>
  </ref>
  <ref id="ref-tibshirani1996">
    <mixed-citation>Tibshirani, R. (1996). Regression shrinkage and
    selection via the lasso. <italic>Journal of the Royal Statistical
    Society, Series B</italic>, <italic>58</italic>(1), 267–288.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1111/j.2517-6161.1996.tb02080.x">https://doi.org/10.1111/j.2517-6161.1996.tb02080.x</ext-link></mixed-citation>
  </ref>
  <ref id="ref-tibshirani2013">
    <mixed-citation>Tibshirani, R. J. (2013). The lasso problem and
    uniqueness. <italic>Electronic Journal of Statistics</italic>,
    <italic>7</italic>, 1456–1490.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1214/13-EJS815">https://doi.org/10.1214/13-EJS815</ext-link></mixed-citation>
  </ref>
  <ref id="ref-wilson2007">
    <mixed-citation><named-content content-type="nocase">Wilson, P. W.
    F., Meigs, J. B., Sullivan, L., et al.</named-content> (2007).
    Prediction of incident diabetes mellitus in middle-aged adults: The
    Framingham Offspring Study. <italic>Archives of Internal
    Medicine</italic>, <italic>167</italic>(10), 1068–1074.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1001/archinte.167.10.1068">https://doi.org/10.1001/archinte.167.10.1068</ext-link></mixed-citation>
  </ref>
</ref-list>
</back>
<sub-article id="pr-r1-letter" article-type="editor-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r1.letter</article-id>
<title-group>
<article-title>Decision letter, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-8638-5276</contrib-id>
<string-name>Matthias Templ</string-name>
<role specific-use="editor">Editor</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="editor-decision-sent">
<event-desc>Editor decision sent</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><bold>Minor revision.</bold> Confirmed and signed by Matthias Templ on 2026-10-26.</p>
<p>Thank you for your submission to JRepStat. We are inviting a minor revision. The reviewers’ points follow, grouped by weight.</p>
<p>This note verifies numerically that a released portfolio Critical Line Algorithm, wrapped in two thin encodings, computes exact constrained-LASSO solution paths across caps, signs, equality and inequality rows, zero sums and monotone fits, matching LARS, an interior-point solver and three independent path algorithms to rounding, including when there are more predictors than observations. It matters to practitioners who need constrained-LASSO paths that lars_path cannot produce, and to portfolio and statistics readers who can now use one active-set solver across both problems. The reviewers found nothing to fix in the writing itself. We would be glad to see the revised version.</p>
<p>How to read this letter. The decision rests on the items marked required. If a required item seems wrong to you, or cannot be done within this paper, decline it on the revision page and give the reason. A reasoned decline is a legitimate answer, and the editor weighs it. Reviewers can be mistaken. Items marked recommended or optional are advice from the reviewers. Adopt them, decline them with a sentence, or leave them for later work. None of that counts against the paper. The reviewer reports below carry the same marks. The editor who signs this decision may weigh an item differently in the accompanying message, and that message prevails.</p>
<p><sc>required</sc> (the decision rests on these):</p>
<list list-type="bullet">
  <list-item>
    <p>[Reviewer 2] State the exact objective of the linear program behind the KKT certificate, so a reader can see that a small reported value certifies optimality.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 3] State that the random designs use fixed seeds recorded in the repository, and add a short determinism attestation: on a fixed platform the discrete outputs (knot counts, which problems are declined, certificate pass or fail) reproduce exactly, while near-rounding residuals vary only in the last digits. Table 4 and Table 5 report knot counts as ranges over three seeds, so the exact figures the text quotes depend on the seeds being pinned.</p>
  </list-item>
</list>
<p><sc>recommended</sc>:</p>
<list list-type="bullet">
  <list-item>
    <p>[visualisation] Figure 3 distinguishes its eight largest genera by colour alone against grey, with no direct line labels. Eight categorical hues are hard to separate under common forms of colour vision deficiency. Draw the eight from a colourblind-safe qualitative palette and label each line at its right-hand end, so the series read without reliance on hue.</p>
  </list-item>
  <list-item>
    <p>[visualisation] The penalty axis in Figures 1 and 3 reads “0 10^1 10^2” with λ decreasing, which looks like a reversed symlog axis. State the axis transform in the caption (symlog with its linear threshold, reversed) so a reader can place the knots; the units (λ) are labelled, scales are not truncated to exaggerate, and the shaded “beyond the cap” bands in Figure 1 are an honest way to mark the constraint.</p>
  </list-item>
  <list-item>
    <p>[software-landscape] A single feature table listing which constraint types each package accepts (caps, per-coefficient signs, equality rows, inequality rows, zero sums, p&gt;n, ridge-free) would consolidate what is now spread across Sections 5.5, 5.6 and the related-work paragraph, and would make the placement against comlasso, c-lasso and Gaines et al. legible at a glance. The paper stands without it.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 1] The diabetes motivating example reads as a modeling endorsement; frame it as an illustration, note the cap u is chosen post hoc, and separate the “low HDL is a risk factor” claim (which [20] supports for incident diabetes) from the inference about disease progression (the outcome here).</p>
  </list-item>
  <list-item>
    <p>[Reviewer 1] The runtime comparison in Section 5.3 is only against a grid of interior-point solves; add a note on runtime versus the dedicated path algorithms (comlasso, Gaines et al., c-lasso), or state why a cross-language timing is not comparable, so the “when to use it” guidance is complete.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 1] The “sum to one” example is described “as a synthetic control does”, but classic synthetic control also constrains weights to be nonnegative; clarify that this is a negative-weight variant so the analogy is not misread.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 1] State that the sCD14 and other real-data paths are computational demonstrations and that no biological inference is intended.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 2] Name the single published test whose path fails the segment check and report what the check returns there.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 2] Report the hostile and scale tables over more than three seeds, keeping the worst case.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 2] State the relaxation values of epsilon and note that the certificate, not the extrapolation, guarantees the returned path.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 2] Clarify how the gap against LARS is read where the minimiser may not be unique, and which five of the Table 2 problems the ported Gaines algorithm matches.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 3] Document the R toolchain that executes comlasso 0.2. The text says R 4 will not install a package built for R 3, then says the check loads it unchanged, which leaves unclear which R interpreter runs the comparison and whether a package built for R 3 behaves identically when sourced under a later R.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 3] Report the timing methodology behind the cost ratios in Section 5.3 (number of runs and the spread), instead of “the fastest of several runs”.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 3] Provide a mirror or archival fallback for the sCD14 source (coda4microbiome 0.2.4), since the fetch depends on CRAN retaining that version; the SHA-256 check confirms identity but not availability.</p>
  </list-item>
</list>
<p><sc>optional</sc>:</p>
<list list-type="bullet">
  <list-item>
    <p>[statistical-rigor] The simulated and hostile-problem claims rest on three seeds each with worst-case reporting (Tables 4 and 5). Worst-of-three is a conservative summary and no claim depends on a sampling distribution, so this is adequate for the paper’s purpose. A larger seed count would let the dependence of the gap on conditioning be characterised as a distribution rather than a single worst case, if a later paper wanted that.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 1] A predictive comparison (for example cross-validation) showing the constrained fits generalise would strengthen the applied case, though it is beyond the scope of this note.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-report1" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r1.report1</article-id>
<title-group>
<article-title>Report Reviewer 1, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-1">Reviewer 1</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-25"><day>25</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;s review engine in the role of the application reviewer, and read by the editor before the decision. How the engine works is on the <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>This is a verification note, and judged as one it does its job well. The underlying identity between the constrained LASSO path and the CLA path is proven elsewhere [14]; the work here is to show that a portfolio solver, through two encodings (Propositions 1 and 2), actually reproduces the constrained-LASSO knots on a wide spread of constraint types, and to check every path against references that know nothing of portfolios. The test matrix is the strength of the paper. Caps, signs, equality rows, inequality rows, zero sums, monotone orderings, a pinned observation and a sum-to-one constraint are each exercised, on simulated and real data, with LARS as the knot-by-knot reference where it applies and an interior-point solve at segment midpoints elsewhere, backed by a direct optimality check that holds along whole segments rather than only at midpoints. The agreement is at the level of rounding. The hostile cases (near-duplicate columns, correlation 0.99999, p&gt;n with a zero sum) and the deliberate decline of the 1e-6 duplicate are the kind of adversarial testing I want to see in a paper whose whole claim is numerical. The honesty about where references add a ridge, and the point that the CLA needs none for p&gt;n, is both correct and genuinely useful to someone choosing a tool for microbiome-scale zero-sum problems.</p>
<p>My concerns are about the applied framing, not the computation. The opening diabetes example is doing a lot of rhetorical work in Section 1 and Figure 1, and an applied reader may take it as a claim that the capped fit is the better model of the biology. The cap value u = 396.1 is chosen as half the largest least-squares coefficient, which is a post hoc choice, and the robustness sentence (caps up to 637 keep HDL negative) is reassuring but still conditional on this dataset. Separately, the reference [20] supports low HDL as a risk factor for incident diabetes, whereas the response in this dataset is a continuous measure of disease progression. The sign argument slides between those two outcomes. The cleanest fix is to present the example as an illustration of what a cap does to offsetting coefficients, and to qualify the biological reading as suggestive.</p>
<p>On guidance to users, the cost comparison in Section 5.3 is careful and precise, but it compares only against a grid of interior-point solves. The paper also runs comlasso, the Gaines et al. algorithm and c-lasso for accuracy, so a reader deciding between tools will want to know how the CLA compares to those on runtime, not only to an IPM grid. A single paragraph, even one that explains why a fair cross-language timing is not available, would round out the “when to use it” section. The “sum to one” example invokes synthetic control, and since the classic synthetic control estimator also constrains weights to be nonnegative, a one-line clarification that this is the negative-weight variant will stop the analogy being over-read. Finally, the sCD14 path is a good stress test on real compositional data, and a sentence stating that it is a computational demonstration with no biological conclusion attached will keep it from being cited as a finding about inflammation.</p>
<p>The reproducibility posture is strong as described: lockfiles pinning Python 3.12 and package hashes, a single script that writes every number quoted in the text, pinned and checksummed R and Julia environments, a checksum on the fetched sCD14 data that is not redistributed, and a stated tolerance regime that accounts for hardware-dependent last digits. I did not execute the artifacts in this pass, so I assess them as declared and leave the run itself to the reproducibility lens. None of the items below blocks acceptance; they improve how an applied reader will receive the paper.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p><sc>recommended</sc> Reframe the diabetes example in Section 1 and Figure 1 as an illustration of what the cap does to offsetting coefficients. State that u = 396.1 is chosen after seeing the least-squares fit, and separate the HDL risk-factor claim (which [20] supports for incident diabetes) from the inference about progression, which is this dataset’s outcome.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> In Section 5.3 and the “when to use it” discussion, add how the CLA compares on runtime to the dedicated path algorithms you already run (comlasso, Gaines et al., c-lasso), or state why a fair cross-language timing is not available, so the cost guidance is not read as comparing only against an IPM grid.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Clarify in Section 5.1 that the “sum to one” example allows negative weights, unlike the classic synthetic control estimator, so the synthetic-control analogy is not misread.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Add a sentence where sCD14 is introduced stating that it and the other real-data paths are computational demonstrations and that no biological inference is intended.</p>
  </list-item>
  <list-item>
    <p><sc>optional</sc> A predictive comparison, such as cross-validation of the constrained versus unconstrained fits, would strengthen the applied argument that constraints buy interpretability without cost, though it sits beyond the scope of this note.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-report2" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r1.report2</article-id>
<title-group>
<article-title>Report Reviewer 2, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-2">Reviewer 2</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-25"><day>25</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;s review engine in the role of the methodology reviewer, and read by the editor before the decision. How the engine works is on the <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: minor.</p>
<p>This is a validation note with a clear and narrow job. A theoretical identity between the constrained LASSO path and the Critical Line Algorithm path is proved elsewhere [14]. Here the author poses constrained regressions as portfolios through two encodings, runs them through a released portfolio CLA, and asks whether the resulting paths match independent references. The question is well posed and the design answers it in the right way. The two encodings in Propositions 1 and 2 are stated cleanly and their proofs are correct as given. The split into nonnegative long and short parts, the simplex rescaling with a riskless asset, and the multiplier bookkeeping all follow from the classical bound-penalty equivalence, and the paper is careful to say that the propositions borrow nothing from [14] beyond that equivalence.</p>
<p>The strongest methodological choice is the optimality certificate. Comparing a path only against another numerical solver bounds the error at the solver’s own tolerance, and the paper says so. Evaluating the subgradient conditions of problem (1) directly, at every knot and across every whole segment, with the multipliers chosen by a linear program and the residual then evaluated exactly, removes that ceiling. Checking the segment whole rather than at its midpoint alone is the right refinement, since a path can be right at both ends and at the midpoint and still cut across a knot. This is where I want one more sentence. The certificate’s force rests on what the linear program optimises. The text says the multipliers are chosen to “satisfy the conditions best”, which a reader cannot pin down. If the program minimises the largest violation across all the conditions jointly, subject to the sign constraint on the active-row multipliers, then a small reported value is a genuine optimality certificate and a true violation cannot be hidden. Please state that objective explicitly, because the whole evidential weight of the paper sits on it.</p>
<p>Two further points concern how much a reader can trust the stress results. The hostile and scale tables are drawn with three seeds and report the worst case. Three draws is thin for a claim that an algorithm declines or stays exact on a whole family of ill-conditioned designs. Re-running over more seeds and keeping the worst would make the boundary between “traced exactly” and “declined” look stable rather than incidental. Relatedly, the text claims that one of the published tests contains a path that fails the segment check, which would be a welcome demonstration that the check has teeth. I could not locate which test this is or what the check reports there. Naming it and giving its residual would turn an assertion about the check into evidence for it.</p>
<p>The treatment of degenerate starts is handled honestly as an implementation device, with an extrapolation in epsilon and a certificate afterwards. Because the extrapolation is a two-point Richardson step and its affineness “cannot be checked in advance”, the reader should be told which epsilon values are used and reminded that the returned path is guarded by the certificate and not by the extrapolation itself. On uniqueness, the paper is appropriately cautious, testing optimality and not uniqueness where p exceeds n. One consequence deserves a line. Where the minimiser is not unique, LARS and the CLA may trace different paths of minimisers, so a gap against LARS is not by itself a defect. The hostile section already argues “both paths are right” from the conditioning bound, and a short statement folding that logic into the non-unique case, together with naming which five Table 2 problems the ported Gaines algorithm matches, would close the remaining ambiguity.</p>
<p>On reproducibility I can only review what is declared, since the scripts were not provided to run in this pass. As declared the artifacts are unusually complete: lockfiles with versions and hashes, a single script that writes every quoted number, a checksummed download of the microbiome data, legacy R and Julia references pinned and ported with departures marked, and CI. This is the standard a validation paper should meet, and it is met on paper. The competing-interests statement is precise about what the author wrote and what the references are. None of the above changes the paper’s conclusion, which the evidence supports. The asks are about letting a reader verify the certificate and the stress claims with the same confidence the author has.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p><sc>required</sc> State the exact objective of the linear program used in the optimality check, specifically that it minimises the largest violation across the KKT conditions of (1) jointly, under the nonnegativity constraint on the active-row multipliers, so that a small reported value certifies optimality and a real violation cannot be masked.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Name the one published test whose path fails the segment check, and report what the check returns there, so the check’s discriminating power is shown rather than asserted.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Re-run the hostile problems of Table 4 and the scale problems of Table 3 over more than three seeds, keeping the worst case, so the line between “traced exactly” and “declined” reads as stable.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Give the relaxation values of epsilon used for degenerate starts and add one sentence that the certificate, not the two-point extrapolation, guarantees the returned path.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Add a sentence on how the gap against LARS is interpreted where the minimiser need not be unique, and name which five of the Table 2 problems the ported Gaines algorithm matches when started at the exact first knot.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-report3" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r1.report3</article-id>
<title-group>
<article-title>Report Reviewer 3, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-3">Reviewer 3</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-25"><day>25</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;s review engine in the role of the software reviewer, and read by the editor before the decision. How the engine works is on the <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: minor.</p>
<p>This is a reproducibility-first paper, and on that axis it is well built. There is a single entry point (<monospace>make figures</monospace>) that computes every path, runs every check, and writes every figure, table and quoted number, so the text and the code cannot drift apart silently. The environment is captured with lockfiles that pin Python 3.12 and every package by version and hash, the cross-language checks are pinned (Julia 1.12, a checksummed comlasso commit, c-lasso 1.0.11), and the whole thing runs in CI. The non-redistributable sCD14 data are fetched with a SHA-256 check rather than shipped. The competing-interests statement is clear about the author maintaining cvxcla and separates that from the external references. The hardware caveat is handled honestly: residuals near rounding differ in the last digits across CPUs, tolerances are set between 1e-12 and 1e-10, and timings are given only as ratios. This is close to what I would want from a numerical-check submission.</p>
<p>The gap I would close before this is treated as fully reproducible is around randomness. Tables 4 and 5 report knot counts as ranges over three seeds (for example 43–45, 92–228, 50–78), which tells me the discrete structure of the path moves with the seed. For the specific numbers in the text to be reproducible, the seeds have to be fixed and recorded in the repository, and a reader needs to know that. A short determinism statement would settle it: on a fixed platform with the recorded seeds, the knot counts, the set of declined problems, and the certificate outcomes reproduce exactly, and only the near-rounding residuals vary. The paper already supplies the hardware half of this, so the missing half is the seed and discrete-output half.</p>
<p>Two smaller reproducibility points concern the external checks that carry real evidential weight. The comlasso check agrees with the CLA to 4.3e-15, which is convincing, but the code-availability paragraph first says R 4 will not install a package built for R 3 and then says the check loads it unchanged. Which R runs the comparison, and how a package built for R 3 is loaded under it, should be stated so the reader can rebuild that leg of the check. Separately, the cost ratios in Section 5.3 rest on “the fastest of several runs,” which is a weak basis for a timing claim even when the claim is secondary to correctness. Reporting how many runs and the spread would make those ratios as defensible as the rest of the numbers.</p>
<p>On the sCD14 fetch, pinning by SHA-256 guards against the file changing but not against it disappearing from CRAN. A mirror or an archived copy, or a sentence naming a fallback, would keep that one real-data check reproducible over time. None of this touches the core correctness evidence, which is internally strong and triangulated across LARS, an interior-point solver and three independent path algorithms, with the KKT conditions evaluated along whole segments rather than at midpoints alone.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p><sc>required</sc> Record the seeds for the random designs (Wide, Correlated, Duplicate, Monotone, Sum to one, and the simulated zero-sum problems) in the repository and say so in the paper, and add a one-sentence determinism attestation that on a fixed platform the knot counts, the declined problems and the certificate outcomes reproduce exactly while near-rounding residuals vary only in the last digits.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> State which R interpreter runs comlasso 0.2 and how a package built for R 3 is loaded under it, so the comlasso comparison can be rebuilt.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Give the timing methodology for the cost ratios in Section 5.3 (number of runs and the spread) instead of reporting the fastest of several runs.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> Add a mirror or archival fallback for coda4microbiome 0.2.4 so the sCD14 check survives the CRAN version being removed.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-response" article-type="author-comment">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r1.response</article-id>
<title-group>
<article-title>Authors&#x27; response, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<string-name>Thomas Schmelzer</string-name>
<role specific-use="author">Author</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="author-comment-received">
<event-desc>Author comment received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10.r1.letter" document-id-type="doi" document-type="editor-report"/>
<related-object document-id="10.68365/jrepstat.2026.10.r1.report1" document-id-type="doi" document-type="reviewer-report"/>
<related-object document-id="10.68365/jrepstat.2026.10.r1.report2" document-id-type="doi" document-type="reviewer-report"/>
<related-object document-id="10.68365/jrepstat.2026.10.r1.report3" document-id-type="doi" document-type="reviewer-report"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p>Authors confirm each required point as done or give their reason for declining it. Further answers are voluntary, because the review compares every revision with the previous version and the next round&#x27;s reports say what remains open.</p>
<list list-type="simple">
<list-item>
<p><sc>required</sc> State the exact objective of the linear program behind the KKT certificate, so a reader can see that a small reported value certifies optimality.</p>
<p><bold>Done.</bold></p>
</list-item>
<list-item>
<p><sc>required</sc> State that the random designs use fixed seeds recorded in the repository, and add a short determinism attestation: on a fixed platform the discrete outputs (knot counts, which problems are declined, certificate pass or fail) reproduce exactly, while near-rounding residuals vary only in the last digits. Table 4 and Table 5 report knot counts as ranges over three seeds, so the exact figures the text quotes depend on the seeds being pinned.</p>
<p><bold>Done.</bold></p>
</list-item>
<list-item>
<p><sc>recommended</sc> The diabetes motivating example reads as a modeling endorsement; frame it as an illustration, note the cap u is chosen post hoc, and separate the &quot;low HDL is a risk factor&quot; claim (which [20] supports for incident diabetes) from the inference about disease progression (the outcome here).</p>
<p><bold>Done.</bold> We reframed it slightly to avoid this impression</p>
</list-item>
<list-item>
<p><sc>optional</sc> A predictive comparison (for example cross-validation) showing the constrained fits generalise would strengthen the applied case, though it is beyond the scope of this note.</p>
<p><bold>Declined.</bold> It&#x27;s indeed beyond the scope of this note</p>
</list-item>
</list>
<supplementary-material id="pr-r1-letter-file" xlink:href="the-constrained-lasso-is-a-portfolio-a-numerical-check-of-the-cla-lasso-identity-under-constraints-response-round1.pdf" mimetype="application" mime-subtype="pdf">
<caption>
<p>The authors' full response letter to round 1, as uploaded.</p>
</caption>
</supplementary-material>
</body>
</sub-article>
<sub-article id="pr-r2-letter" article-type="editor-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r2.letter</article-id>
<title-group>
<article-title>Decision letter, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-8638-5276</contrib-id>
<string-name>Matthias Templ</string-name>
<role specific-use="editor">Editor</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="editor-decision-sent">
<event-desc>Editor decision sent</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><bold>Accepted.</bold> Signed by Matthias Templ on 2026-10-26.</p>
<p>All three reviewers recommend acceptance. Both required points of the first round are met: Section 5.1 now states the objective of the linear program behind the optimality certificate, and the availability section records the seeds with a test that checks the discrete results. The editor accepted the final version after the journal reproduced it. One correction remains for the proof, a stray full stop in Section 5.5.</p>
<p>Congratulations, your manuscript has been accepted for publication in JRepStat. Production begins now.</p>
<p>Where it is not on file yet, we still need the following for production.</p>
<list list-type="bullet">
  <list-item>
    <p>a valid ORCID iD for every author</p>
  </list-item>
  <list-item>
    <p>a captured computational environment (dependencies/lockfile/container)</p>
  </list-item>
  <list-item>
    <p>a signed determinism attestation for the entry-point command</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-report1" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r2.report1</article-id>
<title-group>
<article-title>Report Reviewer 1, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-1">Reviewer 1</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;s review engine in the role of the application reviewer, and read by the editor before the decision. How the engine works is on the <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>Of the four recommended points and one optional point I raised, three are adopted and two are answered with a reason.</p>
<p>The two I weighed carefully are the declines. On runtime against the dedicated path algorithms (my point 2), the paper now states in Section 6 why a cross-language timing would measure the languages and the ports rather than the algorithms, and directs the user to Table 6 to choose by the constraints each tool accepts and then to time candidates on their own problem. That is the alternative I named, and it convinces me: comlasso read under R 4, a Julia 0.6 port and a c-lasso grid with a fixed ridge are not comparable stopwatches, and a number would mislead more than it informs. On the predictive comparison (my point 5), the decline as beyond the scope of a verification note is right, and the revised framing of the diabetes and sCD14 examples removes the suggestion that any predictive claim is being made.</p>
<p>The applied framing I was concerned about is now clean. The diabetes example reads as an illustration of what a cap does to offsetting coefficients, with u = 396.1 marked as chosen after seeing the fit, the incident-diabetes risk-factor claim from [22] separated from the progression outcome, and the cap robustness described as a property of these data. The sum-to-one example now distinguishes itself from the nonnegative-weight synthetic control estimator, and sCD14 is labelled a computational demonstration in both the text and Figure 3.</p>
<p>One change the revision made in answer to another reviewer is worth noting as newly visible, since it affects how an applied reader should read the headline claim: the extra seeds moved one p&gt;n draw of Zero-sum, signs to a worst KKT residual of 1.0×10^-9 near an interpolating fit at cond(X) ≈ 6×10^15, and the abstract and Section 5.5 now state this rather than claiming rounding-level residuals there. This is honest and correct, and it does not weaken the applied case. The paper’s claim is about where each tool’s path ends and whether it declines rather than answers wrongly, and that claim is now stated with the right precision.</p>
<p>I recommend acceptance.</p>
<p>Numbered suggestions to the authors:</p>
<p>(none open)</p>
</body>
</sub-article>
<sub-article id="pr-r2-report2" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r2.report2</article-id>
<title-group>
<article-title>Report Reviewer 2, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-2">Reviewer 2</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;s review engine in the role of the methodology reviewer, and read by the editor before the decision. How the engine works is on the <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>Of the one required point and four recommended ones I raised, all are met.</p>
<p>The required point, the objective of the linear program behind the KKT certificate, is now stated in Section 5.1 at the level the evidential weight demands: the program minimises a single number, the largest violation across the optimality conditions of (1) taken jointly under the nonnegativity constraint on the active-row multipliers, with the violation re-evaluated exactly at the multipliers found. The reader can now see why a small reported value certifies optimality to that size and why a real violation cannot be masked. This closes the one point the decision rested on.</p>
<p>The re-run over more seeds did more than tighten a table. Extending Table 3 to three seeds, Tables 4 and 5 to ten, and keeping the worst case moved the boundary between “traced exactly” and “declined”, and it exposed three further defects in cvxcla 2.7.0, two in the segment-optimality check and one in the plain homotopy, now fixed in 2.7.1 with regression tests and reported in Section 1 alongside the earlier two. The paper no longer claims rounding-level residuals where a p &gt; n path nears an interpolating fit, and the abstract and Section 5.5 now carry the 10^-9 figure. This is the right outcome of the ask, and the reporting of it is accurate to what the seeds showed.</p>
<p>The remaining three are settled. The segment check now names test_segment_check_sees_between_samples and gives both numbers, the exact optimality residual of zero at the ends and the midpoint against the 0.25 the segment check returns, which demonstrates the check has teeth. The epsilon relaxation schedule (10^-6, 10^-7, 10^-8 times the coefficient scale) is stated in Section 4 with the sentence separating what the extrapolation proposes from what the certificate guarantees. The non-uniqueness reading is folded into Sections 5.4 and 5.6, and the five Table 2 problems the ported Gaines algorithm matches at the exact first knot are named. One production-level item remains for the proof, a stray full stop in Section 5.5.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[editor_fix] In Section 5.5, join “with cond(X) near 10^16. and the interior-point solver agrees to 4.2×10^-6” into one sentence, removing the stray full stop before “and”.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-report3" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.10.r2.report3</article-id>
<title-group>
<article-title>Report Reviewer 3, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-3">Reviewer 3</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.10" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;s review engine in the role of the software reviewer, and read by the editor before the decision. How the engine works is on the <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>The required point is settled. The seeds are now recorded in <monospace>python/make_figures.py</monospace> (seed 7 for Table 2, 7–9 for Table 3, 7–16 for Tables 4 and 5), the determinism attestation is in the Code and data availability section, and <monospace>test_deterministic</monospace> runs the Table 3 and Table 4 problems twice and asserts the discrete outputs match. That closes the gap I flagged: the knot counts, the declined problems and the certificate outcomes are now pinned, and the text says which digits are allowed to move.</p>
<p>My three recommended points are also met. The comlasso leg now states R 4.6.1 runs the check and that the R 3.2 package is read with <monospace>lazyLoad</monospace> from serialized code at a pinned, checksummed commit, with the point that comlasso carries no compiled code, so the loading path is reconstructible. Section 5.3 gives the timing methodology (warm-up run, then 11 timed runs, 3 at the largest size, ratio of medians with the paired-run spread within 8%). The sCD14 fetch now falls back from CRAN to the CRAN archive to a dated Posit snapshot, with the tarball digest pinned per source and the inner data file checked byte for byte, so the real-data check survives a CRAN version removal.</p>
<p>One thing worth recording for the editor rather than the author: the extra seeds the author drew in response to another reviewer surfaced three defects in cvxcla 2.7.0 and shifted the boundary between traced and declined (Duplicate 10⁻⁶ under the cap now declined on 2 of 10 seeds, and a worst-case p&gt;n residual of 1.0×10⁻⁹). The revision reports all of this in the text and the abstract rather than smoothing it over, and the fixes ship in 2.7.1 with regression tests. From the reproducibility angle this strengthens the paper, since the released version now matches the reported numbers.</p>
<p>Numbered suggestions to the authors: (none)</p>
</body>
</sub-article>
</article>
