code: def cmp_exprs(left, right):
      """Recursively compares two ast expressions."""
  
      if isinstance(left, ast.VectorVal) and isinstance(
          right, ast.Expr
      ):
          left_exprs = left.exprs
          right_exprs = right.exprs
          assert len(left_exprs) == len(right_exprs)
          for left_expr, right_expr in zip(left_exprs, right_exprs):
              assert cmp_exprs(left_expr, right_expr)
          return True
  
      if not isinstance(left, ast.Expr) and not isinstance(
          right, ast.Expr
      ):
          if _is_float(left) and _is_float(right):
              comp_res = np.isclose(left, right)
          else:
              comp_res = left == right
          assert comp_res, f"{left} != {right}"
          return True
  
      if isinstance(left, ast.Expr) and isinstance(right, ast.Expr):
          assert isinstance(
              left, type(right)
          ), f"Expected instance of {type(right)}, received {type(left)}"
  
          # Only compare attributes which don't start with __
          attrs_to_compare = filter(
              lambda attr_name: not attr_name.startswith("__"),
              dir(left),
          )
  
          for attr_name in attrs_to_compare:
              assert cmp_exprs(
                  getattr(left, attr_name), getattr(right, attr_name)
              )
  
          return True
  
      return False
  
imports: import subprocess
  from contextlib import contextmanager
  from functools import partial, wraps
  from itertools import product
  from pathlib import Path
  from shutil import rmtree
  from tempfile import mkdtemp
  import lightgbm
  import numpy
  import pytest
  import statsmodels.api
  import xgboost
  from lightning.impl.base import BaseClassifier
  from sklearn import datasets
  from sklearn.base import BaseEstimator, RegressorMixin, clone
  from sklearn.ensemble._forest import BaseForest, ForestClassifier
  from sklearn.linear_model._base import LinearClassifierMixin
  from sklearn.model_selection import train_test_split
  from sklearn.svm import SVC, NuSVC, OneClassSVM
  from sklearn.svm._base import BaseLibSVM
  from sklearn.tree import DecisionTreeClassifier
  from sklearn.tree._classes import BaseDecisionTree
  from m2cgen import ast
  from m2cgen.assemblers import _get_full_model_name
  from m2cgen.interpreters.utils import format_float
label_desc: Use image node_id 1 for calling a global function with example usage: cmp_exprs(left, right) and returns: False, True, True, True