| 15401 | } |
| 15402 | |
| 15403 | static void ggml_compute_backward(struct ggml_context * ctx, struct ggml_tensor * tensor, struct ggml_hash_set zero_table) { |
| 15404 | struct ggml_tensor * src0 = tensor->src[0]; |
| 15405 | struct ggml_tensor * src1 = tensor->src[1]; |
| 15406 | |
| 15407 | switch (tensor->op) { |
| 15408 | case GGML_OP_DUP: |
| 15409 | { |
| 15410 | if (src0->grad) { |
| 15411 | src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); |
| 15412 | } |
| 15413 | } break; |
| 15414 | case GGML_OP_ADD: |
| 15415 | { |
| 15416 | if (src0->grad) { |
| 15417 | src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); |
| 15418 | } |
| 15419 | if (src1->grad) { |
| 15420 | src1->grad = ggml_add_or_set(ctx, src1->grad, tensor->grad, zero_table); |
| 15421 | } |
| 15422 | } break; |
| 15423 | case GGML_OP_ADD1: |
| 15424 | { |
| 15425 | if (src0->grad) { |
| 15426 | src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); |
| 15427 | } |
| 15428 | if (src1->grad) { |
| 15429 | src1->grad = ggml_add_or_set(ctx, |
| 15430 | src1->grad, |
| 15431 | ggml_mean(ctx, tensor->grad), // TODO: should probably be sum instead of mean |
| 15432 | zero_table); |
| 15433 | } |
| 15434 | } break; |
| 15435 | case GGML_OP_ACC: |
| 15436 | { |
| 15437 | if (src0->grad) { |
| 15438 | src0->grad = ggml_add_or_set(ctx, src0->grad, tensor->grad, zero_table); |
| 15439 | } |
| 15440 | if (src1->grad) { |
| 15441 | const size_t nb1 = ((int32_t *) tensor->op_params)[0]; |
| 15442 | const size_t nb2 = ((int32_t *) tensor->op_params)[1]; |
| 15443 | const size_t nb3 = ((int32_t *) tensor->op_params)[2]; |
| 15444 | const size_t offset = ((int32_t *) tensor->op_params)[3]; |
| 15445 | |
| 15446 | struct ggml_tensor * tensor_grad_view = ggml_view_4d(ctx, |
| 15447 | tensor->grad, |
| 15448 | src1->grad->ne[0], |
| 15449 | src1->grad->ne[1], |
| 15450 | src1->grad->ne[2], |
| 15451 | src1->grad->ne[3], |
| 15452 | nb1, nb2, nb3, offset); |
| 15453 | |
| 15454 | src1->grad = |
| 15455 | ggml_add_or_set(ctx, |
| 15456 | src1->grad, |
| 15457 | ggml_reshape(ctx, |
| 15458 | ggml_cont(ctx, tensor_grad_view), |
| 15459 | src1->grad), |
| 15460 | zero_table); |
no test coverage detected