Welcome to my Github profile. A tiny corner on the internet you somehow stumbled into!
I’m a physicist and worked on the search for ‘solar axions’ using ‘helioscopes’ (CAST) during my PhD thesis (axions are hypothetical particles that help to solve a mathematical problem in physics, but might be a dark matter candidate. Helioscopes are “telescopes” that observe the Sun using a magnet instead of some kind of mirror).
In some way, I was lucky to be doing my PhD research in a group where we always had too few people for too many research projects (sounds familiar? 🤭). It meant I had to / could write all the analysis code for my thesis work from scratch in whatever language I wanted. Back in 2016 I was generally a fan of Python, but was annoyed by its slow performance if one wasn’t careful. While shopping around for a suitable language, I eventually stumbled on Nim and the rest is history.
I’m interested in coding especially in applications for scientific computing and machine learning. Recently I’ve also been dabbling a bit more on the cryptography side (mostly related to Ethereum).
Below is an overview of my work, split by different categories of things I care about.
Unless otherwise specified, all code below is written in Nim.
- phd - The git repository of my PhD thesis. See https://phd.vindaar.de for the companion website to my thesis, which links to the publication and an (extended) HTML version.
- TimepixAnalysis - The main data analysis framework for my PhD thesis.
- xrayAttenuation - A library for the calculation of X-ray interactions with matter (transmission, reflection, …), including typical surface coatings used in modern X-ray optics.
- TrAXer - Interactive X-ray raytracer for the simulation of X-ray optics.
- mclimit - Nim port of ROOT’s
TLimit
class / Tom Junk’smclimit
C code for confidence level calculations for searches with small statistics.
- NimBoltz - A Magboltz interfacer from Nim, which generates Magboltz input files for the user and can act as a Magboltz runner (running multiple processes in parallel). Magboltz is the program to simulate transport of electrons in gaseous under the influence of electromagnetic fields (i.e. to calculate gas properties as used in gaseous detectors).
- GarfieldNim - An (incomplete) Nim wrapper for Garfield++ (tool / library for the simulation of particle detectors commonly used for micropattern gaseous detectors).
- mcpl - A Nim wrapper for the mcpl (Monte Carlo Particle List) file format.
- horizonsAPI - A library to interface with JPL’s Horizons API (for solar system orbital data).
- ggplotnim - A Nim plotting library heavily inspired by ggplot2.
- ginger - The backend library for
ggplotnim
, which handles the actual rendering ofggplotnim
plots to PDF, SVG, PNG targets (mainly via Cairo or TikZ). - Unchained - A library for compile-time physical unit checking and conversions.
- Measuremancer - A library for automatic error propagation of measurements with uncertainties.
- nimhdf5 - Nim bindings to the HDF5 library (similar to h5py).
- rnim - A library to interface with the R programming language from Nim (similar to nimpy or nimjl).
- Arraymancer - Co-maintainer of Arraymancer, Nim’s most important tensor library (think numpy).
- Flambeau - Co-maintainer of Flambeau, our Nim wrapper of
libtorch
, the C++ backend of PyTorch. - nimlopt - Nim wrapper of NLopt, a non linear optimization library.
- nim-mpfit - Nim wrapper of cMPFIT, a Levenberg-Marquardt least squares fitting library.
- impulse - Co-maintainer of
impulse
, a signal processing library for Nim. - scinim - Co-maintainer of
scinim
, a general library for different aspects related to scientific computing in Nim. What might become an equivalent to scipy for Nim in the future.
- shell - A mini DSL to execute processes from Nim, in the form of a
shell-like DSL. Supports constructs like
expect
. - LatexDSL - A DSL to generate LaTeX from Nim, which includes some compile-time checking, easy TeX c
- cacheMe - A helper library to cache function calls over multiple program runs (intended for expensive, deterministic operations).
- flatBuffers - A library to save / load nested Nim object as flat binary files.
- forked - Provides a simplified abstraction
forked
over cligen’s procpool (multiprocessing). Multiprocess your for loops! - JsonSchemaValidator - A JSON schema validation library.
- orgtable - A (very early) library to produce Org mode tables from Nim data structures.
- NimJit - Attempts to write a JIT compiler for Nim based on
libgccjit
. Initial attempts based on semchecked Nim AST, current version based on NIR (Nim’s current highly experimental IR). - hotpatching - Fun hack to hotpatch a Nim function at runtime.
- llama2nim - A Nim port of Andrej Karpathy’s llama2.c.
- llm.nim - A Nim port of the CPU version of Andrej Karpathy’s llm.c.
- train_ingrid.nim - The training code for the MLP used for data classification as part of my PhD thesis (based on Flambeau / libtorch).
- QuasarContANN - Work from 2014 on using MLPs and CNNs for Quasar spectra predictions (prediction of the spectra in the Ly-α forest) using Theano.
- runtimeGrad - A library for 3 different automatic differentiation implementations (Wengert list, dual numbers & complex step derivative).
- abyss - A very experimental attempt at a Zygote.jl like source-to-source, reverse mode automatic differentiation library for Nim.
- astGrad - A compile-time symbolic differentiation library to differentiate (math based) Nim code based on its AST.
- NeuralNetworkLiveDemo - Demo (part of a talk) of training a simple MLP on MNIST with a browser based live interface into the training progress.
- expressionEval - A C++, header only, math expression evaluator library, intended to be used as part of a ROOT based C++ framework (but never was).