2022-07-05 08:13:25 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2022-10-24 12:54:51 +02:00
|
|
|
|
2023-02-18 13:10:00 +01:00
|
|
|
#include "../include/memory_management.h"
|
2023-01-28 22:04:38 +01:00
|
|
|
|
2022-09-16 14:53:35 +02:00
|
|
|
#include "include/free.h"
|
2022-07-05 08:13:25 +02:00
|
|
|
|
|
|
|
void free_a_cube_input_layer(Network* network, int pos, int depth, int dim) {
|
2022-09-09 17:39:07 +02:00
|
|
|
for (int i=0; i < depth; i++) {
|
|
|
|
for (int j=0; j < dim; j++) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(network->input[pos][i][j]);
|
|
|
|
gree(network->input_z[pos][i][j]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(network->input[pos][i]);
|
|
|
|
gree(network->input_z[pos][i]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(network->input[pos]);
|
|
|
|
gree(network->input_z[pos]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_a_line_input_layer(Network* network, int pos) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(network->input[pos][0][0]);
|
|
|
|
gree(network->input_z[pos][0][0]);
|
|
|
|
gree(network->input[pos][0]);
|
|
|
|
gree(network->input_z[pos][0]);
|
|
|
|
gree(network->input[pos]);
|
|
|
|
gree(network->input_z[pos]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
|
|
|
|
2023-01-30 09:39:45 +01:00
|
|
|
void free_2d_pooling(Network* network, int pos) {
|
2022-10-05 11:10:13 +02:00
|
|
|
free_a_cube_input_layer(network, pos+1, network->depth[pos+1], network->width[pos+1]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_convolution(Network* network, int pos) {
|
2022-10-02 16:16:14 +02:00
|
|
|
Kernel_cnn* k_pos = network->kernel[pos]->cnn;
|
|
|
|
int c = k_pos->columns;
|
|
|
|
int k_size = k_pos->k_size;
|
|
|
|
int r = k_pos->rows;
|
2022-10-05 11:10:13 +02:00
|
|
|
int bias_size = network->width[pos+1]; // Not sure of the value
|
|
|
|
free_a_cube_input_layer(network, pos+1, network->depth[pos+1], network->width[pos+1]);
|
2022-09-09 17:39:07 +02:00
|
|
|
for (int i=0; i < c; i++) {
|
2022-10-02 16:16:14 +02:00
|
|
|
for (int j=0; j < bias_size; j++) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->bias[i][j]);
|
|
|
|
gree(k_pos->d_bias[i][j]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->bias[i]);
|
|
|
|
gree(k_pos->d_bias[i]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->bias);
|
|
|
|
gree(k_pos->d_bias);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
2022-09-09 17:39:07 +02:00
|
|
|
for (int i=0; i < r; i++) {
|
|
|
|
for (int j=0; j < c; j++) {
|
|
|
|
for (int k=0; k < k_size; k++) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->w[i][j][k]);
|
|
|
|
gree(k_pos->d_w[i][j][k]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->w[i][j]);
|
|
|
|
gree(k_pos->d_w[i][j]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->w[i]);
|
|
|
|
gree(k_pos->d_w[i]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->w);
|
|
|
|
gree(k_pos->d_w);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_dense(Network* network, int pos) {
|
2022-10-02 16:16:14 +02:00
|
|
|
free_a_line_input_layer(network, pos+1);
|
|
|
|
Kernel_nn* k_pos = network->kernel[pos]->nn;
|
|
|
|
int dim = k_pos->input_units;
|
2022-09-09 17:39:07 +02:00
|
|
|
for (int i=0; i < dim; i++) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->weights[i]);
|
|
|
|
gree(k_pos->d_weights[i]);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->weights);
|
|
|
|
gree(k_pos->d_weights);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->bias);
|
|
|
|
gree(k_pos->d_bias);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos);
|
2022-10-02 16:16:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_dense_linearisation(Network* network, int pos) {
|
|
|
|
free_a_line_input_layer(network, pos+1);
|
|
|
|
Kernel_nn* k_pos = network->kernel[pos]->nn;
|
|
|
|
int dim = k_pos->input_units;
|
|
|
|
for (int i=0; i < dim; i++) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->weights[i]);
|
|
|
|
gree(k_pos->d_weights[i]);
|
2022-10-02 16:16:14 +02:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->weights);
|
|
|
|
gree(k_pos->d_weights);
|
2022-10-02 16:16:14 +02:00
|
|
|
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos->bias);
|
|
|
|
gree(k_pos->d_bias);
|
2022-10-02 16:16:14 +02:00
|
|
|
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(k_pos);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_network_creation(Network* network) {
|
2022-09-12 17:56:44 +02:00
|
|
|
free_a_cube_input_layer(network, 0, network->depth[0], network->width[0]);
|
2023-02-18 13:10:00 +01:00
|
|
|
for (int i=0; i < network->max_size-1; i++) {
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(network->kernel[i]);
|
2023-02-18 13:10:00 +01:00
|
|
|
}
|
2023-01-28 22:04:38 +01:00
|
|
|
gree(network->width);
|
|
|
|
gree(network->depth);
|
|
|
|
gree(network->kernel);
|
|
|
|
gree(network->input);
|
|
|
|
gree(network->input_z);
|
|
|
|
|
|
|
|
gree(network);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
|
|
|
|
2022-10-05 11:10:13 +02:00
|
|
|
void free_network(Network* network) {
|
|
|
|
for (int i=network->size-2; i>=0; i--) {
|
|
|
|
if (network->kernel[i]->cnn != NULL) { // Convolution
|
|
|
|
free_convolution(network, i);
|
|
|
|
} else if (network->kernel[i]->nn != NULL) {
|
2023-01-17 12:49:35 +01:00
|
|
|
if (network->kernel[i]->linearisation == 0) { // Dense non linearised
|
2022-10-05 11:10:13 +02:00
|
|
|
free_dense(network, i);
|
|
|
|
} else { // Dense lineariation
|
|
|
|
free_dense_linearisation(network, i);
|
|
|
|
}
|
|
|
|
} else { // Pooling
|
2023-01-30 09:39:45 +01:00
|
|
|
free_2d_pooling(network, i);
|
2022-10-05 11:10:13 +02:00
|
|
|
}
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|
2022-10-05 11:10:13 +02:00
|
|
|
free_network_creation(network);
|
2022-07-05 08:13:25 +02:00
|
|
|
}
|