I'm Christian H. Cooper, an ML engineer working on low-resource language models, reinforcement learning, and agent harnesses. My main research line is Dakota and Cree: turning historical grammars and dictionaries into extracted data, verifiable tasks, reward functions, and models that can be evaluated and corrected.
I also build Math-To-Manim, where a mathematical question becomes a visual explanation, and WorkspaceAlberta Harness, which connects AI tools to practical work for Canadian businesses and skilled trades. Across these projects, I work on the whole loop: prepare the data, build the system, inspect its failures, and measure what improves.
| 700+ public repos |
2,400+ stars on Math-To-Manim |
17 / 7 / 8 HF models, datasets, Spaces |
82M+ tokens through one GRPO run |
Dakota + Cree low-resource language research |
The engineering behind the projects:
- Model training & fine-tuning — GRPO post-training and LoRA experiments on Tinker and Prime Intellect, with model cards, checkpoints, and training logs on Hugging Face and W&B.
- Data labeling & dataset engineering — VLM extraction from archival scans, orthography-preserving labeling, synthetic Q&A expansion, structural holdouts, hash-addressed dataset artifacts with citations intact.
- Reward/verifier design — grammar-derived checks with separate orthography, morphology, and reference-matching scores, so a change in reward can be traced to the scoring code.
- Visualization that explains — Manim render pipelines, RL training-curve dashboards, LiDAR terrain viewers.
Ask a question → get a visual explanation. Math-To-Manim works backward through prerequisites, builds a teaching sequence, checks the mathematics, and turns it into a Manim scene for rendering and review.
I started it on the morning of January 20, 2025, the day DeepSeek-R1 was released. The first project commit records 04:24 Mountain Time. GRPO made me think about recursive self-reasoning: could a system check intermediate results and use that feedback to improve its next attempt? Math-To-Manim gave me something concrete to test. R1's release record marks the same day.
Still in progress: I am using Math-To-Manim as an RL experiment, turning failed scenes and repair attempts into training tasks. Cheap code checks guide rollouts; rendered frames provide slower evaluation. Inference-time revision and RL weight updates are separate steps, and I am still working on the connection between them. Read the experiment notes.
Can a historical language volume provide enough structure to start a useful training loop?
Dakota1890 starts with Riggs' 1890 grammar and dictionary: preserve the orthography, extract rules, generate tasks, and score outputs against explicit constraints. The experiments have progressed from a 0.6B model to a 35B GRPO adapter.
Cree1865 tests the approach on Watkins' 1865 dictionary, with synthetic bilingual Q&A, a Cree-specific verifier, and LoRA training through Tinker. Its 800-step run, model card, and inference demo are linked below.
The shared idea is grammar as a reward function. I log the scoring components separately to see what the model is learning and where the verifier falls short. A higher score on source-derived tasks does not establish fluency; speaker-led evaluation and correction remain the next stage I want to develop.
Now building: Baguettotron-Dakota1890 connects the Dakota1890 morphology gym to a GRPO fine-tuning stack for PleIAs/Baguettotron.
One Dakota reward formulation illustrates the component breakdown; the Cree verifier uses its own rubric.
reward = (
0.4 * character_preservation + # orthography: ŋ š ć ḣ preserved?
0.4 * affix_accuracy + # morphology: correct affixes applied?
0.2 * semantic_correctness # semantics: meaning vs. ground truth
) * difficulty_multiplier # curriculum weight, 1.0x → 2.0x| Model | Params | Method | Reported run result |
|---|---|---|---|
| Laguna-XS.2-Adaption-Dakota-QA-GRPO | XS | GRPO, Prime Hosted Training | Reward 0.283 → 0.433, char-F1 0.327 → 0.635 |
| Qwen3.6-35B-A3B-Dakota1890-GRPO | 35B | GRPO, Tinker | 82.05M tokens, audited reward channels |
| Cree1865 | 30B-A3B | Modified GRPO, Tinker | 800-step synthetic-expansion run, live W&B |
| Qwen3-4B-RailRoadEngineer1959 | 4B | LoRA, volume2gym lineage | Rulebook-compiled task families |
| Qwen3-0.6B-Dakota-Grammar-RL-400 | 0.6B | GRPO, Prime Intellect | 400 steps, +150% reward, 97.9% morphology accuracy |
| nanochat-AquaRat | nano | RL, AQuA-RAT | GSM8K-style → multiple-choice algebra |
volume2gym develops the broader engineering idea: turn structured source material into cited knowledge units, training tasks, and executable checks. It supports six task families, grouped holdouts, reward ledgers, and SFT/GRPO exports, with hashes that make changes to artifacts detectable.
| Task family the compiler emits | What it tests |
|---|---|
standard_operation |
Correct ordinary application |
edge_case |
Boundary conditions and missing facts |
conflict_resolution |
Compatible resolution of constraints |
exception_handling |
Exception triggers vs. normal boundaries |
violation_check |
Missing requirements, forbidden actions, bad order |
adversarial_distractor |
Rejection of plausible but unsupported instructions |
The 1959 Consolidated Code of Operating Rules lineage: 536 extracted rules → 2,708 scenarios → gym → Qwen3-4B adapter → Rule 99 contract fixture on Hugging Face.
| Dataset | What it is | Shape |
|---|---|---|
| adaption-dakota-english-qa | Remastered Dakota–English QA for instruction tuning & GRPO | 1,953 examples |
| dakota-bilingual-qa | Bilingual QA pairs from the 1890 dictionary | 2,445 examples, train/val |
| volume2gym-railroad-1959 | Rule 99 artifact-contract fixture with ledgers | 6 train / 1 held-out |
The scans are part of the engineering problem. Diacritics, variant spellings, and dictionary direction matter when text becomes training data. I use VLM extraction and synthetic Q&A to create more tasks from the relationships recorded in each source, while keeping the distinction between extracted material and generated examples.
These historical books are starting points. They cannot capture a living language on their own. The correction loop I want to build retains the prompt, the model's answer, and a speaker's correction with the context that explains the mistake.
| Project | Source volume | Public artifacts |
|---|---|---|
| Dakota1890 | Riggs 1890 Grammar & Dictionary of the Dakota Language | Baguettotron GRPO stack · 35B adapter · Laguna run card |
| Cree1865 | Watkins 1865 Dictionary of the Cree Language | HF model · W&B run · explained dashboard · inference Space |
| Railroad Engineer 1959 | 1959 Consolidated Code of Operating Rules | Qwen3-4B LoRA · dataset fixture |
Handwriting and OCR lineage runs through the repo list too — PyLaia (handwritten document analysis), deepseek-ocr, olmocr (PDF linearization for training data), and a reproduction of LeCun 1989 handwritten zip-code recognition — the ancestor of all of this.
I design WorkspaceAlberta Harness, a custom AI terminal that connects business context with procurement evidence from CanadaBuys and Alberta Purchasing Connection. The aim is practical: help an operator assess an opportunity and produce a useful bid brief, document, or working tool.
My work covers connectors, tool routing, persistent task state, and agent procedures that can be improved through reviewed corrections. It applies the same discipline as the training work: keep the evidence visible, distinguish missing information from a confirmed answer, and measure whether the result helps the person doing the job.
| Project | What it shows |
|---|---|
| lidar2 | Map-driven LiDAR visualizer — OpenTopography DEM → multi-layer 3D terrain point clouds (React, Three.js, custom GLSL elevation shaders) |
| maplibre-gl-lidar | MapLibre plugin for visualizing LiDAR point clouds |
| openArchive | Research UX over BC & Alberta archive collections |
| AlbertaWorkspaceAgent | Agent-native workspace experiments for Alberta research workflows |
| Live demos (Spaces) | Try it |
|---|---|
| Cree1865-Tinker-Inference | Sample from the Cree1865 training run |
| Dakota-.6B | Dakota grammar RL demo |
| AskAboutCIL | Community-in-the-loop method explainer |
The linked training runs expose reward curves and component metrics. I use these logs to investigate failures and check whether the recorded rewards agree with the verifier.
Live — refreshed every 6 hours by a GitHub Action from CNBC, Reuters, and FT feeds.
| Category | Date | Headline |
|---|---|---|
| Market | Sep 25, 2026 | Appeals court rules that states can regulate Kalshi’s sports prediction markets, dealing another ... |
| Market | Sep 25, 2026 | Crypto platform Bitget suspects North Korea is responsible for $352 million hack |
| Market | Sep 25, 2026 | China's Xi urges U.S. to cooperate on AI |
| Market | Sep 25, 2026 | Here's who attended the Trump-Xi state dinner |
| Market | Sep 24, 2026 | Philadelphia Fed's Anna Paulson says 'modest' rate moves likely ahead to tame inflation |
| Finance | Sep 25, 2026 | Soaring bond yields ‘not even close’ to cooling red-hot US economy, investors say |
| Finance | Sep 25, 2026 | US bond sell-off pushes long-term yields to highest since 2004 |
| Finance | Sep 25, 2026 | Bond ructions point to new danger zone in markets |
| Finance | Sep 25, 2026 | Maga base recoils as Trump goes all-in on AI |
| Finance | Sep 25, 2026 | Pomp prevails over substance as Trump hosts Xi |
GitHub · Hugging Face · Weights & Biases · LinkedIn · X · Kaggle
Interested in low-resource language modeling, RL environments, or agent harnesses? The repos and run cards above show how I work. Get in touch if you are building in the same direction.


















