 
 
 __global__
-void coeffs_from_previous_layer(const float_type* __restrict__ expr_inf_coeff, const float_type* __restrict__ expr_sup_coeff, float_type* __restrict__ res_inf_coeff, float_type* __restrict__ res_sup_coeff, const float_type* __restrict__ aux_coeffs, const size_t num_out_neurons_current_layer, const size_t num_in_neurons_current_layer)
-{
-    const size_t n = blockIdx.x;
-
-    size_t j = threadIdx.x;
-
-    float_type tmp1, tmp2;
-    float_type maxRes, maxMul;
-
-    while(j < num_in_neurons_current_layer)
-    {
-        const size_t b = n*num_in_neurons_current_layer + j;
-
-        float_type inf_coeff = 0;
-        float_type sup_coeff = 0;
-
-        for(size_t i = 0; i < num_out_neurons_current_layer; i++)
-        {
-            size_t a = n*num_out_neurons_current_layer + i;
-            size_t c = i*num_in_neurons_current_layer + j;
-
-            const float_type prev_inf_coeff = expr_inf_coeff[a];
-            const float_type prev_sup_coeff = expr_sup_coeff[a];
-
-            if((prev_inf_coeff != 0) || (prev_sup_coeff != 0))
-            {
-                elina_double_interval_mul_expr_coeff_const_expr(&tmp1, &tmp2, prev_inf_coeff, prev_sup_coeff, aux_coeffs[c]);
-
-                maxRes = max(abs(inf_coeff), abs(sup_coeff));
-                maxMul = max(abs(tmp1), abs(tmp2));
-
-                inf_coeff = inf_coeff + tmp1 - (maxRes + maxMul)*ulp;
-                sup_coeff = sup_coeff + tmp2 + (maxRes + maxMul)*ulp;
-            }
-        }
-
-        res_inf_coeff[b] = inf_coeff;
-        res_sup_coeff[b] = sup_coeff;
-
-        j += blockDim.x;
-    }
-}
-
-
-__global__
 void coeffs_from_previous_layer(const float_type* __restrict__ expr_linf_coeff, const float_type* __restrict__ expr_lsup_coeff, const float_type* __restrict__ expr_uinf_coeff, const float_type* __restrict__ expr_usup_coeff, float_type* __restrict__ res_linf_coeff, float_type* __restrict__ res_lsup_coeff, float_type* __restrict__ res_uinf_coeff, float_type* __restrict__ res_usup_coeff, const float_type* __restrict__ aux_coeffs, const size_t num_out_neurons_current_layer, const size_t num_in_neurons_current_layer)
 {
     const size_t n = blockIdx.x;

}


void update_state_using_predecessor_layer_lower_half(fppoly_internal_t* pr, fppoly_t* fp, float_type** linf_coeff, float_type** lsup_coeff, float_type** linf_cst, float_type** lsup_cst, float_type** linf_coeff_tmp, float_type** lsup_coeff_tmp, float_type** linf_cst_tmp, float_type** lsup_cst_tmp, const size_t k, bool use_area_heuristic, const size_t num_out_neurons_last_layer)
{
    const size_t num_out_neurons_current_layer = fp->layers[k]->num_out_neurons;



__global__
void coeffs_from_previous_layer_conv(const float_type* __restrict__ expr_linf_coeff, const float_type* __restrict__ expr_lsup_coeff, const float_type* __restrict__ expr_uinf_coeff, const float_type* __restrict__ expr_usup_coeff, float_type* __restrict__ res_linf_coeff, float_type* __restrict__ res_lsup_coeff, float_type* __restrict__ res_uinf_coeff, float_type* __restrict__ res_usup_coeff, const float_type* __restrict__ aux_coeffs, const size_t output_size_x, const size_t output_size_y, const size_t output_size_z, const size_t input_size_x, const size_t input_size_y, const size_t input_size_z, const size_t filter_size_x, const size_t filter_size_y, const size_t stride_x, const size_t stride_y, const size_t pad_x, const size_t pad_y)
{
    const size_t n = blockIdx.x;

