MATLAB TCL parity inventory

A function-level comparison of pytcl against the MATLAB library at commit 593ce51 of the U.S. Naval Research Laboratory’s Tracker Component Library, produced by walking every directory of the MATLAB repository rather than by asserting a percentage.

Why this document exists

Earlier documentation claimed “full feature parity” and “100% MATLAB parity”. Those claims were scoped to a tier-1/tier-2 component list that was never published alongside them, and one of their checkmarks — NRLMSISE-00 — proved to be a placeholder shipped under the model’s name (gh-79). This inventory replaces assertion with enumeration.

Method

The MATLAB public surface was counted under MATLAB’s actual visibility rules: a regular .m file exposes exactly its first function (later declarations are file-local subfunctions), and classdef files expose their methods except those in Access = private blocks. Third-party code, sample code and compiled artifacts are excluded. That yields 2,549 public names across 1,843 files — against 1,899 public names in pytcl.

Automated name matching is a lower bound only: MATLAB ships one file per variant where pytcl uses a keyword argument, and the port renamed systematically (KalmanUpdatekf_update). The verdicts below come from reading each area’s function list against pytcl’s modules.

Summary

pytcl ports the core tracking workflow comprehensively and validates it against independent references, but the MATLAB library’s full surface is substantially broader. By function count, coverage is roughly a third of the MATLAB public surface. By workflow — filter, associate, track, evaluate, in Earth-referenced coordinates — coverage is near-complete, and in several places pytcl exceeds the original (OSPA/MOT metrics, ionosphere models, R-trees and cover trees, STFT/wavelet transforms and matched filtering, SQL/HDF5 track storage, GPU backends). Min-cost flow is not among them: MATLAB ships Mathematical_Functions/Graph_Algorithms/minCostFlow.m.

MATLAB area

Public

Coverage

Notes

Dynamic_Estimation

113

Core strong

KF/EKF/UKF/CKF, square-root and UD forms, SRIF, information filter, H-infinity, IMM, particle filters, RBPF, and RTS/two-filter/fixed-lag smoothers all ported (fixed_interval_smoother is a documented alias for the RTS smoother, not a fourth algorithm). Missing: EnKF, ESRIF, quasi-Monte-Carlo Kalman variants, BLUE polar/spherical measurement updates, progressive Gaussian update, pure-propagation filter, reduced-state filters, batch least-squares estimators, PCRLB/Riccati analysis tools. Also absent, and larger than that list suggests: the entire Measurement_Update/Update_Parts tree (30 files, 27% of the area – separate gain, measurement-prediction and update-with-prediction entry points, which pytcl does not decompose its updates into), continuous-discrete propagation (State_Propagation/Continuous_Time, 6 files), divided-difference filters, one/two-point initialization, and batch/FIR smoothers. By counterpart count roughly 20 of the 113 MATLAB functions have a pytcl equivalent; “Core strong” describes the KF family’s depth, not breadth across the area.

Dynamic_Models

62

Partial

CV/CA (arbitrary polynomial order, via f_poly_kal/q_poly_kal), coordinated turn (2D/3D/polar) and Singer F and Q matrices ported. Missing: Gauss-Markov at orders other than 2 – MATLAB’s FGaussMarkov/QGaussMarkov are arbitrary-order (order 0 is Ornstein-Uhlenbeck, 1 is integrated OU, 2 is Singer) and pytcl ports only the order-2 Singer case, with no order argument; also weave/spiral maneuver models, flat-to-curved-Earth dynamics, geodesic Brownian motion, trajectory generators with constrained endpoints, process-noise suggestion tooling.

Assignment_Algorithms

45

Core strong

2D assignment (Hungarian, auction, Murty k-best), 3D assignment, JPDA with gating, min-cost flow all ported and oracle-validated. Missing: bottleneck assignment, knapsack, transportation problem, stable-matching family, missed-detection LR matrix builders, assignment-probability calculators beyond JPDA.

Coordinate_Systems

331

Partial

Cartesian/spherical/polar/geodetic/ENU/NED/SEZ conversions, rotations, quaternions, r-u-v (range plus direction cosines, cart2ruv/ ruv2cart) and the standard projections ported; UTM is validated to sub-mm against pyproj/EPSG, but stereographic and azimuthal_equidistant are spherical approximations that diverge from PROJ by kilometres away from the projection centre (their own docstrings tabulate this; gh-25). The angle-only direction-cosine UV measurement system’s core conversions are now ported (coordinate_systems.conversions.uv, v2.8.0: u-v <-> spherical, full bistatic r-u-v, camera-to-uv); its Jacobians, Hessians and cubature/Taylor covariance conversions are not. Missing: most of the 65-function time suite (pytcl covers UTC/TAI/TT/GPS and Julian dates; TDB/TCB/TCG, Besselian epochs, sidereal local time variants absent), 26 of the 30 measurement Jacobians (spherical, polar, r-u-v, ENU/NED and geodetic Jacobians are ported, in coordinate_systems/jacobians/) and all 14 Hessians, the ellipsoidal azimuthal-equidistant family (pytcl’s azimuthal_equidistant is a spherical approximation), other exotic projections (bipolar, gnomonic), ellipsoidal-harmonic coordinates, RF transform-parameter estimation.

