prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Write docs for Optuna optimization
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `cupyx/optimizing/_optimize.py`
  Content:
  ```
  1 import contextlib
  2 import math
  3 
  4 
  5 try:
  6     import optuna
  7     _optuna_available = True
  8 except ImportError:
  9     _optuna_available = False
  10 
  11 
  12 from cupy.core import _optimize_config
  13 from cupyx import time
  14 
  15 
  16 def _optimize(
  17         optimize_config, target_func, suggest_func,
  18         default_best, ignore_error=()):
  19     assert isinstance(optimize_config, _optimize_config._OptimizationConfig)
  20     assert callable(target_func)
  21     assert callable(suggest_func)
  22 
  23     def objective(trial):
  24         args = suggest_func(trial)
  25         max_total_time = optimize_config.max_total_time_per_trial
  26         try:
  27             perf = time.repeat(target_func, args, max_duration=max_total_time)
  28             return perf.gpu_times.mean()
  29         except Exception as e:
  30             if isinstance(e, ignore_error):
  31                 return math.inf
  32             else:
  33                 raise e
  34 
  35     study = optuna.create_study()
  36     study.enqueue_trial(default_best)
  37     study.optimize(
  38         objective,
  39         n_trials=optimize_config.max_trials,
  40         timeout=optimize_config.timeout)
  41     return study.best_trial
  42 
  43 
  44 @contextlib.contextmanager
  45 def optimize(*, key=None, **config_dict):
  46     if not _optuna_available:
  47         raise RuntimeError(
  48             'Optuna is required to run optimization. '
  49             'See https://optuna.org/ for the installation instructions.')
  50 
  51     old_context = _optimize_config.get_current_context()
  52     context = _optimize_config.get_new_context(key, _optimize, config_dict)
  53     _optimize_config.set_current_context(context)
  54 
  55     try:
  56         yield context
  57     finally:
  58         _optimize_config.set_current_context(old_context)
  59
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/cupyx/optimizing/_optimize.py b/cupyx/optimizing/_optimize.py
  --- a/cupyx/optimizing/_optimize.py
  +++ b/cupyx/optimizing/_optimize.py
  @@ -43,6 +43,37 @@
   
   @contextlib.contextmanager
   def optimize(*, key=None, **config_dict):
  +    """Context manager that optimizes kernel launch parameters.
  +
  +    In this context, CuPy's routines find the best kernel launch parameter
  +    values (e.g., the number of threads and blocks). The found values are
  +    cached and reused with keys as the shapes, strides and dtypes of the
  +    given inputs arrays.
  +
  +    Args:
  +        key (string or None): The cache key of optimizations.
  +        max_trials (int): The number of trials that defaults to 100.
  +        timeout (float):
  +            Stops study after the given number of seconds. Default is 1.
  +        max_total_time_per_trial (float):
  +            Repeats measuring the execution time of the routine for the
  +            given number of seconds. Default is 0.1.
  +
  +    Examples
  +    --------
  +    >>> import cupy
  +    >>> from cupyx import optimizing
  +    >>>
  +    >>> x = cupy.arange(100)
  +    >>> with optimizing.optimize():
  +    ...     cupy.sum(x)
  +    ...
  +    array(4950)
  +
  +    .. note::
  +      Optuna (https://optuna.org) installation is required.
  +      Currently it works for reduction operations only.
  +    """
       if not _optuna_available:
           raise RuntimeError(
               'Optuna is required to run optimization. '
  
verification_info: {"golden_diff": "diff --git a/cupyx/optimizing/_optimize.py b/cupyx/optimizing/_optimize.py\n--- a/cupyx/optimizing/_optimize.py\n+++ b/cupyx/optimizing/_optimize.py\n@@ -43,6 +43,37 @@\n \n @contextlib.contextmanager\n def optimize(*, key=None, **config_dict):\n+    \"\"\"Context manager that optimizes kernel launch parameters.\n+\n+    In this context, CuPy's routines find the best kernel launch parameter\n+    values (e.g., the number of threads and blocks). The found values are\n+    cached and reused with keys as the shapes, strides and dtypes of the\n+    given inputs arrays.\n+\n+    Args:\n+        key (string or None): The cache key of optimizations.\n+        max_trials (int): The number of trials that defaults to 100.\n+        timeout (float):\n+            Stops study after the given number of seconds. Default is 1.\n+        max_total_time_per_trial (float):\n+            Repeats measuring the execution time of the routine for the\n+            given number of seconds. Default is 0.1.\n+\n+    Examples\n+    --------\n+    >>> import cupy\n+    >>> from cupyx import optimizing\n+    >>>\n+    >>> x = cupy.arange(100)\n+    >>> with optimizing.optimize():\n+    ...     cupy.sum(x)\n+    ...\n+    array(4950)\n+\n+    .. note::\n+      Optuna (https://optuna.org) installation is required.\n+      Currently it works for reduction operations only.\n+    \"\"\"\n     if not _optuna_available:\n         raise RuntimeError(\n             'Optuna is required to run optimization. '\n", "issue": "Write docs for Optuna optimization\n\n", "before_files": [{"content": "import contextlib\nimport math\n\n\ntry:\n    import optuna\n    _optuna_available = True\nexcept ImportError:\n    _optuna_available = False\n\n\nfrom cupy.core import _optimize_config\nfrom cupyx import time\n\n\ndef _optimize(\n        optimize_config, target_func, suggest_func,\n        default_best, ignore_error=()):\n    assert isinstance(optimize_config, _optimize_config._OptimizationConfig)\n    assert callable(target_func)\n    assert callable(suggest_func)\n\n    def objective(trial):\n        args = suggest_func(trial)\n        max_total_time = optimize_config.max_total_time_per_trial\n        try:\n            perf = time.repeat(target_func, args, max_duration=max_total_time)\n            return perf.gpu_times.mean()\n        except Exception as e:\n            if isinstance(e, ignore_error):\n                return math.inf\n            else:\n                raise e\n\n    study = optuna.create_study()\n    study.enqueue_trial(default_best)\n    study.optimize(\n        objective,\n        n_trials=optimize_config.max_trials,\n        timeout=optimize_config.timeout)\n    return study.best_trial\n\n\n@contextlib.contextmanager\ndef optimize(*, key=None, **config_dict):\n    if not _optuna_available:\n        raise RuntimeError(\n            'Optuna is required to run optimization. '\n            'See https://optuna.org/ for the installation instructions.')\n\n    old_context = _optimize_config.get_current_context()\n    context = _optimize_config.get_new_context(key, _optimize, config_dict)\n    _optimize_config.set_current_context(context)\n\n    try:\n        yield context\n    finally:\n        _optimize_config.set_current_context(old_context)\n", "path": "cupyx/optimizing/_optimize.py"}], "after_files": [{"content": "import contextlib\nimport math\n\n\ntry:\n    import optuna\n    _optuna_available = True\nexcept ImportError:\n    _optuna_available = False\n\n\nfrom cupy.core import _optimize_config\nfrom cupyx import time\n\n\ndef _optimize(\n        optimize_config, target_func, suggest_func,\n        default_best, ignore_error=()):\n    assert isinstance(optimize_config, _optimize_config._OptimizationConfig)\n    assert callable(target_func)\n    assert callable(suggest_func)\n\n    def objective(trial):\n        args = suggest_func(trial)\n        max_total_time = optimize_config.max_total_time_per_trial\n        try:\n            perf = time.repeat(target_func, args, max_duration=max_total_time)\n            return perf.gpu_times.mean()\n        except Exception as e:\n            if isinstance(e, ignore_error):\n                return math.inf\n            else:\n                raise e\n\n    study = optuna.create_study()\n    study.enqueue_trial(default_best)\n    study.optimize(\n        objective,\n        n_trials=optimize_config.max_trials,\n        timeout=optimize_config.timeout)\n    return study.best_trial\n\n\n@contextlib.contextmanager\ndef optimize(*, key=None, **config_dict):\n    \"\"\"Context manager that optimizes kernel launch parameters.\n\n    In this context, CuPy's routines find the best kernel launch parameter\n    values (e.g., the number of threads and blocks). The found values are\n    cached and reused with keys as the shapes, strides and dtypes of the\n    given inputs arrays.\n\n    Args:\n        key (string or None): The cache key of optimizations.\n        max_trials (int): The number of trials that defaults to 100.\n        timeout (float):\n            Stops study after the given number of seconds. Default is 1.\n        max_total_time_per_trial (float):\n            Repeats measuring the execution time of the routine for the\n            given number of seconds. Default is 0.1.\n\n    Examples\n    --------\n    >>> import cupy\n    >>> from cupyx import optimizing\n    >>>\n    >>> x = cupy.arange(100)\n    >>> with optimizing.optimize():\n    ...     cupy.sum(x)\n    ...\n    array(4950)\n\n    .. note::\n      Optuna (https://optuna.org) installation is required.\n      Currently it works for reduction operations only.\n    \"\"\"\n    if not _optuna_available:\n        raise RuntimeError(\n            'Optuna is required to run optimization. '\n            'See https://optuna.org/ for the installation instructions.')\n\n    old_context = _optimize_config.get_current_context()\n    context = _optimize_config.get_new_context(key, _optimize, config_dict)\n    _optimize_config.set_current_context(context)\n\n    try:\n        yield context\n    finally:\n        _optimize_config.set_current_context(old_context)\n", "path": "cupyx/optimizing/_optimize.py"}]}