         const int input_size_y = fp->layers[0]->input_size[1];
         const int input_size_z = fp->layers[0]->input_size[2];
 
-        print_coeffs(lcoeff_host, ucoeff_host, output_size_x, output_size_y, output_size_z, input_size_x, input_size_y, input_size_z, length_x, length_y, shift_x, shift_y, offset_x, offset_y);
-
-        retain_bounds = false;
+        sizes = (int*) malloc(num_out_neurons_0_layer*sizeof(int));
+        dims = (int*) malloc(num_out_neurons_0_layer*length_x*length_y*fp->layers[0]->input_size[2]*sizeof(int));
+
+        lcoeff_host_sparse = (float_type*) malloc(num_out_neurons_0_layer*length_x*length_y*fp->layers[0]->input_size[2]*sizeof(float_type));
+        ucoeff_host_sparse = (float_type*) malloc(num_out_neurons_0_layer*length_x*length_y*fp->layers[0]->input_size[2]*sizeof(float_type));
+
+        print_coeffs(lcoeff_host, ucoeff_host, sizes, dims, lcoeff_host_sparse, ucoeff_host_sparse, output_size_x, output_size_y, output_size_z, input_size_x, input_size_y, input_size_z, length_x, length_y, shift_x, shift_y, offset_x, offset_y);
+
+        dims = (int*) realloc(dims, sizes[num_out_neurons_0_layer - 1]*sizeof(int));
+
+        lcoeff_host_sparse = (float_type*) realloc(lcoeff_host_sparse, sizes[num_out_neurons_0_layer - 1]*sizeof(float_type));
+        ucoeff_host_sparse = (float_type*) realloc(ucoeff_host_sparse, sizes[num_out_neurons_0_layer - 1]*sizeof(float_type));
 
         free(lcoeff_host);
         free(ucoeff_host);
 
-        free(lcst_host);
-        free(ucst_host);
-
         lcoeff_host = nullptr;
         ucoeff_host = nullptr;
-
-        lcst_host = nullptr;
-        ucst_host = nullptr;
     }
 }
 

        layer_compute_bounds_from_exprs_conv<<<dim3(fp->layers[0]->output_size[0], fp->layers[0]->output_size[1], fp->layers[0]->output_size[2]), 1>>>(fp->layers[0]->filter_weights, fp->layers[0]->filter_bias, fp->layers[0]->lb_array, fp->layers[0]->ub_array, fp->input_inf, fp->input_sup, fp->layers[0]->output_size[0], fp->layers[0]->output_size[1], fp->layers[0]->output_size[2], fp->layers[0]->input_size[0], fp->layers[0]->input_size[1], fp->layers[0]->input_size[2], fp->layers[0]->filter_size[0], fp->layers[0]->filter_size[1], fp->layers[0]->strides[0], fp->layers[0]->strides[1], fp->layers[0]->pad[0], fp->layers[0]->pad[1]);
    }

    if(false)
    {
        const int num_out_neurons_0_layer = fp->layers[0]->num_out_neurons;


        cudaMemcpy(lcoeff_host, coeffs, num_out_neurons_0_layer*length_x*length_y*fp->layers[0]->input_size[2]*sizeof(float_type), cudaMemcpyDeviceToHost);
        cudaMemcpy(ucoeff_host, coeffs, num_out_neurons_0_layer*length_x*length_y*fp->layers[0]->input_size[2]*sizeof(float_type), cudaMemcpyDeviceToHost);

        lcst_host = (float_type*) malloc(num_out_neurons_0_layer*sizeof(float_type));
        ucst_host = (float_type*) malloc(num_out_neurons_0_layer*sizeof(float_type));

        cudaMemcpy(lcst_host, csts, num_out_neurons_0_layer*sizeof(float_type), cudaMemcpyDeviceToHost);
        cudaMemcpy(ucst_host, csts, num_out_neurons_0_layer*sizeof(float_type), cudaMemcpyDeviceToHost);
