code: def max(self, expr, extra_constraints=(), solver=None, model_callback=None):
          
          if self._solver_required and solver is None:
              raise BackendError("%s requires a solver for evaluation" % self.__class__.__name__)
  
          return self._max(self.convert(expr), extra_constraints=self.convert_list(extra_constraints), solver=solver, model_callback=model_callback)
docs: Return the maximum value of expr.
  
          :param expr: expression (an AST) to evaluate
          :param solver: a solver object, native to the backend, to assist in
                         the evaluation (for example, a z3.Solver)
          :param extra_constraints: extra constraints (as ASTs) to add to the solver for this solve
          :param model_callback:      a function that will be executed with recovered models (if any)
          :return: the maximum possible value of expr (backend object)