Mathematical_Functions

1,440

Selective

The largest area and the largest gap, though much of it is generic numerics rather than tracking. Ported well: the CFAR family (pytcl adds GO/SO/2-D beyond MATLAB’s CA and OS), core statistics (12 distribution classes vs MATLAB’s 54), interpolation, special functions. Note that pytcl’s STFT/CWT/DWT and matched filtering are not ports – the MATLAB library contains no STFT, wavelet or matched-filter code at all, so they belong under “what pytcl adds” below, not under parity. Signal processing overall is thin against the original: roughly 6 of 51 MATLAB names, with the entire 17-file Array_Processing subtree (tapering, beam patterns, subarray weights) unported. Basic matrix operations likewise: about 10 of 99, with the Joint_Matrix_Diagonalization and Tensors subtrees absent. The cubature-point library (~148 files – a signature strength of the MATLAB TCL) is now well covered: the degree-5/7 Gaussian rules including the full seventh_order_cubature_points algorithm surface, spherical-radial points (with the beta generalization), Genz-Keister nested rules, the 14th-order and 2nd-order (Julier) rules, Student-t cubature points, Smolyak sparse grids over the Genz-Keister sequences, and tensor Gauss-Hermite. Gaussian LCD samples (gaussian_lcd_samples) and the general-dimension uniform region-cubature rules (Cube/Simplex/Sphere/Spherical-Surface) have since shipped. Remaining: the 48 dimension-specialized subdirectory files within that same region-cubature subset (fixed 2D/3D formulas in Cube/, Square/, Tetrahedra/, Triangles/), three 1-D quadrature building blocks, and the region types outside that subset (Prism, Pyramid, Cross_Polytope, Exp_Weight, Weighted_Ellipse, Hexagon, Spherical_Shell – 33 files – plus loose torus and n-dimensional-shell rules; see Development Roadmap). There is no cone or wedge rule anywhere in the MATLAB library. Also thin or absent: combinatorics (113 vs 18), polynomials (55; no pytcl counterpart), geometry beyond basics (81), continuous optimization (37), most specific integrals/derivatives (the Carlson symmetric and incomplete elliptic integrals are ported, in special_functions/elliptic.py), graph algorithms other than min-cost flow, accurate-arithmetic helpers.

Astronomical_Code

28

Partial

SGP4 (validated against the official library), Kepler propagation, orbital elements, Lambert solvers, JPL ephemerides via jplephem. Missing: Hipparcos catalog access, aberration and light-deflection corrections, EOP acquisition, angles-only initial orbit determination, two-point velocity determination, equinoctial Kepler solver.

Atmosphere_and_Refraction

34

Partial

U.S. Standard Atmosphere 1976/ISA validated; barometric thermosphere with documented limits (gh-79); all 10 humidity conversions, both dew-point functions, the refractivity helpers and the astronomical-refraction group (SinclairAtmos, removeAstroRefrac/addAstroRefrac with all three algorithms, simpAstroRefParam transcribed from the in-tree SOFA source) and the complete Standard_Exponential_Model suite (bistatic r-u-v ray tracing, bias approximation, cubature conversions, refractivity reduction) ported and validated against MATLAB fixtures; speed of sound (ideal-gas and Cramer algorithms). Missing: the gas-table speed-of-sound algorithm (needs NRLMSISE-00 output), the Jacchia 1971 model (pure MATLAB and portable, but its validation oracle – Sun position via readJPLEphem, GCRS2ITRS, Cal2UTC – is the SOFA MEX chain plus JPL ephemeris data, so it is deferred as an astronomy-integration task), NRLMSISE-00 proper (the MATLAB .m files are MEX stubs; the implementation is Brodowski’s public-domain C port in 3rd_Party_Libraries/nrlmsise-00-bc9a2fe/, portable but a standalone project). pytcl adds ionosphere models (Klobuchar, TEC) that the MATLAB area lacks.

Gravity

14

Good

EGM coefficient loading, geoid height, normal gravity, tide offsets (solid/pole/ocean) ported. Missing: lunar gravity coefficients, polar-motion/drift coefficient adjustments, ellipsoidal parameter conversions.

Magnetism

12

Split

Coefficient loading and field evaluation for WMM/IGRF/EMM ported and validated to sub-nT. Missing: the coordinate-system half — apex and quasi-dipole coordinates, centered-dipole transforms, magnetic-heading conversions, field-line tracing.

Navigation

21

Good

Direct/indirect geodesic, great-circle and rhumb problems ported, validated against GeographicLib; rhumb intersection is ported as rhumb_intersect and great-circle TDOA as great_circle_tdoa_loc. Great-circle intersection is ported too, as great_circle_intersect (plus a path-endpoint form, great_circle_path_intersect). Missing: the geodesic (ellipsoidal) intersection, surface angles, the at-a-fixed-height *ProbGen generalizations of the direct/indirect geodesic and rhumb problems, geodesic midpoint, and standalone pseudorange localization (pseudoRangeLoc) – pytcl has only the filter-component pieces of the last.

