Powered by AppSignal & Oban Pro

Designing a Perceptron Apparatus

docs/designing-an-apparatus.livemd

Designing a Perceptron Apparatus

Mix.install([
  {:perceptron_apparatus, path: "~/Documents/edex/human-scale-ai/perceptron_apparatus"}
])

alias PerceptronApparatus, as: PA
alias PerceptronApparatus.Rings

Build yourself an apparatus

The new simplified interface automatically creates all required rings for a neural network:

# Create a perceptron apparatus for a 25-5-10 neural network
# Parameters: size, n_input, n_hidden, n_output
{:ok, apparatus} = PA.Board.create(1200, 25, 5, 10)

apparatus
|> PA.Board.render([:full, :etch])
|> tap(fn data -> File.write!("svg/apparatus-v2.svg", data) end)
|> Kino.HTML.new()

This automatically creates the complete ring sequence:

  1. Log ring - logarithmic scale ruler
  2. ReLU ring - ReLU activation function ruler
  3. Input azimuthal ring - 25 input sliders (0-1 range)
  4. Weight1 radial ring - 5 groups × 25 sliders (-10 to 10 range)
  5. Hidden azimuthal ring - 5 hidden layer sliders (0-10 range)
  6. Weight2 radial ring - 10 groups × 5 sliders (-10 to 10 range)
  7. Output azimuthal ring - 10 output sliders (0-1 range)

Alternative: Manual ring creation (if needed)

For custom configurations, you can still create rings manually:

# This is equivalent to the Board.create approach above, but manual
log_ring = RuleRing.new(RuleRing.log_rule())
relu_ring = RuleRing.new(RuleRing.relu_rule(10, 0.25))

input_ring = AzimuthalRing.new(%{sliders: 25}, PA.Utils.new_rule(0, 1, 0.1, 0.5))
w1_ring = RadialRing.new(%{groups: 5, sliders_per_group: 25}, PA.Utils.new_rule(-10, 10, 2, 10))
h1_ring = AzimuthalRing.new(%{sliders: 5}, PA.Utils.new_rule(0, 10, 1, 5))
w2_ring = RadialRing.new(%{groups: 10, sliders_per_group: 5}, PA.Utils.new_rule(-10, 10, 2, 10))
output_ring = AzimuthalRing.new(%{sliders: 10}, PA.Utils.new_rule(0, 1, 0.1, 0.5))

{:ok, apparatus} = PA.Board.create(1200, 25, 5, 10)
# Then manually replace rings if needed...

HEEx testing

import Phoenix.Component, only: [sigil_H: 2]

test_component = fn assigns ->
  ~H"""
  

Hi <%= @name %>.

"""
end test_component.(%{name: "Mum"}) |> Phoenix.HTML.Safe.to_iodata() |> Enum.join()