Skip to content

Instantly share code, notes, and snippets.


Miles Cranmer MilesCranmer

View GitHub Profile
MilesCranmer /
Created Jul 1, 2022
Reduce precision of constants in a string
import re
def reduce_precision_of_constants_in_string(s, precision=3):
# Find all constants in the string:
constants = re.findall(r"\b[-+]?\d*\.\d+|\b[-+]?\d+\.?\d*", s)
for c in constants:
reduced_c = "{:.{precision}g}".format(float(c), precision=precision)
s = s.replace(c, reduced_c)
return s
MilesCranmer / unique.c
Created Jun 26, 2022
Get unique elements of an array using a lookup table
View unique.c
// Count elements of an array by using a lookup table.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
int main(int argc, char *argv[])
// Generate random array of integers, with
// size given by args.
MilesCranmer /
Last active May 7, 2022
Enable valid Python to be a config.gin file, so code analysis and syntax highlighting works
def preprocess_config(s: str):
"""Remove imports from a string representation of a python file"""
# We assume that imports are not multi-line.
lines = s.splitlines()
out_lines = []
for line in lines:
# Skip lines with import in them:
if 'import' in line:
def acos2(num, denom, disamb):
cosine = num/denom
return torch.where((cosine > -1) & (cosine < 1.),
torch.acos(cosine) * torch.where(disamb < 0.0, -1, 1),
torch.where(cosine <= -1, np.pi, 0.0)
def coord_transform(x):
# Assumes in CoM frame
MilesCranmer /
Created Mar 3, 2021
Trick to step backwards if a NaN occurs

Before training:

last = model.state_dict()

Inside training loop, after computing loss:

if torch.isnan(loss).sum().item():
MilesCranmer / mwe.jl
Last active Jan 27, 2021
Implementing SymbolicUtils.jl interface for SymbolicRegression.jl
View mwe.jl
using SymbolicUtils
mutable struct Node
#Holds operators, variables, constants in a tree
degree::Integer #0 for constant/variable, 1 for cos/sin, 2 for +/* etc.
val::Union{Float32, Integer, Nothing} #Either const value, or enumerates variable
constant::Bool #false if variable
op::Integer #enumerates operator (separately for degree=1,2)
l::Union{Node, Nothing}
r::Union{Node, Nothing}
MilesCranmer /
Created Jan 5, 2021
Generic einops operation that performs a repeat, rearrange, or reduce based on indices
# Copy this into your code. Call with, e.g., einop(x, 'i j -> j', reduction='mean')
import functools
import einops as _einops
from einops.parsing import ParsedExpression
def _match_einop(pattern: str, reduction=None, **axes_lengths: int):
"""Find the corresponding operation matching the pattern"""
left, rght = pattern.split('->')
left = ParsedExpression(left)
MilesCranmer /
Last active Oct 17, 2020
Analytic Approximation of log(1+erf(x)) for x in [-10, -5]. Uses PySR:, mpmath:
import numpy as np
from mpmath import mp, mpmathify
from pysr import *
#Set precision to 200 decimal places:
mp.dps = 200
x = np.linspace(-10, -5, num=300)
#High precision calculation:
MilesCranmer / matrix_box_notation.tex
Last active Feb 9, 2021
Draw boxes for matrices in equation
View matrix_box_notation.tex
%Make sure to have \usepackage{tikz}
% - for grid
% - for alignment in equation
% This function draws a matrix.
\newcommand{\mat}[2]{% cols, rows
\vcenter{\hbox{ %Vertical alignment
\begin{tikzpicture}[scale=0.3, align=center]
MilesCranmer / .vimrc
Created Jul 6, 2020 — forked from yk/.vimrc
vimrc july 2020
View .vimrc
set nocompatible " be iMproved, required
let g:python3_host_prog = '/usr/local/opt/python@3.8/bin/python3.8'
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
call plug#begin('~/.vim/plugged')