const n_threads = 2;\r
\r
const params = .{\r
- .mem_size = 128*1024*1024,\r
+ .mem_size = 128 * 1024 * 1024,\r
.mem_buffer = null,\r
- .no_alloc = false,\r
+ .no_alloc = false,\r
};\r
\r
const ctx0 = c.ggml_init(params);\r
\r
c.ggml_print_objects(ctx0);\r
\r
- const gf = c.ggml_build_forward(f);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, f);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x, 2.0);\r
_ = c.ggml_set_f32(a, 3.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(f.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("f = {d:.6}\n", .{c.ggml_get_f32_1d(f, 0)});\r
std.debug.print("df/dx = {d:.6}\n", .{c.ggml_get_f32_1d(x.*.grad, 0)});\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(f, 0) == 12.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x.*.grad, 0) == 12.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(f, 0) == 12.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x.*.grad, 0) == 12.0);\r
\r
_ = c.ggml_set_f32(x, 3.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(f.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("f = {d:.6}\n", .{c.ggml_get_f32_1d(f, 0)});\r
std.debug.print("df/dx = {d:.6}\n", .{c.ggml_get_f32_1d(x.*.grad, 0)});\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(f, 0) == 27.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x.*.grad, 0) == 18.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(f, 0) == 27.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x.*.grad, 0) == 18.0);\r
\r
- c.ggml_graph_dump_dot(&gf, null, "test1-1-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-1-backward.dot");\r
+ c.ggml_graph_dump_dot(gf, null, "test1-1-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-1-backward.dot");\r
}\r
\r
/////////////////////////////////////////////////////////////\r
\r
const y = c.ggml_add(ctx0, c.ggml_mul(ctx0, x1, x1), c.ggml_mul(ctx0, x1, x2));\r
\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
std.debug.print("df/dx1 = {d:.6}\n", .{c.ggml_get_f32_1d(x1.*.grad, 0)});\r
std.debug.print("df/dx2 = {d:.6}\n", .{c.ggml_get_f32_1d(x2.*.grad, 0)});\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 12.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 7.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 12.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 7.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
\r
const g1 = x1.*.grad;\r
const g2 = x2.*.grad;\r
\r
- const gbb = c.ggml_build_backward(ctx0, @constCast(&gb), true);\r
+ const gbb = c.ggml_graph_dup(ctx0, @constCast(gb));\r
\r
- c.ggml_graph_reset(@constCast(&gb));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gb), @constCast(gbb), true);\r
+\r
+ c.ggml_graph_reset(@constCast(gb));\r
_ = c.ggml_set_f32(g1.*.grad, 1.0);\r
_ = c.ggml_set_f32(g2.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gbb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gbb), n_threads);\r
\r
- std.debug.print("H * [1, 1] = [ {d:.6} {d:.6} ]\n", .{c.ggml_get_f32_1d(x1.*.grad, 0), c.ggml_get_f32_1d(x2.*.grad, 0)});\r
+ std.debug.print("H * [1, 1] = [ {d:.6} {d:.6} ]\n", .{ c.ggml_get_f32_1d(x1.*.grad, 0), c.ggml_get_f32_1d(x2.*.grad, 0) });\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 1.0);\r
\r
- c.ggml_graph_dump_dot(&gf, null, "test1-2-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-2-backward.dot");\r
+ c.ggml_graph_dump_dot(gf, null, "test1-2-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-2-backward.dot");\r
}\r
\r
///////////////////////////////////////////////////////////////\r
\r
const y = c.ggml_mul(ctx0, c.ggml_add(ctx0, c.ggml_mul(ctx0, x1, x1), c.ggml_mul(ctx0, x1, x2)), x1);\r
\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x1, 3.0);\r
_ = c.ggml_set_f32(x2, 4.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
std.debug.print("df/dx1 = {d:.6}\n", .{c.ggml_get_f32_1d(x1.*.grad, 0)});\r
std.debug.print("df/dx2 = {d:.6}\n", .{c.ggml_get_f32_1d(x2.*.grad, 0)});\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 63.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 51.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 9.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 63.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 51.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 9.0);\r
\r
- c.ggml_graph_dump_dot(&gf, null, "test1-3-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-3-backward.dot");\r
+ c.ggml_graph_dump_dot(gf, null, "test1-3-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-3-backward.dot");\r
}\r
\r
///////////////////////////////////////////////////////////////\r
\r
const y = c.ggml_mul(ctx0, c.ggml_mul(ctx0, c.ggml_mul(ctx0, x1, x1), c.ggml_mul(ctx0, x2, x2)), x3);\r
\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x1, 1.0);\r
_ = c.ggml_set_f32(x2, 2.0);\r
_ = c.ggml_set_f32(x3, 3.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
std.debug.print("df/dx1 = {d:.6}\n", .{c.ggml_get_f32_1d(x1.*.grad, 0)});\r
std.debug.print("df/dx2 = {d:.6}\n", .{c.ggml_get_f32_1d(x2.*.grad, 0)});\r
std.debug.print("df/dx3 = {d:.6}\n", .{c.ggml_get_f32_1d(x3.*.grad, 0)});\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 12.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 24.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 12.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x3.*.grad, 0) == 4.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 12.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 24.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 12.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x3.*.grad, 0) == 4.0);\r
\r
const g1 = x1.*.grad;\r
const g2 = x2.*.grad;\r
const g3 = x3.*.grad;\r
\r
- const gbb = c.ggml_build_backward(ctx0, @constCast(&gb), true);\r
+ const gbb = c.ggml_graph_dup(ctx0, @constCast(gb));\r
+\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gb), @constCast(gbb), true);\r
\r
- c.ggml_graph_reset(@constCast(&gb));\r
+ c.ggml_graph_reset(@constCast(gb));\r
_ = c.ggml_set_f32(g1.*.grad, 1.0);\r
_ = c.ggml_set_f32(g2.*.grad, 1.0);\r
_ = c.ggml_set_f32(g3.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gbb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gbb), n_threads);\r
\r
- std.debug.print("H * [1, 1, 1] = [ {d:.6} {d:.6} {d:.6}]\n",\r
- .{\r
- c.ggml_get_f32_1d(x1.*.grad, 0),\r
- c.ggml_get_f32_1d(x2.*.grad, 0),\r
- c.ggml_get_f32_1d(x3.*.grad, 0),\r
- });\r
+ std.debug.print("H * [1, 1, 1] = [ {d:.6} {d:.6} {d:.6}]\n", .{\r
+ c.ggml_get_f32_1d(x1.*.grad, 0),\r
+ c.ggml_get_f32_1d(x2.*.grad, 0),\r
+ c.ggml_get_f32_1d(x3.*.grad, 0),\r
+ });\r
\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 56.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 34.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x3.*.grad, 0) == 12.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 56.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 34.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x3.*.grad, 0) == 12.0);\r
\r
- c.ggml_graph_dump_dot(&gf, null, "test1-4-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-4-backward.dot");\r
+ c.ggml_graph_dump_dot(gf, null, "test1-4-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-4-backward.dot");\r
}\r
\r
///////////////////////////////////////////////////////////////\r
\r
const y = c.ggml_sum(ctx0, c.ggml_mul(ctx0, x1, x2));\r
\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x1, 3.0);\r
_ = c.ggml_set_f32(x2, 5.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
- std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x1.*.grad, 0),\r
- c.ggml_get_f32_1d(x1.*.grad, 1),\r
- c.ggml_get_f32_1d(x1.*.grad, 2),\r
- });\r
- std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x2.*.grad, 0),\r
- c.ggml_get_f32_1d(x2.*.grad, 1),\r
- c.ggml_get_f32_1d(x2.*.grad, 2),\r
- });\r
-\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 45.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 5.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == 5.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == 5.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 3.0);\r
-\r
- c.ggml_graph_dump_dot(&gf, null, "test1-5-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-5-backward.dot");\r
+ std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x1.*.grad, 0),\r
+ c.ggml_get_f32_1d(x1.*.grad, 1),\r
+ c.ggml_get_f32_1d(x1.*.grad, 2),\r
+ });\r
+ std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x2.*.grad, 0),\r
+ c.ggml_get_f32_1d(x2.*.grad, 1),\r
+ c.ggml_get_f32_1d(x2.*.grad, 2),\r
+ });\r
+\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 45.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 5.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == 5.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == 5.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 3.0);\r
+\r
+ c.ggml_graph_dump_dot(gf, null, "test1-5-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-5-backward.dot");\r
}\r
\r
///////////////////////////////////////////////////////////////\r
c.ggml_set_param(ctx0, x2);\r
\r
const y =\r
- c.ggml_sum(ctx0,\r
- c.ggml_add(ctx0,\r
- c.ggml_mul(ctx0, x1, x2),\r
- c.ggml_mul(ctx0,\r
- c.ggml_repeat(ctx0, c.ggml_new_f32(ctx0, -2.0), x1),\r
- c.ggml_mul(ctx0, x1, x1)\r
- )\r
- )\r
- );\r
-\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ c.ggml_sum(ctx0, c.ggml_add(ctx0, c.ggml_mul(ctx0, x1, x2), c.ggml_mul(ctx0, c.ggml_repeat(ctx0, c.ggml_new_f32(ctx0, -2.0), x1), c.ggml_mul(ctx0, x1, x1))));\r
+\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x1, 3.0);\r
_ = c.ggml_set_f32(x2, 5.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
- std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x1.*.grad, 0),\r
- c.ggml_get_f32_1d(x1.*.grad, 1),\r
- c.ggml_get_f32_1d(x1.*.grad, 2),\r
- });\r
- std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x2.*.grad, 0),\r
- c.ggml_get_f32_1d(x2.*.grad, 1),\r
- c.ggml_get_f32_1d(x2.*.grad, 2),\r
- });\r
-\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == -9.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == -7.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == -7.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == -7.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 3.0);\r
-\r
- c.ggml_graph_dump_dot(&gf, null, "test1-6-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-6-backward.dot");\r
+ std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x1.*.grad, 0),\r
+ c.ggml_get_f32_1d(x1.*.grad, 1),\r
+ c.ggml_get_f32_1d(x1.*.grad, 2),\r
+ });\r
+ std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x2.*.grad, 0),\r
+ c.ggml_get_f32_1d(x2.*.grad, 1),\r
+ c.ggml_get_f32_1d(x2.*.grad, 2),\r
+ });\r
+\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == -9.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == -7.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == -7.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == -7.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 3.0);\r
+\r
+ c.ggml_graph_dump_dot(gf, null, "test1-6-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-6-backward.dot");\r
}\r
\r
///////////////////////////////////////////////////////////////\r
c.ggml_set_param(ctx0, x2);\r
\r
const y =\r
- c.ggml_sum(ctx0,\r
- c.ggml_sub(ctx0,\r
- c.ggml_mul(ctx0, x1, x2),\r
- c.ggml_mul(ctx0,\r
- c.ggml_mul(ctx0, x1, x1),\r
- c.ggml_repeat(ctx0, c.ggml_new_f32(ctx0, -2.0), x1)\r
- )\r
- )\r
- );\r
-\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ c.ggml_sum(ctx0, c.ggml_sub(ctx0, c.ggml_mul(ctx0, x1, x2), c.ggml_mul(ctx0, c.ggml_mul(ctx0, x1, x1), c.ggml_repeat(ctx0, c.ggml_new_f32(ctx0, -2.0), x1))));\r
+\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x1, 3.0);\r
_ = c.ggml_set_f32(x2, 5.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
- std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x1.*.grad, 0),\r
- c.ggml_get_f32_1d(x1.*.grad, 1),\r
- c.ggml_get_f32_1d(x1.*.grad, 2),\r
- });\r
- std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x2.*.grad, 0),\r
- c.ggml_get_f32_1d(x2.*.grad, 1),\r
- c.ggml_get_f32_1d(x2.*.grad, 2),\r
- });\r
-\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 99.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 17.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == 17.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == 17.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 3.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 3.0);\r
-\r
- c.ggml_graph_dump_dot(&gf, null, "test1-7-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-7-backward.dot");\r
+ std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x1.*.grad, 0),\r
+ c.ggml_get_f32_1d(x1.*.grad, 1),\r
+ c.ggml_get_f32_1d(x1.*.grad, 2),\r
+ });\r
+ std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x2.*.grad, 0),\r
+ c.ggml_get_f32_1d(x2.*.grad, 1),\r
+ c.ggml_get_f32_1d(x2.*.grad, 2),\r
+ });\r
+\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 99.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 17.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == 17.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == 17.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 3.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 3.0);\r
+\r
+ c.ggml_graph_dump_dot(gf, null, "test1-7-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-7-backward.dot");\r
}\r
\r
///////////////////////////////////////////////////////////////\r
c.ggml_set_param(ctx0, x2);\r
\r
const y =\r
- c.ggml_abs(ctx0,\r
- c.ggml_sub(ctx0, x1, x2)\r
- );\r
+ c.ggml_abs(ctx0, c.ggml_sub(ctx0, x1, x2));\r
\r
- const gf = c.ggml_build_forward(y);\r
- const gb = c.ggml_build_backward(ctx0, @constCast(&gf), false);\r
+ const gf = c.ggml_new_graph_custom(ctx0, c.GGML_DEFAULT_GRAPH_SIZE, true);\r
+ c.ggml_build_forward_expand(gf, y);\r
+ const gb = c.ggml_graph_dup(ctx0, @constCast(gf));\r
+ c.ggml_build_backward_expand(ctx0, @constCast(gf), @constCast(gb), false);\r
\r
_ = c.ggml_set_f32(x1, 3.0);\r
_ = c.ggml_set_f32(x2, 5.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
- std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x1.*.grad, 0),\r
- c.ggml_get_f32_1d(x1.*.grad, 1),\r
- c.ggml_get_f32_1d(x1.*.grad, 2),\r
- });\r
- std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x2.*.grad, 0),\r
- c.ggml_get_f32_1d(x2.*.grad, 1),\r
- c.ggml_get_f32_1d(x2.*.grad, 2),\r
- });\r
-\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 2.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == -1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == -1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == -1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 1.0);\r
+ std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x1.*.grad, 0),\r
+ c.ggml_get_f32_1d(x1.*.grad, 1),\r
+ c.ggml_get_f32_1d(x1.*.grad, 2),\r
+ });\r
+ std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x2.*.grad, 0),\r
+ c.ggml_get_f32_1d(x2.*.grad, 1),\r
+ c.ggml_get_f32_1d(x2.*.grad, 2),\r
+ });\r
+\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 2.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == -1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == -1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == -1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == 1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == 1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == 1.0);\r
\r
_ = c.ggml_set_f32(x1, 7.0);\r
_ = c.ggml_set_f32(x2, 5.0);\r
\r
- c.ggml_graph_reset(@constCast(&gf));\r
+ c.ggml_graph_reset(@constCast(gf));\r
_ = c.ggml_set_f32(y.*.grad, 1.0);\r
\r
- c.ggml_graph_compute_with_ctx(ctx0, @constCast(&gb), n_threads);\r
+ _ = c.ggml_graph_compute_with_ctx(ctx0, @constCast(gb), n_threads);\r
\r
std.debug.print("y = {d:.6}\n", .{c.ggml_get_f32_1d(y, 0)});\r
- std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x1.*.grad, 0),\r
- c.ggml_get_f32_1d(x1.*.grad, 1),\r
- c.ggml_get_f32_1d(x1.*.grad, 2),\r
- });\r
- std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n",\r
- .{\r
- c.ggml_get_f32_1d(x2.*.grad, 0),\r
- c.ggml_get_f32_1d(x2.*.grad, 1),\r
- c.ggml_get_f32_1d(x2.*.grad, 2),\r
- });\r
-\r
- try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 2.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == 1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == 1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == -1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == -1.0);\r
- try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == -1.0);\r
-\r
- c.ggml_graph_dump_dot(&gf, null, "test1-8-forward.dot");\r
- c.ggml_graph_dump_dot(&gb, &gf, "test1-8-backward.dot");\r
+ std.debug.print("df/dx1 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x1.*.grad, 0),\r
+ c.ggml_get_f32_1d(x1.*.grad, 1),\r
+ c.ggml_get_f32_1d(x1.*.grad, 2),\r
+ });\r
+ std.debug.print("df/dx2 = {d:.6} {d:.6} {d:.6}\n", .{\r
+ c.ggml_get_f32_1d(x2.*.grad, 0),\r
+ c.ggml_get_f32_1d(x2.*.grad, 1),\r
+ c.ggml_get_f32_1d(x2.*.grad, 2),\r
+ });\r
+\r
+ try std.testing.expect(c.ggml_get_f32_1d(y, 0) == 2.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 0) == 1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 1) == 1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x1.*.grad, 2) == 1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 0) == -1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 1) == -1.0);\r
+ try std.testing.expect(c.ggml_get_f32_1d(x2.*.grad, 2) == -1.0);\r
+\r
+ c.ggml_graph_dump_dot(gf, null, "test1-8-forward.dot");\r
+ c.ggml_graph_dump_dot(gb, gf, "test1-8-backward.dot");\r
}\r
\r
_ = try std.io.getStdIn().reader().readByte();\r
});\r
\r
fn is_close(a: f32, b: f32, epsilon: f32) bool {\r
- return std.math.fabs(a - b) < epsilon;\r
+ return @abs(a - b) < epsilon;\r
}\r
\r
pub fn main() !void {\r
const params = .{\r
- .mem_size = 128*1024*1024,\r
+ .mem_size = 128 * 1024 * 1024,\r
.mem_buffer = null,\r
- .no_alloc = false,\r
+ .no_alloc = false,\r
};\r
\r
- var opt_params = c.ggml_opt_default_params(c.GGML_OPT_LBFGS);\r
- \r
+ var opt_params = c.ggml_opt_default_params(c.GGML_OPT_TYPE_LBFGS);\r
+\r
const nthreads = try Thread.getCpuCount();\r
opt_params.n_threads = @intCast(nthreads);\r
std.debug.print("test2: n_threads:{}\n", .{opt_params.n_threads});\r
\r
- const xi = [_]f32{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };\r
+ const xi = [_]f32{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };\r
const yi = [_]f32{ 15.0, 25.0, 35.0, 45.0, 55.0, 65.0, 75.0, 85.0, 95.0, 105.0 };\r
\r
const n = xi.len;\r
\r
// f = sum_i[(t0 + t1*x_i - y_i)^2]/(2n)\r
const f =\r
- c.ggml_div(ctx0,\r
- c.ggml_sum(ctx0,\r
- c.ggml_sqr(ctx0,\r
- c.ggml_sub(ctx0,\r
- c.ggml_add(ctx0,\r
- c.ggml_mul(ctx0, x, c.ggml_repeat(ctx0, t1, x)),\r
- c.ggml_repeat(ctx0, t0, x)),\r
- y)\r
- )\r
- ),\r
- c.ggml_new_f32(ctx0, @as(f32, 2.0)*n));\r
+ c.ggml_div(ctx0, c.ggml_sum(ctx0, c.ggml_sqr(ctx0, c.ggml_sub(ctx0, c.ggml_add(ctx0, c.ggml_mul(ctx0, x, c.ggml_repeat(ctx0, t1, x)), c.ggml_repeat(ctx0, t0, x)), y))), c.ggml_new_f32(ctx0, @as(f32, 2.0) * n));\r
\r
const res = c.ggml_opt(null, opt_params, f);\r
\r
std.debug.print("t0 = {d:.6}\n", .{c.ggml_get_f32_1d(t0, 0)});\r
std.debug.print("t1 = {d:.6}\n", .{c.ggml_get_f32_1d(t1, 0)});\r
\r
- try std.testing.expect(res == c.GGML_OPT_OK);\r
- try std.testing.expect(is_close(c.ggml_get_f32_1d(t0, 0), 5.0, 1e-3));\r
+ try std.testing.expect(res == c.GGML_OPT_RESULT_OK);\r
+ try std.testing.expect(is_close(c.ggml_get_f32_1d(t0, 0), 5.0, 1e-3));\r
try std.testing.expect(is_close(c.ggml_get_f32_1d(t1, 0), 10.0, 1e-3));\r
}\r
\r
{\r
const t0 = c.ggml_new_f32(ctx0, -1.0);\r
- const t1 = c.ggml_new_f32(ctx0, 9.0);\r
+ const t1 = c.ggml_new_f32(ctx0, 9.0);\r
\r
_ = c.ggml_set_param(ctx0, t0);\r
_ = c.ggml_set_param(ctx0, t1);\r
\r
// f = 0.5*sum_i[abs(t0 + t1*x_i - y_i)]/n\r
const f =\r
- c.ggml_mul(ctx0,\r
- c.ggml_new_f32(ctx0, @as(f32, 1.0)/(2*n)),\r
- c.ggml_sum(ctx0,\r
- c.ggml_abs(ctx0,\r
- c.ggml_sub(ctx0,\r
- c.ggml_add(ctx0,\r
- c.ggml_mul(ctx0, x, c.ggml_repeat(ctx0, t1, x)),\r
- c.ggml_repeat(ctx0, t0, x)),\r
- y)\r
- )\r
- )\r
- );\r
-\r
+ c.ggml_mul(ctx0, c.ggml_new_f32(ctx0, @as(f32, 1.0) / (2 * n)), c.ggml_sum(ctx0, c.ggml_abs(ctx0, c.ggml_sub(ctx0, c.ggml_add(ctx0, c.ggml_mul(ctx0, x, c.ggml_repeat(ctx0, t1, x)), c.ggml_repeat(ctx0, t0, x)), y))));\r
\r
const res = c.ggml_opt(null, opt_params, f);\r
\r
- try std.testing.expect(res == c.GGML_OPT_OK);\r
- try std.testing.expect(is_close(c.ggml_get_f32_1d(t0, 0), 5.0, 1e-2));\r
+ try std.testing.expect(res == c.GGML_OPT_RESULT_OK);\r
+ try std.testing.expect(is_close(c.ggml_get_f32_1d(t0, 0), 5.0, 1e-2));\r
try std.testing.expect(is_close(c.ggml_get_f32_1d(t1, 0), 10.0, 1e-2));\r
}\r
\r
{\r
- const t0 = c.ggml_new_f32(ctx0, 5.0);\r
+ const t0 = c.ggml_new_f32(ctx0, 5.0);\r
const t1 = c.ggml_new_f32(ctx0, -4.0);\r
\r
_ = c.ggml_set_param(ctx0, t0);\r
\r
// f = t0^2 + t1^2\r
const f =\r
- c.ggml_add(ctx0,\r
- c.ggml_sqr(ctx0, t0),\r
- c.ggml_sqr(ctx0, t1)\r
- );\r
+ c.ggml_add(ctx0, c.ggml_sqr(ctx0, t0), c.ggml_sqr(ctx0, t1));\r
\r
const res = c.ggml_opt(null, opt_params, f);\r
\r
- try std.testing.expect(res == c.GGML_OPT_OK);\r
- try std.testing.expect(is_close(c.ggml_get_f32_1d(f, 0), 0.0, 1e-3));\r
+ try std.testing.expect(res == c.GGML_OPT_RESULT_OK);\r
+ try std.testing.expect(is_close(c.ggml_get_f32_1d(f, 0), 0.0, 1e-3));\r
try std.testing.expect(is_close(c.ggml_get_f32_1d(t0, 0), 0.0, 1e-3));\r
try std.testing.expect(is_close(c.ggml_get_f32_1d(t1, 0), 0.0, 1e-3));\r
}\r
\r
{\r
const t0 = c.ggml_new_f32(ctx0, -7.0);\r
- const t1 = c.ggml_new_f32(ctx0, 8.0);\r
+ const t1 = c.ggml_new_f32(ctx0, 8.0);\r
\r
_ = c.ggml_set_param(ctx0, t0);\r
_ = c.ggml_set_param(ctx0, t1);\r
\r
// f = (t0 + 2*t1 - 7)^2 + (2*t0 + t1 - 5)^2\r
const f =\r
- c.ggml_add(ctx0,\r
- c.ggml_sqr(ctx0,\r
- c.ggml_sub(ctx0,\r
- c.ggml_add(ctx0,\r
- t0,\r
- c.ggml_mul(ctx0, t1, c.ggml_new_f32(ctx0, 2.0))),\r
- c.ggml_new_f32(ctx0, 7.0)\r
- )\r
- ),\r
- c.ggml_sqr(ctx0,\r
- c.ggml_sub(ctx0,\r
- c.ggml_add(ctx0,\r
- c.ggml_mul(ctx0, t0, c.ggml_new_f32(ctx0, 2.0)),\r
- t1),\r
- c.ggml_new_f32(ctx0, 5.0)\r
- )\r
- )\r
- );\r
+ c.ggml_add(ctx0, c.ggml_sqr(ctx0, c.ggml_sub(ctx0, c.ggml_add(ctx0, t0, c.ggml_mul(ctx0, t1, c.ggml_new_f32(ctx0, 2.0))), c.ggml_new_f32(ctx0, 7.0))), c.ggml_sqr(ctx0, c.ggml_sub(ctx0, c.ggml_add(ctx0, c.ggml_mul(ctx0, t0, c.ggml_new_f32(ctx0, 2.0)), t1), c.ggml_new_f32(ctx0, 5.0))));\r
\r
const res = c.ggml_opt(null, opt_params, f);\r
\r
- try std.testing.expect(res == c.GGML_OPT_OK);\r
- try std.testing.expect(is_close(c.ggml_get_f32_1d(f, 0), 0.0, 1e-3));\r
+ try std.testing.expect(res == c.GGML_OPT_RESULT_OK);\r
+ try std.testing.expect(is_close(c.ggml_get_f32_1d(f, 0), 0.0, 1e-3));\r
try std.testing.expect(is_close(c.ggml_get_f32_1d(t0, 0), 1.0, 1e-3));\r
try std.testing.expect(is_close(c.ggml_get_f32_1d(t1, 0), 3.0, 1e-3));\r
}\r