AI Research Engineer · Philosopher · Aspiring Mathematician

Haniel Ulises

Autonomous systems, formal methods, and high-performance computing.

My research concerns what can be proved about the behaviour of an autonomous system, using methods drawn from logic and from geometry.

Undergraduate researcher, UNAM Faculty of Engineering Research collaboration with the Microsoft AI Lab AI Engineering, ESCOM-IPN · Philosophy, FFyL-UNAM

Portrait of Haniel Ulises, black and white, facing the camera

proximity graphs, behind:

§ 1

About

I am a researcher and engineer working at the intersection of high-performance computing, formal methods and autonomous systems. My work spans robotics, autonomous perception, computer vision, point cloud processing, sensor fusion, automated and epistemic planning, formal verification, digital twins and neuro-symbolic AI. The common objective is autonomous systems that perceive, reason, plan and act with guarantees that can be stated and proved.

I work close to the hardware as well as at the algorithmic level, with a focus on C++ and Python, parallel computing, GPU acceleration and low-latency systems. A recurring aim is to design computational architectures under which expressive reasoning methods run within the time and memory budgets of real systems.

I study AI Engineering at ESCOM-IPN and Philosophy at the FFyL-UNAM. Both programmes bear on the same questions: what a formal structure is, and what it means for such a structure to represent a space or a state of knowledge.

Research interests

Formal methods · Autonomous systems · Robotics · AI planning · Epistemic logic · Neuro-symbolic AI · Computer vision · Point cloud processing · Sensor fusion · SLAM · Digital twins · HPC · GPU computing · Low-latency systems · Computational algebraic geometry

Languages

C++ (17/20/23) · C · Python · CUDA · Rust · Lean 4 · Haskell · Prolog · R · Java · Verilog · VHDL · Bash

Parallel and systems

CUDA · OpenCL · OpenMP · MPI · SIMD intrinsics · RDMA · WebAssembly · LLVM · Bare-metal ARM Cortex-M · Linux systems programming · Performance and cache optimisation

Robotics and perception

ROS 2 and ROS · Gazebo · PlanSys2 · KDL · PCL · Open3D · OpenCV · TensorRT · ONNX Runtime · LiDAR point clouds, segmentation and clustering · Kalman filtering and sensor fusion · Pose-graph SLAM · Digital twins and simulation · PDDL and EPDDL

Numerics and learning

PyTorch · PyTorch Geometric · JAX · Eigen · Armadillo · GMP · BLAS · NumPy · Graph neural networks · Physics-informed networks · Gröbner bases and symbolic computation

Formal tools and build

Lean 4 · SAT and SMT solving · Explicit-state model checking · Bisimulation · CMake · Docker · Git · CTest · GitHub Actions

§ 2

Experience and education

Experience

Since Sep 2026

Engineering Intern, Automatic Control, Cinvestav-IPN

Part-time at the Centro de Investigación y de Estudios Avanzados del IPN. I develop electronic and software systems for automatic control and robotics, covering data acquisition, research software, concurrency debugging, and FPGA development through high-level synthesis.

Since Jan 2026

Undergraduate Researcher, UNAM Faculty of Engineering

Affiliated with the Microsoft AI Lab through a research collaboration. I lead projects in formal verification, automated planning, neuro-symbolic AI, and autonomous perception, developing computational methods for reasoning about and verifying intelligent autonomous behaviour in complex environments.

Jun 2026

ICAPS 2026, PR-BGI workshop

Presented ALETHEIA: Adaptive Epistemic Planning over Kripke Models with DEL Product-Update Semantics in the afternoon session of the workshop on Planning and Reasoning for Beliefs, Goals and Intentions. Programme.

Ongoing

Editor, high-performance C++ blog

I write and edit high-performance-cpp, on modern C++ for HPC, covering the optimisation work that separates a correct implementation from a fast one.

Education

Jan 2022 – Dec 2026, expected

Artificial Intelligence Engineering, ESCOM-IPN

Escuela Superior de Cómputo, Instituto Politécnico Nacional.

