 
 
 __global__
-void compute_ub_from_expr_conv_sparse(float_type* __restrict__ ub_array, const float_type* __restrict__ inf_coeff, const float_type* __restrict__ sup_coeff, const float_type* __restrict__ sup_cst, const float_type* __restrict__ input_inf, const float_type* __restrict__ input_sup, const size_t num_out_neurons_last_layer, const size_t output_size_x, const size_t output_size_y, const size_t output_size_z, long int offset_x, long int offset_y, long int length_x, long int length_y, long int shift_x, long int shift_y)
+void compute_ub_from_expr_conv_sparse(float_type* __restrict__ ub_array, const float_type* __restrict__ inf_coeff, const float_type* __restrict__ sup_coeff, const float_type* __restrict__ sup_cst, const float_type* __restrict__ input_inf, const float_type* __restrict__ input_sup, const size_t output_size_x, const size_t output_size_y, const size_t output_size_z, long int offset_x, long int offset_y, long int length_x, long int length_y, long int shift_x, long int shift_y)
 {
     const size_t last_x = blockIdx.x;
     const size_t last_y = blockIdx.y;


        if(fp->layers[k]->activation == RELU)
        {
            lexpr_replace_relu_bounds_conv_sparse<<<dim3(fp->layers[layerno]->output_size[0], fp->layers[layerno]->output_size[1], fp->layers[layerno]->output_size[2]), 1>>>(linf_coeff, lsup_coeff, linf_cst, lsup_cst, aux_lb_array, aux_ub_array, num_out_neurons_last_layer, fp->layers[k]->output_size[0], fp->layers[k]->output_size[1], fp->layers[k]->output_size[2], offset_x, offset_y, length_x, length_y, shift_x, shift_y);
            uexpr_replace_relu_bounds_conv_sparse<<<dim3(fp->layers[layerno]->output_size[0], fp->layers[layerno]->output_size[1], fp->layers[layerno]->output_size[2]), 1>>>(uinf_coeff, usup_coeff, uinf_cst, usup_cst, aux_lb_array, aux_ub_array, num_out_neurons_last_layer, fp->layers[k]->output_size[0], fp->layers[k]->output_size[1], fp->layers[k]->output_size[2], offset_x, offset_y, length_x, length_y, shift_x, shift_y);
        }

        size_t missing_length = ((length_x - 1)*fp->layers[k]->strides[0] + fp->layers[k]->filter_size[0])*((length_y - 1)*fp->layers[k]->strides[1] + fp->layers[k]->filter_size[1])*fp->layers[k]->input_size[2];

        cudaMalloc((void**) &linf_coeff_tmp, num_out_neurons_last_layer*missing_length*sizeof(float_type));
        cudaMalloc((void**) &lsup_coeff_tmp, num_out_neurons_last_layer*missing_length*sizeof(float_type));
        cudaMalloc((void**) &uinf_coeff_tmp, num_out_neurons_last_layer*missing_length*sizeof(float_type));
        cudaMalloc((void**) &usup_coeff_tmp, num_out_neurons_last_layer*missing_length*sizeof(float_type));

        cudaMemset(linf_coeff_tmp, 0, num_out_neurons_last_layer*missing_length*sizeof(float_type));
        cudaMemset(lsup_coeff_tmp, 0, num_out_neurons_last_layer*missing_length*sizeof(float_type));
        cudaMemset(uinf_coeff_tmp, 0, num_out_neurons_last_layer*missing_length*sizeof(float_type));
        cudaMemset(usup_coeff_tmp, 0, num_out_neurons_last_layer*missing_length*sizeof(float_type));

        //if(fp->layers[k]->filter_size[0]*fp->layers[k]->filter_size[1]*fp->layers[k]->filter_size[2] > 1024)
        //{



__global__
void compute_lb_from_expr(float_type* __restrict__ lb_array, const float_type* __restrict__ inf_coeff, const float_type* __restrict__ sup_coeff, const float_type* __restrict__ inf_cst, const float_type* __restrict__ input_inf, const float_type* __restrict__ input_sup, const size_t expr_size)
{
    const size_t n = blockIdx.x;