Static_Estimation

11

Split

Nine of the 11 localization estimators are ported in static_estimation.localization (v2.8.0): TDOAOnlyStaticLocEst, rangeOnlyStaticLocEstNP, RROnlyStaticVelEst, getAdHocCartCov, directionOnlyStaticLocEst (with two upstream defects fixed and documented: an RInv-discarding overwrite that also crashed 2D, and a range-refinement typo) and computePolyMeasFIM, plus — via the polyRootsMultiDim port — TDOA2Cart, rangeRate2StaticPos and rangeRateRatio2StaticPos2D, all validated against MATLAB fixtures. Missing: only the two Uses_External_Solver files (need the SCS solver). pytcl’s static_estimation also ports the general estimators (OLS/TLS/robust/MLE) that MATLAB keeps elsewhere; RANSAC and recursive least squares are pytcl originals with no MATLAB counterpart anywhere in the library.

Clustering_and_Mixture_Reduction

14

Good

Runnalls and West mixture reduction, k-means(++) ported; pytcl adds DBSCAN and hierarchical clustering. Missing: ISE-based reduction and its gradients, brute-force reduction, windowed grid centroiding.

Container_Classes

265

Different emphasis

k-d tree and metric tree ported (as KDTree/BallTree/VPTree), ClusterSet ported; pytcl adds R-trees, cover trees and the whole track/measurement container layer. Missing: AVL tree, binary heaps, disjoint sets, linked lists, interval class, B-spline class — largely idiomatic-Python non-goals, but absent nonetheless.

Performance_Evaluation

12

Split

NEES (with confidence bounds), RMSE ported; pytcl adds the standard OSPA metric and CLEAR-MOT metrics. Missing: MATLAB’s MOSPA/MMOSPA family (calcMOSPAError, MMOSPA2Tar2D — a related but distinct OSPA-family capability), AEE/GAE, jitter, MERF, non-credibility index.

Terrain

3

Partial

The Earth2014 dataset is read (plus GEBCO, which MATLAB lacks), but not MATLAB’s function: getEarth2014TerrainCoeffs returns degree-2160 spherical-harmonic coefficients from .bshc files, while pytcl parses the 1-arcmin geodetic grid products and has no .bshc parser. Solid-tide shift ported. So of the three public functions, one (solidTideShift) has a genuine equivalent and both coefficient-returning functions – Earth2014 and EGM2008 terrain – are unported.

Misc

52

Mostly N/A

Bit manipulation, MATLAB plotting, file utilities — superseded by numpy/matplotlib/stdlib. Substantive absences: GSHHG coastline data access and pointIsOnLand.

Transponders

3

Partial

MATLAB’s Transponders directory holds exactly three functions: decodeAISString (parse an NMEA sentence to a struct, wrapping libais, a C library), decodeAISPosReports2Mat (extract position reports into a matrix), and NMEAChecksum (compute/validate an NMEA sentence’s trailing *hh checksum, usable whether decoding or constructing one). pytcl (v2.2.0) ports the first two as pytcl.transponders.ais’s decode_ais and ais_position_reports, which reassemble multipart !AIVDM/!AIVDO sentences and extract position reports (message types 1/2/3/18/19), normalizing ITU-R M.1371 “not available” sentinels to NaN – via pyais, a pure-Python decoder, rather than a libais binding, so the two are functionally equivalent but not the same implementation. Validated against 6,808 real position reports from 299 ships off Norway (see Results I/O). NMEAChecksum is ported too, as nmea_checksum; decode_ais and ais_position_reports validate the trailing *hh by default (validate_checksum=True, NMEA 4.10 TAG blocks handled). Missing: NMEA sentence construction in either direction (encoding a message back to !AIVDM text) – neither is ported.

Scheduling

4

Absent

Interval scheduling algorithms not ported.

Physical_Values

14

Partial

Physical constants partially ported: 43 module-level constants against Constants.m’s 92 properties (Constant), with the WGS72, EGM96/EGM2008 and lunar (GL0900C/JPL) constant families and the atomic/electromagnetic set (electron and proton mass, fine structure, Rydberg, Faraday) all absent. Radar bands, water permittivity, reflection-coefficient models, elementAMU and gasProp absent.

What pytcl has that the MATLAB library does not

The comparison runs both ways. pytcl adds: the standard OSPA metric and CLEAR-MOT evaluation, ionospheric delay models, R-trees and cover trees, DBSCAN and hierarchical clustering, min-cost-flow assignment, SQL and HDF5 track storage with migration tooling, dual-backend GPU acceleration, and a test suite of 8,000+ cases that includes 49 validation files checking against independent references — the MATLAB library distributes no test suite at all.

Honest bottom line

The defensible claim is not “full feature parity”. It is: the core tracking workflow is ported, oracle-validated, and in places extended; the MATLAB library’s long tail — its cubature collection, refraction suite, time-scale zoo, localization estimators and specialized coordinate systems — is substantially unported, at roughly a third of the full public surface by function count. Areas above marked Absent, Weak or Divergent are the honest priority list for anyone who needs them.