In progress

Engineering degree thesis

Integrates collaborative SLAM and multi-robot planning on ROS 2. A fleet of ground vehicles explores an unknown planar environment under intermittent connectivity; the fleet map is defined as the union of the observations actually delivered. Its divergence from the union of individual agent knowledge is measured directly and is the quantity the epistemic planning layer reasons about.

Since 2023

Philosophy, FFyL-UNAM

Facultad de Filosofía y Letras, UNAM. Emphasis on mathematical logic, the philosophy of geometry, and the philosophy of language.

§ 3

Projects

Twenty-one projects in five groups, then an index of further work. The figures respond to the pointer and the controls beneath them; click one to open its repository.

3.1

Formal planning

Planning over formally specified states, what an agent knows included.

3.11

ALETHEIA, epistemic planner

Planning over dynamic epistemic logic in S5n and KD45n frames. Presented at ICAPS 2026.
  • C++23
A two-agent S5 model. Announcing a fact deletes the worlds where it fails, which is the simplest product update, and changes what each agent knows about the other. Hover a world to see what it is confused with.
Detail

Classical planning assumes that the agent knows which propositions hold; epistemic planning drops this assumption. The search space consists of pointed Kripke models, each of which must be updated, minimised and compared in full at every node, and goals may be irreducibly modal, for instance that an agent knows the door is open. Performance therefore reduces to three questions: how a Kripke model is represented, how modal formulas are evaluated over it, and how two models are recognised as the same epistemic situation.

Three decisions determine the design. A model is stored as three flat arrays of 64-bit words, for valuation, accessibility and designation, so that modal operators are word-parallel set operations. Formulas are evaluated as extensions: for each subformula the set of worlds where it holds is computed bottom-up and memoised on hash-consed formula identity, which reduces common knowledge to a single greatest fixpoint. Bisimulation contraction assigns world indices in an order determined by the model's structure alone, so bisimilar states serialise identically and duplicate detection is a comparison of 128-bit fingerprints.

Against the previous implementation, same benchmark set
BeforeAfter
Largest solved instance, wall clock151 s40 ms
Resident memory on that instance21 GB7.3 MB
AND-OR search throughputn/a19.8×

Validated against the IεPC 2026 benchmarks, Tracks Basic and Intermediate. Built at UNAM-FI and IPN-ESCOM.

github.com/HanielUlises/Aletheia

3.12

ePlanSys, epistemic planning for ROS 2

EPDDL-based planning with dynamic epistemic logic reasoning, built on PlanSys2.
  • C++
  • ROS 2
ePlanSys wordmark
Detail

The execution layer for epistemic planning on physical robots. It extends PlanSys2 with S5 and KD45 world models, EPDDL domain support and heuristic search over epistemic states, so that multi-robot coordination under partial observability is expressed directly in the planner's formalism.

This sits alongside ALETHEIA, which is the planner proper, and Epistemic-Robotics, which connects both to physical robots under ROS 2. The motivating case is small and concrete. Two robots must retrieve an object from a corridor that may be blocked; a classical planner routes the second robot through it because it treats the world as globally known, and the robot fails on arrival. Here the initial epistemic state represents that uncertainty as two designated worlds, and no route is assigned until the first robot senses the corridor and collapses the belief state.

github.com/HanielUlises/eplansys

3.13

Epistemic-Robotics

The umbrella framework: epistemic SLAM and multi-agent planning under dynamic epistemic logic, on real robots.
  • C++
  • ROS 2
  • DEL
The Epistemic Robotics project site, headed "Robots that reason about what they know (and believe), and what they do not"
The project site. Planning formalisms, runtime architectures, and geometric reasoning grounded in dynamic epistemic logic and the μ-calculus, for heterogeneous multi-robot fleets under partial observability.
Detail

An autonomous robot in a partially observable environment must plan with an explicit account of what it does not know. This framework grounds multi-agent task planning in dynamic epistemic logic, so that ignorance is part of the represented state. Each agent maintains a Kripke model of the world; actions are epistemic events that refine the model by product update; and navigation routes are winning regions of μ-calculus reachability formulas computed over the occupancy graph.

