Nothing
# Tests for Convolution and Pooling Operations
# ============================================================================
# 1D Convolution
# ============================================================================
test_that("ggml_conv_1d creates convolution operation", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
# Kernel: [kernel_size, in_channels, out_channels] = [3, 1, 1]
kernel <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 3, 1)
# Input: [length, in_channels] = [10, 1]
input <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 10, 1)
ggml_set_f32(kernel, c(1, 1, 1)) # Averaging kernel
ggml_set_f32(input, as.numeric(1:10))
result <- ggml_conv_1d(ctx, kernel, input, s0 = 1, p0 = 0, d0 = 1)
expect_type(result, "externalptr")
expect_false(is.null(result))
})
test_that("ggml_conv_1d with stride", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
kernel <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 3, 1)
input <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 10, 1)
ggml_set_f32(kernel, c(1, 1, 1))
ggml_set_f32(input, as.numeric(1:10))
# Stride 2 should produce smaller output
result <- ggml_conv_1d(ctx, kernel, input, s0 = 2, p0 = 0, d0 = 1)
expect_type(result, "externalptr")
})
test_that("ggml_conv_1d with padding", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
kernel <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 3, 1)
input <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 10, 1)
ggml_set_f32(kernel, c(1, 1, 1))
ggml_set_f32(input, as.numeric(1:10))
# Padding 1 on each side
result <- ggml_conv_1d(ctx, kernel, input, s0 = 1, p0 = 1, d0 = 1)
expect_type(result, "externalptr")
})
# ============================================================================
# 2D Convolution
# ============================================================================
test_that("ggml_conv_2d creates 2D convolution operation", {
ctx <- ggml_init(32 * 1024 * 1024)
on.exit(ggml_free(ctx))
# Kernel: [KW, KH, IC, OC] = [3, 3, 1, 1]
kernel <- ggml_new_tensor_4d(ctx, GGML_TYPE_F32, 3, 3, 1, 1)
# Input: [W, H, C, N] = [8, 8, 1, 1]
input <- ggml_new_tensor_4d(ctx, GGML_TYPE_F32, 8, 8, 1, 1)
ggml_set_f32(kernel, rep(1/9, 9)) # Averaging kernel
ggml_set_f32(input, rnorm(64))
result <- ggml_conv_2d(ctx, kernel, input)
expect_type(result, "externalptr")
expect_false(is.null(result))
})
test_that("ggml_conv_2d with stride and padding", {
ctx <- ggml_init(32 * 1024 * 1024)
on.exit(ggml_free(ctx))
kernel <- ggml_new_tensor_4d(ctx, GGML_TYPE_F32, 3, 3, 1, 1)
input <- ggml_new_tensor_4d(ctx, GGML_TYPE_F32, 8, 8, 1, 1)
ggml_set_f32(kernel, rep(1/9, 9))
ggml_set_f32(input, rnorm(64))
# Stride 2, Padding 1
result <- ggml_conv_2d(ctx, kernel, input, s0 = 2, s1 = 2, p0 = 1, p1 = 1)
expect_type(result, "externalptr")
})
# ============================================================================
# Transposed 1D Convolution
# ============================================================================
test_that("ggml_conv_transpose_1d creates deconvolution operation", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
kernel <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 3, 1)
input <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 5, 1)
ggml_set_f32(kernel, c(1, 2, 1))
ggml_set_f32(input, as.numeric(1:5))
result <- ggml_conv_transpose_1d(ctx, kernel, input)
expect_type(result, "externalptr")
expect_false(is.null(result))
})
# ============================================================================
# 1D Pooling
# ============================================================================
test_that("ggml_pool_1d max pooling works", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
input <- ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 8)
ggml_set_f32(input, c(1, 3, 2, 4, 5, 2, 8, 1))
# Max pool with kernel size 2
result <- ggml_pool_1d(ctx, input, GGML_OP_POOL_MAX, k0 = 2, s0 = 2, p0 = 0)
graph <- ggml_build_forward_expand(ctx, result)
ggml_graph_compute(ctx, graph)
output <- ggml_get_f32(result)
# Expected: max of [1,3]=3, [2,4]=4, [5,2]=5, [8,1]=8
expect_equal(output, c(3, 4, 5, 8), tolerance = 1e-5)
})
test_that("ggml_pool_1d average pooling works", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
input <- ggml_new_tensor_1d(ctx, GGML_TYPE_F32, 8)
ggml_set_f32(input, c(2, 4, 6, 8, 10, 12, 14, 16))
# Avg pool with kernel size 2
result <- ggml_pool_1d(ctx, input, GGML_OP_POOL_AVG, k0 = 2, s0 = 2, p0 = 0)
graph <- ggml_build_forward_expand(ctx, result)
ggml_graph_compute(ctx, graph)
output <- ggml_get_f32(result)
# Expected: avg of [2,4]=3, [6,8]=7, [10,12]=11, [14,16]=15
expect_equal(output, c(3, 7, 11, 15), tolerance = 1e-5)
})
test_that("ggml_pool_1d with overlapping windows", {
skip("Overlapping pooling requires specific tensor layout - tested in 2D pooling")
# Note: 1D pooling with stride < kernel may require
# different tensor dimensions for proper operation.
})
# ============================================================================
# 2D Pooling
# ============================================================================
test_that("ggml_pool_2d max pooling works", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
# 4x4 input
input <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 4, 4)
ggml_set_f32(input, c(
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16
))
# 2x2 max pool with stride 2
result <- ggml_pool_2d(ctx, input, GGML_OP_POOL_MAX, k0 = 2, k1 = 2, s0 = 2, s1 = 2)
graph <- ggml_build_forward_expand(ctx, result)
ggml_graph_compute(ctx, graph)
output <- ggml_get_f32(result)
# Result should be 2x2
expect_length(output, 4)
})
test_that("ggml_pool_2d average pooling works", {
ctx <- ggml_init(16 * 1024 * 1024)
on.exit(ggml_free(ctx))
input <- ggml_new_tensor_2d(ctx, GGML_TYPE_F32, 4, 4)
ggml_set_f32(input, rep(4, 16)) # All 4s
# 2x2 avg pool
result <- ggml_pool_2d(ctx, input, GGML_OP_POOL_AVG, k0 = 2, k1 = 2, s0 = 2, s1 = 2)
graph <- ggml_build_forward_expand(ctx, result)
ggml_graph_compute(ctx, graph)
output <- ggml_get_f32(result)
# Average of all 4s should be 4
expect_equal(output, rep(4, 4), tolerance = 1e-5)
})
# ============================================================================
# Im2Col
# ============================================================================
test_that("ggml_im2col creates im2col operation", {
ctx <- ggml_init(32 * 1024 * 1024)
on.exit(ggml_free(ctx))
# Kernel defines the patch size
kernel <- ggml_new_tensor_4d(ctx, GGML_TYPE_F32, 3, 3, 1, 1)
# Input image
input <- ggml_new_tensor_4d(ctx, GGML_TYPE_F32, 8, 8, 1, 1)
ggml_set_f32(kernel, rep(1, 9))
ggml_set_f32(input, rnorm(64))
result <- ggml_im2col(ctx, kernel, input, s0 = 1, s1 = 1, p0 = 0, p1 = 0, d0 = 1, d1 = 1)
expect_type(result, "externalptr")
expect_false(is.null(result))
})
# ============================================================================
# Pooling Constants
# ============================================================================
test_that("pooling constants are defined correctly", {
expect_equal(GGML_OP_POOL_MAX, 0L)
expect_equal(GGML_OP_POOL_AVG, 1L)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.