         cudaMalloc((void**) &linf_coeff_tmp, num_out_neurons_last_layer*num_in_neurons_current_layer*sizeof(float_type));
         cudaMalloc((void**) &lsup_coeff_tmp, num_out_neurons_last_layer*num_in_neurons_current_layer*sizeof(float_type));
 
-        coeffs_from_previous_layer<<<num_blocks_linear, num_threads>>>(linf_coeff, lsup_coeff, linf_coeff_tmp, lsup_coeff_tmp, aux_coeffs, num_out_neurons_last_layer, num_out_neurons_current_layer, num_in_neurons_current_layer);
-
-        csts_from_previous_layer<<<num_out_neurons_last_layer, 1>>>(linf_coeff, lsup_coeff, linf_cst, lsup_cst, linf_cst_tmp, lsup_cst_tmp, aux_csts, num_out_neurons_last_layer, num_out_neurons_current_layer);
+        if(fp->layers[k]->type == CONV)
+        {
+            coeffs_from_previous_layer_conv<<<num_out_neurons_last_layer, 1>>>(linf_coeff, lsup_coeff, linf_coeff_tmp, lsup_coeff_tmp, aux_coeffs, num_out_neurons_last_layer, fp->layers[k]->output_size[0], fp->layers[k]->output_size[1], fp->layers[k]->output_size[2], fp->layers[k]->input_size[0], fp->layers[k]->input_size[1], fp->layers[k]->input_size[2]);
+
+            csts_from_previous_layer_conv<<<num_out_neurons_last_layer, 1>>>(linf_coeff, lsup_coeff, linf_cst, lsup_cst, linf_cst_tmp, lsup_cst_tmp, fp->layers[k]->filter_bias, num_out_neurons_last_layer, fp->layers[k]->output_size[0], fp->layers[k]->output_size[1], fp->layers[k]->output_size[2]);
+        }
+        else
+        {
+            coeffs_from_previous_layer<<<num_blocks_linear, num_threads>>>(linf_coeff, lsup_coeff, linf_coeff_tmp, lsup_coeff_tmp, aux_coeffs, num_out_neurons_last_layer, num_out_neurons_current_layer, num_in_neurons_current_layer);
+
+            csts_from_previous_layer<<<num_out_neurons_last_layer, 1>>>(linf_coeff, lsup_coeff, linf_cst, lsup_cst, linf_cst_tmp, lsup_cst_tmp, aux_csts, num_out_neurons_last_layer, num_out_neurons_current_layer);
+        }
 
         std::swap(linf_coeff, linf_coeff_tmp);
         std::swap(lsup_coeff, lsup_coeff_tmp);


    if(j < num_in_neurons_current_layer)
    {
        size_t i = 0;

        size_t a = n*num_out_neurons_current_layer + i;
        const size_t b = n*num_in_neurons_current_layer + j;
        size_t c = i*num_in_neurons_current_layer + j;

        float_type inf_coeff;
        float_type sup_coeff;

        elina_double_interval_mul_expr_coeff(&inf_coeff, &sup_coeff, expr_inf_coeff[a], expr_sup_coeff[a], -aux_coeffs[c], aux_coeffs[c]);

        float_type tmp1, tmp2;
        float_type maxRes, maxMul;

        for(i = 1; i < num_out_neurons_current_layer; i++)
        {
            a++;
            c += num_in_neurons_current_layer;

            const float_type prev_inf_coeff = expr_inf_coeff[a];
            const float_type prev_sup_coeff = expr_sup_coeff[a];

#include <cuda.h>
#include <chrono>

const size_t num_threads = 128;

bool results[90];