The framework distinguishes two goals: that an agent reaches a zone, and that it knows it has reached it; the planner treats them separately. Several projects on this page derive from it. ALETHEIA is the planner, ePlanSys the execution layer, and the collaborative SLAM of the degree thesis the perceptual substrate; this repository connects them to physical robots.

hanielulises.github.io/Epistemic-Robotics
github.com/HanielUlises/Epistemic-Robotics

3.14

Collaborative SLAM for a ground fleet

Multi-robot mapping under intermittent connectivity, with the fleet map defined by the observations actually delivered.
  • C++
  • ROS 2
  • Gazebo
  • SLAM
Three agents exploring a real building floor plan, each running its own SLAM front end.
Detail

A fleet of unmanned ground vehicles explores an unknown planar environment, each agent running an independent pose-graph SLAM front end over its own laser observations. Inter-agent connectivity is intermittent, so the fleet-level map is defined as the union of the observations actually delivered, and the implementation models each link explicitly.

Individual occupancy estimates are fused by an operator that is idempotent and order-independent over a bounded join-semilattice, so the same observations arriving in any order give the same map, and delivery is gated by a per-agent link process, so a lost link freezes an agent's contribution without erasing it. The divergence between what an agent knows and what the fleet knows is then measured directly. That divergence is precisely the asymmetry the dynamic epistemic logic layer is meant to reason about, which is what connects this to the planning work.

A second iteration carries the same substrate, unchanged, onto the floor plan of a real building with three agents.

Occupancy grid maps built by each agent side by side with the fused fleet map
Per-agent occupancy estimates beside the fused fleet map.
Floor plan of the building used as the exploration scenario, with agent starting positions
The building floor plan used in the second iteration.

github.com/HanielUlises/ROS-Mobile · Planning/MultiRobot_ws

3.15

Heuristic-Discovery, searching for the heuristic

Treats a planner's heuristic as the object of search, and asks how far automatic discovery gets while the result stays interpretable.
  • C++
  • Python
  • STRIPS
Diagram dividing one action's cost among heuristic components: saturated, uniform, and scaled partitioning compared
Saturated cost partitioning. Each component takes the least of an action's cost it needs to keep its own table and passes on the rest, so admissible heuristics add without charging for the same thing twice.
Detail

Every heuristic in current use, whether delete relaxation, landmarks or abstractions, is a human artefact that encodes one structural insight and is fixed once published. Here an outer loop proposes heuristics as linear combinations of named state features, measures the search effort each induces on a benchmark, and uses that measurement to propose better ones. The hypothesis class is restricted to interpretable weight vectors, so that a discovered heuristic can be read, compared with known heuristics and analysed.

The first phase establishes that the loop closes. On Blocksworld under greedy best-first search, weights found after 25 planner invocations reduced node expansions by three quarters on the training instances and by more on held-out ones, with full coverage and no increase in plan cost. The result is limited to one domain, one optimiser seed and one objective. Later work adds admissible components, landmarks and pattern databases combined by saturated cost partitioning, as the basis for comparing evolutionary, reinforcement-learning and program-synthesis methods under a common objective and search engine.

Nodes expanded, Blocksworld, against goal count
BeforeAfterReduction
Training, 15 instances183846574.7%
Held out, 5 instances76411285.3%

github.com/HanielUlises/Heuristic-Discovery

3.16

MuMotion

Modal μ-calculus as a specification formalism for robotic motion planning.
  • C++20
Reachability as a least fixpoint. Each Kleene iterate adds the cells with a neighbour already in the set, until nothing changes; the robot has a route exactly when its cell is in the result. Each cell shows the iterate that adds it; hatched cells are obstacles.
Detail

A research implementation for studying fixed-point and modal logics as specifications for motion planning. The present phase establishes the logical core, namely finite Kripke structures, an explicit abstract syntax for the modal μ-calculus, well-formedness and fragment validation, and model checking over finite models by explicit Tarski and Knaster fixed-point iteration.

