Skip to content

Instantly share code, notes, and snippets.

defmodule MNIST do
import Nx.Defn
@default_defn_compiler {EXLA, run_options: [keep_on_device: true]}
defn init_random_params do
w1 = Nx.random_normal({32, 1, 7, 7}, 0.0, 0.1)
b1 = Nx.random_normal({1, 32, 1, 1}, 0.0, 0.1)
w2 = Nx.random_normal({64, 32, 4, 4}, 0.0, 0.1)
b2 = Nx.random_normal({1, 64, 1, 1}, 0.0, 0.1)

Genetic Algorithm in Nx

Preface

After writing Genetic Algorithms in Elixir, I had no real hopes or expectations that numerical computing would become a focus for Elixir. However, to my surprise, the Nx project developed rather quickly, and proved that Elixir could be used for practical machine learning and numerical computing applications. While I don't have any plans (yet) of reworking the examples in my book to take advantage of the acceleration enabled by Nx, EXLA, and other projects, I feel it's necessary to show how you could go about rewriting your genetic algorithms to take advantage of Elixir's new numerical computing libraries.

Introduction

Nx is a numerical computing library for Elixir which supports the creation and manipulation of multi-dimensional arrays (called tensors in the API), automatic differentiation, and just-in-time (JIT) compilation to CPU, GPU, and other accelerators via pluggable backends and compilers. Nx opens up a realm of possibilities for Elixir dev

# Part 1
File.read!('aoc/1.txt')
|> String.replace("\r", "") # i am on windows right now :(
|> String.split("\n")
|> Enum.map(&String.to_integer/1)
|> Nx.tensor()
|> then(fn x ->
Nx.greater(Nx.slice_axis(x, 1, Nx.size(x) - 1, 0), Nx.slice_axis(x, 0, Nx.size(x) - 1, 0))
end)
|> Nx.sum()
# part 1
File.read!('aoc/2.txt')
|> String.replace("\r", "") # i am on windows right now :(
|> String.split("\n")
|> Enum.map(fn line ->
[direction, amt] = String.split(line)
amt_int = String.to_integer(amt)
case direction do
"forward" ->
defmodule Day3 do
# Since my last answer wasn't purely Nx, I'm going
# to try to stick to Nx as much as is possible, but
# we don't have string manipulation stuff so that will
# have to be done in Elixir
import Nx.Defn
def part1 do
File.read!("aoc/3.txt")
|> parse_input()
defmodule Day4 do
import Nx.Defn
def part1() do
File.read!("aoc/4.txt")
|> parse_input()
|> play_bingo()
|> find_winning_board()
end
@seanmor5
seanmor5 / wine_documents.jsonl
Created September 27, 2022 23:37
Wine Documents
This file has been truncated, but you can view the full file.
{"name": "Chateau de Landiras 2018", "url": "https://www.wine.com//product/chateau-de-landiras-2018/677595", "varietal": "Bordeaux Red Blends", "location": "Graves, Bordeaux, France", "alcohol_volume": "750ML", "alcohol_percent": "0", "price": "$19", "notes": "Blend: 75% Merlot, 25% Cabernet Sauvignon", "reviews": [{"author": "Decanter", "review": "Grand generosity, showcasing deep, vigorous dark forest fruit and an appetising blackcurrant freshness within juicy and fabulously-integrated tannins. Lovely, boisterous and rich in fruit. Bravo!", "rating": "95"}]}
{"name": "Silver Oak Napa Valley Cabernet Sauvignon 2016", "url": "https://www.wine.com//product/silver-oak-napa-valley-cabernet-sauvignon-2016/683756", "varietal": "Cabernet Sauvignon", "location": "Napa Valley, California", "alcohol_volume": "750ML", "alcohol_percent": "14.2", "price": "$144", "notes": "Deep ruby in color, the 2016 Napa Valley Cabernet Sauvignon is an opulent wine with notes of cassis, ripe raspberry, toasted coconut and shiitake mush
main = fn ->
cmd = IO.gets("Enter a command: ") |> String.trim()
case cmd do
"1" ->
todos = Process.get(:todos) || []
IO.puts(Enum.join(todos, "\n"))
"2" ->
todos = Process.get(:todos) || []
main = fn ->
cmd = IO.gets("Enter a command: ") |> String.trim()
case String.split(cmd) do
["show"] ->
todos = Process.get(:todos) || []
IO.puts(Enum.join(todos, "\n"))
["create" | rest] ->
todos = Process.get(:todos) || []
defmodule Client do
def main(pid) do
cmd = IO.gets("Enter a command: ") |> String.trim()
case String.split(cmd) do
["show"] ->
key = self()
Task.async(fn ->
send(pid, {:list, key, self()})