Replication material for
H. Mohammad, H. Choi, A. B. Abubakar, M. Abdullahi and M. S. Sarkinbai, Barzilai–Borwein-like spectral algorithm with norm descent line search for monotone operator equations, submitted to Numerical Algorithms.
This repository holds the full per-instance numerical tables behind Section 4
of the paper, together with the code that produced them and the raw run logs.
Table2.pdf is the table archive that Section 4.1 links to.
Table2.tex, Table2.pdf per-instance results for all 222 benchmark instances
tables/ the six LaTeX tables of Section 4, and the script
that generates them from the logs in data/
verify/ two independent checking scripts (see below)
data/ raw run logs, one row per run
code/ExperimentA benchmark monotone and pseudomonotone equations
code/ExperimentB l2-regularised logistic regression on LIBSVM
code/ExperimentC sparse signal recovery
code/ExperimentD sensitivity of the line-search constant a
tables/make_tables.py reads only the logs in data/ and writes
tabA.tex (Table 1), tabLambda.tex (Table 2), tabDatasets.tex (Table 3),
tabLogres.tex (Table 4), tabSignal.tex (Table 5) and tabSens.tex
(Table 6). No number in Section 4 is typed by hand.
Each code/Experiment* folder is self-contained: cd into it in MATLAB and
run the driver named in its header. The five solver files are byte-identical
across the four folders.
BBSANME solves H(x) = 0 for a continuous monotone operator
H : R^n -> R^n, without derivatives and without a hyperplane projection:
d_0 = -H(x_0); d_k = -lambda_k H(x_k), k >= 1
s_{k-1} = x_k - x_{k-1}; y_{k-1} = H(x_k) - H(x_{k-1})
gamma_{k-1} = y_{k-1} + r s_{k-1}
lambda_k = <gamma_{k-1}, s_{k-1}> / <gamma_{k-1}, gamma_{k-1}>
accept the first alpha in {1, rho, rho^2, ...} with
||H(x_k + alpha d_k)|| <= (1 + eta_k - a alpha) ||H(x_k)||,
eta_k = 1/exp(k^2)
cd code/ExperimentA
run_experimentA; % 888 runs -> resultsA_raw.csv
make_profiles_A('outdir','figuresA'); % the Dolan-More profilespython3 make_table2.py resultsA_raw.csv Table2.tex
pdflatex Table2.tex && pdflatex Table2.texThe other three experiments follow the same pattern; see
code/RUN_INSTRUCTIONS.md.
Function evaluations. #Fev counts every evaluation of H: the initial
H(x_0), every backtracking trial including rejected ones, and, for the
projection methods, the evaluation at the projection point. The same
convention applies to every solver, which is what makes the counts
comparable.
What counts as solved. A run is a solve only if the residual at the
point the solver returns is at or below the tolerance. Every run carries a
termination status: success, max_iterations, fev_budget,
line_search_failure or numerical_error. No run is dropped from any log.
Performance profiles. Dolan and Moré (2002):
r_{p,s} = c_{p,s} / min_s c_{p,s} and
rho_s(tau) = |{p : r_{p,s} <= tau}| / n_p, with r = inf for a run that did
not solve its instance, so a solver can never be rewarded for failing
quickly.
Competitor parameters come from the papers that introduced the methods,
and each solver file names the section and equation it was transcribed from.
The one exception is ISCGPM's initial trial step tau, which its paper never
gives a numeric value for; tau = 1 is used and flagged in the file.
Two scripts check the paper against the data, in opposite directions.
python3 verify/verify_claims.py # 89 checks
TEXFILE=/path/to/project2R2.tex python3 verify/verify_text.py # 27 checksverify_claims.py recomputes every quantity reported in Section 4 from the
raw logs. verify_text.py does the converse: it pulls the numbers back out
of the manuscript source with regular expressions and compares them with the
logs, so the text is checked against the data rather than against anyone's
memory. Both pass on the committed logs.
run_experimentC.m supports three stopping protocols, selected by 'mode'.
commonis the protocol the paper reports. Both methods stop at||H(u_k)|| <= 1e-6or 1000 iterations, the same rule used in Experiments A and B. Table 5 is built fromdata/resultsC_common.csv.budgetruns to a fixed evaluation budget with no early stop. Its traces are what Figures 5 to 7 plot, because a trajectory comparison is only informative if both methods are followed over the same budget, whereas the residual test stops them at different iterations. The problem instances are identical in the two cases.statedapplies the relative objective test of the submitted version. It is retained only so that the earlier results can be reproduced; it stops Modified Algorithm 2.1 while its objective is temporarily stagnant and far from the minimiser, which is why it was replaced.
The five instances are called Instance 1 to Instance 5 in the paper. They are produced by seeding MATLAB's default generator with 15, 16, 17, 18 and 19 in turn; those values are an implementation detail recorded only so the instances regenerate exactly.
The LIBSVM instances used in Experiment B come from the LIBSVM data archive and are not redistributed here. The signal-recovery instances of Experiment C are generated from a recorded seed, so they reproduce exactly.
The results committed here were produced with MATLAB 26.1.0.3251617 (R2026a)
Update 2 on Microsoft Windows (PCWIN64). Every driver prints and records its
own environment line in the header of its output file, so the provenance of
any log in data/ can be read off the file itself.
Base MATLAB only: no toolboxes, no mex files. The LIBSVM reader is plain
MATLAB, so LIBSVM's libsvmread mex is not required.
Code is released under the MIT Licence (see LICENSE). The tables and result
logs are released under
CC BY 4.0.
If you use this material, please cite the paper. A CITATION.cff will be
added once the article has a DOI.