The formalism reproduced is that of Larocque and Liu, who adapt the deterministic fragment and its model-checking procedure from Karaman and Frazzoli. This phase introduces no new theory. Its purpose is a mathematically faithful, independently verified core on which the later phases depend; the planner is deferred to those phases.

github.com/HanielUlises/MuMotion

3.2

Logic, proof and verification

Decision procedures, and proofs that they decide what they claim to.

3.21

KripCUDA, model checking on the GPU

Explicit-state model checking of Kripke structures, with CTL as a fixpoint computation over the boolean semiring.
  • C++20
  • CUDA
KripCUDA logo: a directed state graph feeding into a GPU die
Detail

Model checking a branching-time logic is a fixpoint computation over the powerset lattice, which is complete and of finite height; by the Knaster–Tarski theorem the modal operators reach their least and greatest fixpoints by Kleene iteration in at most |S| steps. Every CTL operator is then a sequence of existential pre-image applications interleaved with set operations, and the existential pre-image is a sparse matrix-vector product over the boolean semiring with the transposed transition relation. The implementation rests on this observation, since sparse matrix-vector products map efficiently onto GPU hardware.

The transition relation resides on the device in compressed sparse row form, state sets are bitmaps assembled by warp ballot without atomics, and model products are constructed entirely on the GPU. Fair cycles require strongly connected components, which are found by parallel colouring. Structural invariants are verified at construction: totality of the relation is checked and successor lists are sorted, which makes the CSR layout a function of the model alone, independent of the order in which transitions are supplied.

Every device computation has a sequential counterpart verified step by step against it.

State graph of a two-process mutual exclusion model, showing states labelled with their atomic propositions and the transitions between them
The two-process mutual exclusion model, one of the worked examples. States carry their atomic propositions; the transition relation is the sparse boolean matrix the kernels multiply against.

github.com/HanielUlises/KripCUDA

3.22

elementary-transformer, learning first-order equivalence

Can a transformer learn when two finite structures are told apart by first-order logic with k variables? Exact labels from an Ehrenfeucht–Fraïssé game solver, and every witness sentence certified by a checker proved sound in Lean 4.
  • Python
  • PyTorch
  • C++17
  • Lean 4
qk∗(𝔄,𝔅) =min{q:𝔄≢qk𝔅}
The quantity learned: the least quantifier rank at which two structures are separated in FOk, decided exactly by the k-pebble Ehrenfeucht–Fraïssé game.
C₆ against two disjoint triangles. Every vertex looks the same to colour refinement, so the pair is C²-equivalent; three pebbles find the triangle.
Detail

Whether two finite structures satisfy the same first-order sentences with at most k variables and quantifier rank at most q is decided by an exhaustive game between Spoiler and Duplicator. The question is how much of that decision a neural sequence model can acquire from labelled examples, and whether what it acquires carries over to larger structures, to deeper distinctions, and to families built to defeat combinatorial heuristics.

The labels are exact. A C++ solver computes the separating rank by a jointly named refinement of the types of partial pebble configurations, in time O(q k (n+1)k log n), which makes k = 3, q = 4 and n = 50 a matter of milliseconds. The same tables are a complete winning strategy for Spoiler, from which a distinguishing sentence of exactly that rank is read off, and every sentence is certified by a checker whose soundness is proved in Lean 4. All 17,040 sentences of the dataset were accepted.

The learner is an axial tuple transformer over the tensor of atomic types of k-tuples, in which attention along axis i corresponds to a move of pebble i. Its separating power lies between two logics: it cannot separate Ck-equivalent structures, and with L layers it decides equivalence exactly up to rank L + 1 on bounded universes. Each test split varies a single condition (size; family, with CFI and strongly regular graphs absent from training; and rank), so each failure can be attributed to one cause.

github.com/HanielUlises/elementary-transformer

3.23

Possible-World Semantics

A machine-checked theory of possible worlds, situations, and modal necessity, formalised in Lean 4.
  • Lean 4
