Index: trunk/BNC/src/bnchelp.html
===================================================================
--- trunk/BNC/src/bnchelp.html	(revision 10925)
+++ trunk/BNC/src/bnchelp.html	(revision 10931)
@@ -4531,4 +4531,108 @@
 </p>
 
+<p><h4 id="ppparmethod">2.13.2.10.0 Algorithm Description</h4></p>
+<p>
+The BNC PPP ambiguity resolution combines two classical methods: the
+<b>LAMBDA</b> (Least-squares AMBiguity Decorrelation Adjustment) algorithm for the integer search,
+and <b>BIE</b> (Best Integer Equivariant) weighting for the final estimate.
+The following describes the individual steps as implemented in <tt>src/PPP/ambres.cpp</tt> and <tt>src/PPP/lambda.cpp</tt>.
+</p>
+
+<p><b>Step 1 &ndash; Float ambiguity extraction</b><br>
+The Kalman filter state vector contains all estimated parameters (receiver position, receiver clock,
+troposphere, and carrier-phase ambiguities). The AR module extracts only the ambiguity entries
+into a reduced vector using a design matrix, together with the corresponding sub-block of the
+variance&ndash;covariance matrix.
+</p>
+
+<p><b>Step 2 &ndash; Resolvability filtering</b><br>
+Before entering the search, each ambiguity must pass the following quality gates:
+</p>
+<ul>
+  <li>A minimum number of epochs observed (see <a href="#ppparmin">Min # Epo</a>)</li>
+  <li>A minimum satellite elevation angle</li>
+  <li>At least 2 ambiguities available per GNSS group</li>
+  <li>A minimum number of satellites per constellation (see <a href="#ppparmin">Min # Sat</a>)</li>
+</ul>
+
+<p><b>Step 3 &ndash; Reference ambiguity selection</b><br>
+One ambiguity per constellation group is chosen as a reference (the one that minimises the sum of
+double-difference variances). It is tightly constrained to its nearest integer via a Kalman
+pseudo-observation update. This step effectively converts zero-difference to single-difference
+ambiguity space and ensures a stable basis for the search.
+</p>
+
+<p><b>Step 4 &ndash; LAMBDA decorrelation</b><br>
+The ambiguity covariance matrix is decomposed as <i>L&middot;D&middot;L</i><sup>T</sup>.
+An integer-preserving transformation matrix <i>Z</i> (with det(<i>Z</i>)&nbsp;=&nbsp;&plusmn;1) is
+applied to minimise the correlation between ambiguities. After this step the search is far more
+efficient because the transformed ambiguities are nearly uncorrelated.
+</p>
+
+<p><b>Step 5 &ndash; BIE candidate search</b><br>
+A sequential search-and-shrink algorithm (SSEARCH) finds the top 100 integer candidate vectors
+ranked by their squared Mahalanobis distance &chi;&sup2;. For each candidate <i>i</i> an
+exponential weight is computed:
+</p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;<i>w</i>(<i>i</i>) = exp(&minus;0.5 &middot; (&chi;&sup2;<sub><i>i</i></sub> &minus; &chi;&sup2;<sub>best</sub>))</p>
+<p>
+The <b>BIE estimate</b> is then the weighted average over all candidates:
+</p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;<i>a</i><sub>BIE</sub> = &sum; <i>w</i>(<i>i</i>) &middot; <i>a</i>(<i>i</i>) / &sum; <i>w</i>(<i>i</i>)</p>
+<p>
+This is the key difference from plain LAMBDA/ILS, which picks only the single best integer vector.
+BIE produces a real-valued weighted combination and is the minimum mean-square error estimator
+under a Gaussian distribution.
+</p>
+
+<p><b>Step 6 &ndash; BIE variance</b><br>
+Rather than adopting the optimistic variance of the single best candidate, BIE computes a
+conservative variance that reflects the probability mass spread across all candidates:
+</p>
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&sigma;&sup2;<sub>BIE</sub>(<i>j</i>) = &sum; <i>w</i>(<i>i</i>) &middot; (<i>a</i><sub>BIE</sub>(<i>j</i>) &minus; <i>a</i>(<i>j</i>,<i>i</i>))&sup2;</p>
+
+<p><b>Step 7 &ndash; Fixability decision and constraint imposition</b><br>
+An ambiguity is considered fixable if both of the following criteria are met:
+</p>
+<ul>
+  <li>|<i>a</i><sub>BIE</sub> &minus; round(<i>a</i><sub>BIE</sub>)| &le; Max Frac (see <a href="#ppparmax">Max Frac and Sig</a>)</li>
+  <li>&sigma;<sub>BIE</sub> &le; Max Sig (see <a href="#ppparmax">Max Frac and Sig</a>)</li>
+</ul>
+<p>
+For all fixable ambiguities, Kalman equality constraints with a tight weight are applied to force
+the filter state vector to adopt the integer values. Subsequent filter updates treat these fixed
+ambiguities as pseudo-observations until a cycle-slip triggers a reset.
+</p>
+
+<p><b>Comparison with other PPP ambiguity resolution methods</b></p>
+<table border="1" rules="all" frame="box" bgcolor="#FFF5EE" style="font-size:13">
+  <tr bgcolor="#E0E0E0">
+    <td><b>&nbsp;Method&nbsp;</b></td>
+    <td><b>&nbsp;Integer choice&nbsp;</b></td>
+    <td><b>&nbsp;Output&nbsp;</b></td>
+  </tr>
+  <tr>
+    <td>&nbsp;Rounding&nbsp;</td>
+    <td>&nbsp;Nearest integer per ambiguity, independently&nbsp;</td>
+    <td>&nbsp;Hard fix, simple but fragile&nbsp;</td>
+  </tr>
+  <tr>
+    <td>&nbsp;Bootstrapping&nbsp;</td>
+    <td>&nbsp;Sequential conditional rounding&nbsp;</td>
+    <td>&nbsp;Hard fix, faster than ILS&nbsp;</td>
+  </tr>
+  <tr>
+    <td>&nbsp;ILS / LAMBDA&nbsp;</td>
+    <td>&nbsp;Single globally optimal integer vector&nbsp;</td>
+    <td>&nbsp;Hard fix, optimal under Gaussian noise&nbsp;</td>
+  </tr>
+  <tr>
+    <td>&nbsp;<b>BIE (BNC)</b>&nbsp;</td>
+    <td>&nbsp;Weighted combination of top-N candidates&nbsp;</td>
+    <td>&nbsp;Soft/weighted fix, minimum MSE estimator&nbsp;</td>
+  </tr>
+</table>
+<br>
+
 <p><h4 id="ppparsys">2.13.2.10.1 Constellations - optional</h4></p>
 <p>
