 
     for(size_t i = 0; i < num_out_neurons; i++)
     {
-        compute_lb_from_expr(&(out_neurons[i]->lb), lexpr[i], fp->input_inf, fp->input_sup, fp->input_lexpr, fp->input_uexpr);
-        compute_ub_from_expr(&(out_neurons[i]->ub), uexpr[i], fp->input_inf, fp->input_sup, fp->input_lexpr, fp->input_uexpr);
+        if((fp->input_lexpr != nullptr) && (fp->input_uexpr != nullptr))
+        {
+            replace_input_poly_cons_in_lexpr(&(lexpr[i]), fp->input_inf, fp->input_sup, fp->input_lexpr, fp->input_uexpr);
+            replace_input_poly_cons_in_uexpr(&(uexpr[i]), fp->input_inf, fp->input_sup, fp->input_lexpr, fp->input_uexpr);
+        }
+
+        compute_lb_from_expr(&(out_neurons[i]->lb), &(lexpr[i]), fp->input_inf, fp->input_sup, fp->input_lexpr, fp->input_uexpr);
+        compute_ub_from_expr(&(out_neurons[i]->ub), &(uexpr[i]), fp->input_inf, fp->input_sup, fp->input_lexpr, fp->input_uexpr);
     }
 
     if(fp->out != nullptr)

    for(size_t i = 0; i < size; i++)
    {
        neuron_t* neuron = neurons[i];
        compute_lb_from_expr(&(neuron->lb), neuron->expr, input_inf, input_sup, input_lexpr, input_uexpr);
        compute_ub_from_expr(&(neuron->ub), neuron->expr, input_inf, input_sup, input_lexpr, input_uexpr);
    }
}




__device__ __host__
void compute_ub_from_expr(double* ub, expr_t** expr_ptr, double* input_inf, double* input_sup, expr_t** input_lexpr, expr_t** input_uexpr)
{
    expr_t* expr= *expr_ptr;

    double res_sup = expr->sup_cst;

    if((expr->inf_coeff == nullptr) || (expr->sup_coeff == nullptr))
    {
        *ub = 0;