The Possible-World Semantics documentation site, subtitled "A Mechanistic Formalization in Dependent Type Theory"
The documentation. The whole of S5, including the necessitation rule, is derived from a single definitional choice.
Detail

A formalisation of possible-world and situation semantics in the higher-order modal and situation-theoretic tradition of Zalta, Fine, and Barwise and Perry. Every theorem is checked by the Lean kernel, and every remaining gap is tabulated as an explicit open proof obligation, so the extent of the formalisation is stated precisely.

The development is layered. An ontological grounding core fixes the primitives and their algebra, covering encoding, situations, truth, parthood, dependence and abstract objects. A modality layer postulates the S5 calculus over frames and operators. A situation layer builds worlds and their meet-semilattice on top, with extensionality and infima proved as theorems. It is the formal counterpart of the philosophical work.

github.com/HanielUlises/Possible-World-Semantics

3.24

lean-logic-dsl, propositional logic in Lean 4

A small formal-language toolkit, from syntax and semantics to normal forms, resolution and DPLL, as the floor for modal and epistemic extensions.
  • Lean 4
The syntax tree the DSL builds, evaluated bottom-up under a valuation. Toggle the atoms; hover a node for its subformula.
Detail

An embedded language for propositional logic with its own syntax, substitution, evaluation semantics and pretty-printing, and on top of it conversion to normal forms, a clause representation, resolution and a DPLL procedure. Because these are defined inside a proof assistant, the definitions are the same objects against which later statements about them are proved.

It provides the propositional base. The planned extensions are modal and epistemic logic and algebraic simplification, which connect it to the Kripke-model work elsewhere on this page.

github.com/HanielUlises/lean-logic-dsl

3.25

SAT and SMT solver

A complete DPLL implementation with an extension to DPLL(T) in progress.
  • C++
DPLL on five clauses. The first decision propagates into a conflict on C₃, the search backtracks, and unit propagation finishes the job.
Detail

A decision procedure for propositional satisfiability built as complete DPLL, with unit propagation, pure literal elimination and backtracking search over the assignment tree. It classifies a formula as a tautology, a contingency or a contradiction, by a procedure whose completeness follows from the structure of the search.

The extension in progress lifts this to DPLL(T), where the propositional search is coupled to a theory solver and the boolean skeleton is checked for consistency against the theory at each step. Work in progress, and marked as such.

github.com/HanielUlises/Theorem-Prover

3.3

Geometry and computation

Exact arithmetic wherever the mathematics permits, with every approximation made explicit.

3.31

varietas, algebraic kinematics for ROS 2

Exact inverse kinematics by Gröbner bases, with completeness certified by the structure of the ideal.
  • C++
  • Eigen
  • GMP
  • ROS 2
Diagram of a planar serial chain with revolute joints beside its formulation as a zero-dimensional polynomial system
A planar serial chain and its algebraic formulation. Forward kinematics evaluates the map; inverse kinematics computes the fibre, realised as the variety of an ideal in a finite-dimensional quotient ring.
A URDF sweep through joint space, the front end reading exact geometry over the rationals.
Detail

Robot kinematics is a system of polynomial equations over a finite-dimensional quotient ring, and varietas solves it as such by elimination theory. The tangent half-angle substitution rationalises the forward kinematics map, a Gröbner basis of the resulting ideal is computed offline, and the inverse kinematics is resolved at runtime by eigendecomposition of a fixed-size action matrix.

Completeness is certified. By the Finiteness Theorem the quotient algebra is finite dimensional exactly when the variety is finite, a condition decidable from the leading terms of the basis alone, and its dimension bounds the number of solutions counted with multiplicity. IKFast pattern-matches known kinematic structures and fails silently outside them; varietas either returns a solution set with this guarantee or identifies the hypothesis of the Extension Theorem that was violated.

