about summary refs log tree commit diff
path: root/src/monkey_brain
diff options
context:
space:
mode:
authormakefunstuff <[email protected]>2024-07-08 23:23:25 +0200
committermakefunstuff <[email protected]>2024-07-08 23:23:25 +0200
commitc01d9802552e44bf228de141c572d1e8419a16a9 (patch)
tree0f15c41f0e1266ebd694268b7ac20a11a1ca473e /src/monkey_brain
parent793e7c041dbc94a478ae1b6d619c8ba22b8e6c02 (diff)
downloadtinkerbunk-c01d9802552e44bf228de141c572d1e8419a16a9.tar.gz
wip
Diffstat (limited to 'src/monkey_brain')
-rw-r--r--src/monkey_brain/main.zig59
-rw-r--r--src/monkey_brain/test.zig5
2 files changed, 63 insertions, 1 deletions
diff --git a/src/monkey_brain/main.zig b/src/monkey_brain/main.zig
index d488c54..52ff9e5 100644
--- a/src/monkey_brain/main.zig
+++ b/src/monkey_brain/main.zig
@@ -1,5 +1,62 @@
 const std = @import("std");
+const testing = std.testing;
+
+const input_size: usize = 2;
+const training_set_size: usize = 4;
+const learning_rate: f64 = 0.1;
+const epochs: u64 = 100 * 1000;
+
+fn sigmoid(x: f64) f64 {
+    return 1.0 / (1.0 + std.math.exp(-x));
+}
+
+fn sigmoid_derivative(output: f64) f64 {
+    return output * (1.0 - output);
+}
+
+fn predict(weights: [input_size]f64, bias: f64, inputs: [input_size]f64) f64 {
+    var total: f64 = 0.0;
+    for (0..input_size) |i| {
+        total += weights[i] * inputs[i];
+    }
+    total += bias;
+    return sigmoid(total);
+}
+
+fn train(weights: *[input_size]f64, bias: *f64, training_data: [training_set_size][input_size]f64, labels: [training_set_size]f64) void {
+    for (0..epochs) |_| {
+        for (0..training_set_size) |i| {
+            const prediction = predict(weights.*, bias.*, training_data[i]);
+            const err = labels[i] - prediction;
+            const adjustment = err * sigmoid_derivative(prediction);
+
+            for (0..input_size) |j| {
+                weights[j] += learning_rate * adjustment * training_data[i][j];
+            }
+            bias.* += learning_rate * adjustment;
+        }
+    }
+}
 
 pub fn main() !void {
-    std.debug.print("uga buga", .{});
+    const w1 = std.crypto.random.float(f64);
+    const w2 = std.crypto.random.float(f64);
+
+    var weights: [input_size]f64 = .{ w1, w2 };
+    var bias: f64 = 0.0;
+
+    const training_data: [training_set_size][input_size]f64 = .{ .{ 0, 0 }, .{ 0, 1 }, .{ 1, 0 }, .{ 1, 1 } };
+
+    const labels: [training_set_size]f64 = .{ 0, 0, 0, 1 };
+
+    train(&weights, &bias, training_data, labels);
+
+    for (0..training_set_size) |i| {
+        const prediction = predict(weights, bias, training_data[i]);
+        std.log.info("Input {} {}, Predicted output: {}", .{ training_data[i][0], training_data[i][1], prediction });
+    }
+}
+
+test "hello" {
+    try testing.expect(true);
 }
diff --git a/src/monkey_brain/test.zig b/src/monkey_brain/test.zig
index e69de29..7a71043 100644
--- a/src/monkey_brain/test.zig
+++ b/src/monkey_brain/test.zig
@@ -0,0 +1,5 @@
+pub const main = @import("main.zig");
+
+test {
+    @import("std").testing.refAllDecls(@This());
+}