Exactness is enforced at the point where geometry enters the computation. Buchberger's algorithm discards a critical pair when the S-polynomial reduces to zero, a structural test on an empty term list; in floating point, cancellation leaves a residue, the pair survives, and the finiteness verdict read off the leading monomials then describes a different ideal. The offline stage therefore runs over ℚ with GMP-backed rationals. The URDF front end follows the same principle and recovers exact geometry over the rationals by projective approximation of quaternions, since a URDF encodes π/2 as the literal 1.57079632679, whose exact rational reading describes a slightly different mechanism. Validated against KDL on a KUKA iiwa.

github.com/HanielUlises/varietas

3.32

egregium

Interactive visualisation of surfaces and manifolds, with curvature and geodesics obtained by exact symbolic differentiation.
  • C++
  • OpenGL
  • Symbolic differentiation
Rendered pseudosphere, a trumpet-shaped surface of constant negative Gaussian curvature
The pseudosphere, a surface of constant curvature K = −1, shaded by its exact symbolic curvature.
Detail

A surface is given by a formula and rendered in three dimensions together with its Gaussian curvature and its geodesics. The name refers to Gauss's Theorema Egregium: the curvature is an intrinsic invariant of the surface, determined by its metric alone and independent of any embedding in ℝ³. Surfaces are specified in four forms: explicit, parametric, implicit (rendered by raymarching), and by first fundamental form with an optional embedding for display.

Every formula is parsed and differentiated symbolically, so the derived quantities are exact to floating-point precision. This is essential for curvature: a finite-difference estimate on a coarse mesh produces plausible images with quantitatively incorrect values, and the visualiser is designed so that the rendered image and the computed value agree.

Torus shaded by a heatmap of its Gaussian curvature, positive on the outside and negative on the inner ring
A torus shaded by Gaussian curvature, positive on the outer band and negative on the inner one.
Klein bottle rendered as an immersed surface in three dimensions
The Klein bottle, immersed in three dimensions for display.

github.com/HanielUlises/egregium

3.33

PolyGraph

Computational geometry across Euclidean, spherical, and hyperbolic settings, joined to graph theory.
  • C++
  • Templates
The same triangle under constant curvature K. The angle sum exceeds 180° on the sphere and is less than 180° in the hyperbolic plane; the curvature enters the implementation as a parameter. Drag the vertices.
Detail

A template library that treats geometric primitives and graph abstractions as a single subject. Types expose their topological properties through the interface and algorithms state formal contracts on their inputs, so the separation between topology and representation is enforced by the compiler.

The library supports the three constant-curvature geometries simultaneously. Incidence and distance predicates are therefore written with the curvature as an explicit parameter, a stronger design constraint than the Euclidean case alone imposes.

github.com/HanielUlises/PolyGraph

3.34

Computational PDEs

Partial differential equations by classical schemes and by physics-informed networks, including the inverse problem.
  • Python
  • PyTorch
  • NumPy
The one dimensional wave equation integrated and post-processed.
Detail

Three complementary approaches to the same equations. Classical numerical schemes cover finite differences, finite elements and finite volumes. Physics-informed neural networks embed the PDE residual, together with the initial and boundary conditions, directly in the loss, so the constraint is enforced through the objective function.

The inverse formulation uses the network to infer unknown coefficients, parameters or source terms of the equation from observed data. The solver thereby becomes an identification method, and the comparison with classical schemes becomes a comparison of the prior knowledge each approach assumes.

github.com/HanielUlises/Computational-PDEs

3.4

Perception and learning

Measured on what the consumer downstream actually uses.

3.41

Control-oriented lane perception

Monocular lane segmentation evaluated on the geometric quantities consumed by an MPC controller.
  • Python
  • PyTorch
  • C++
  • TensorRT
  • ONNX Runtime
The quantities the controller actually consumes. Camera view on the left with the fitted lane, bird's-eye metric view on the right reporting lateral offset, heading and curvature, raw against filtered.
Detail

Lane segmenters are usually evaluated by mask overlap with the annotation. A model predictive controller consumes the vehicle's lateral offset within the lane and the curvature of the road ahead, so these are the quantities measured here. Overlap averaged over the natural frame distribution is insensitive to tight curves, which are precisely the frames that matter for control.

Training uses a curvature-stratified subset of CurveLanes with a curvature-sensitive cost, which flattens the distribution and raises performance on the tails. The detection gap between straight road and tight curves decreased from 21.6 to 3.9 points. Calibration is a pinhole model fitted by lane parallelism and validated independently against the vanishing point, so the validation does not depend on the fitting assumption.

The full chain was ported to C++: preprocessing, the network through ONNX Runtime on a half-precision TensorRT engine, and all of the geometry. The port is verified against the Python reference with golden vectors. It generalises to KITTI without retraining, recovering the lane in 94.7% of frames.

Measured on the ported chain
End-to-end throughput216 fps
Geometry module against the Python reference51×
Agreement with that reference1.3 × 10⁻¹¹
Straight against tight curve, before21.6 pts
Straight against tight curve, after3.9 pts
KITTI frames with lane recovered, no retraining94.7%
Bar chart of intersection-over-union per curvature bin, showing accuracy holding steady across bins
IoU per curvature bin. Accuracy remains stable as curvature increases; the near-straight bin is the weakest, for a geometric reason.
Held-out TuSimple footage, a different camera from the training data, run frame by frame with no temporal model.
KITTI, with no retraining. The lane is recovered in 94.7% of frames.

github.com/HanielUlises/curvature-aware-lane-seg

3.42

GCN-GrabCut, automatic segmentation

Removes the user from the loop in GrabCut by predicting the trimap with a graph convolutional network.
  • Python
  • PyTorch Geometric
  • OpenCV
Segmentation with no user interaction at any stage.
Detail

GrabCut requires a human to mark the initial trimap, which excludes it from automated pipelines. Here the trimap is predicted by a graph convolutional network over superpixels, seeded by a training-free saliency prior computed from the image itself, so the method requires no annotated initialisation at inference time.

Mean IoU on DUTS is 0.584 against 0.109 for the trivial prediction, with 187,826 parameters.

Diagram of the graph convolutional network architecture over superpixels
The network over the superpixel graph, from the saliency prior to the predicted trimap.

github.com/HanielUlises/GCN-GrabCut

3.43

High-Performance Computer Vision

Image processing and vision in modern C++ with OpenCV, written to be read as much as run.
  • C++
  • OpenCV
  • CMake
Background subtraction, with the source frame, the foreground mask, and the running background estimate side by side.
Detail

A layered collection of image processing and computer vision work. Part of it is didactic, implementing core techniques so that each algorithm is legible in the code, with correctness and readability prioritised over premature optimisation. The remainder is project work, some consolidating established methods and some developed from open conceptual questions.

Background subtraction, filtering, feature detection, stereo, and tracking all appear here, drawing on Szeliski and on the standard literature. The wider intent is to use the repository as a place to think critically about the structure of visual algorithms while extending toward scientific computing in modern C++.

github.com/HanielUlises/High-Performance-CV

3.44

mlpp

Classical machine learning in modular C++, with the mathematics kept explicit in the interfaces.
  • C++
  • CMake
  • STL
Lloyd's algorithm for k-means, one half-step at a time: assign each point to its nearest centroid, then move each centroid to the mean of its points.
Detail

Modular implementations of classical machine learning algorithms covering supervised and unsupervised learning, model validation, clustering, dimensionality reduction, and the supporting mathematical utilities. Each module operates independently and exposes a concise interface.

The codebase follows a minimal-dependency design, resting on the standard library and a set of self-contained headers, which gives predictable performance and full control over memory. The formulations are mathematically explicit, so the statistical assumptions and convergence parameters of each algorithm are visible in its interface.

github.com/HanielUlises/machine-learning-cpp

3.5

Robots and machines

From the whole-body model down to the register.

3.51

ROS-Humanoids, Unitree G1 and H1 on ROS 2

Descriptions, bringup and a whole-body model for two humanoids, with the controller built on that model.
  • C++
  • ROS 2
  • ros2_control
  • KDL
  • MuJoCo
The Unitree G1, white, and the Unitree H1, black, standing on a checkered floor in MuJoCo
The G1 and the H1, rendered offscreen in MuJoCo from the descriptions the workspace ships.
Detail

Robots are declared once, in a registry, and a single launch entry point resolves it and dispatches to the requested robot, variant and backend: RViz, Gazebo, Gazebo under ros2_control, or mock hardware with no simulator. An unrecognised value is rejected at launch, with the alternatives the registry offers.

For the G1, in its 23 and 29 degree-of-freedom builds, a C++ library reads the URDF itself and exposes a canonical joint order, limits with clamping, forward kinematics for any link, the whole-body centre of mass and gravity torques. It has no runtime ROS dependency, so offline tooling links against it directly, and its tests run against the description files, so they fail if the robot changes shape. The ros2_control controller is built on that model.

The G1 squatting, drawn frame by frame from the model's own forward kinematics, with the centre of mass and its ground projection in red.

github.com/HanielUlises/ROS-Humanoids

3.52

Bare-metal embedded systems, STM32F401

Register-level drivers with no vendor abstraction layer, on a Nucleo-F401RE.
  • C
  • ARM Cortex-M4
The whole of blinky with no HAL: one bit of GPIOA→ODR, flipped by hand, and the LED on pin PA5 at the other end. Hover the bits.
Detail

Peripheral definitions are written from the reference manual, independently of the vendor HAL, and cover RCC and GPIO. UART2 transmission is brought up by configuring the alternate function, computing the baud rate register by hand and polling the status register. A SysTick time base and standard output redirected over the serial port complete the minimum required to work without a debugger attached.

Every layer between the code and the silicon is written and verified explicitly.

github.com/HanielUlises/Embedded

3.6

Further work

Smaller, earlier, or coursework, listed for completeness.

  • Statistical-ComputingRandomised algorithms and probability in modern C++, after Mitzenmacher and Upfal, with statistical analysis in R and Rcpp.
  • ROS-ManipulatorsA ROS 2 arm taken from URDF and xacro to a ros2_control controller in Gazebo, with a wrist camera.
  • RISC-V-SoCA PicoRV32 core with memory-mapped peripherals and bare-metal firmware on a Nexys A7 (Artix-7) FPGA; the combinational groundwork is in verilog-for-fpga.
  • RDMAQueue pairs, memory registration and send and receive against the verbs API in C, worked through NVIDIA's course.
  • Data-Eng-RustPageRank, centrality and community detection, SHA-3 deduplication, a Chaum–Pedersen zero-knowledge proof, and data races made visible, in Rust.
  • Autonomous-DronesPX4 software-in-the-loop in Docker, custom Gazebo quadcopter models, and waypoint flight.
  • Geometric-DLNotebooks on graph neural networks, manifolds and clustering.
  • SDCsSelf-driving simulation in CARLA and configuration-space path planning.
  • Type-TheoryNatural numbers, typability constraints and type inference in Haskell.
  • Cellular-AutomataLife and two other automata, rendered in C with SDL2.
  • eva-llvmA small language compiled to LLVM IR, built through Soshnikov's course.
§ 4

Philosophy

In preparation: Metaphysical notes on the concept of space in algebraic geometry. The paper examines spatiality as relational and algebraic, determined by rings of functions, ideals and categorical morphisms, and applies this reading to the substantivalism–relationism debate as it bears on the points of a scheme.

The question bears directly on the technical work. A Kripke model and a scheme are both structures whose points are individuated by what holds at them, and the question of what such a point is arises in the same form in both settings.

Areas of interest: mathematical logic, philosophy of geometry, philosophy of language.

§ 5

Recognition

2026

International Epistemic Planning Competition, IεPC 2026

Entered ALETHEIA in Tracks Basic and Intermediate, and validated the planner against the competition benchmark set.

2024

ICPC México, national finalist

Placed 28th among more than a thousand participants.

2025

Geometric Deep Learning hackathon, UCSB and UNAM, first place

Built a graph neural network for brain data, modelling the topology of the connectome as a graph and applying spectral convolution over neural signals to infer functional patterns.

§ 6

Contact