prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  remove ari return value from AutoGMM.fit_predict
  Doesn't match with API well, should just get rid of this
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `graspy/cluster/base.py`
  Content:
  ```
  1 # Copyright 2019 NeuroData (http://neurodata.io)
  2 #
  3 # Licensed under the Apache License, Version 2.0 (the "License");
  4 # you may not use this file except in compliance with the License.
  5 # You may obtain a copy of the License at
  6 #
  7 #     http://www.apache.org/licenses/LICENSE-2.0
  8 #
  9 # Unless required by applicable law or agreed to in writing, software
  10 # distributed under the License is distributed on an "AS IS" BASIS,
  11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12 # See the License for the specific language governing permissions and
  13 # limitations under the License.
  14 
  15 from abc import ABC, abstractmethod
  16 
  17 from sklearn.base import BaseEstimator, ClusterMixin
  18 from sklearn.metrics import adjusted_rand_score
  19 from sklearn.utils.validation import check_is_fitted
  20 
  21 
  22 class BaseCluster(ABC, BaseEstimator, ClusterMixin):
  23     """
  24     Base clustering class.
  25     """
  26 
  27     @abstractmethod
  28     def fit(self, X, y=None):
  29         """
  30         Compute clusters based on given method.
  31 
  32         Parameters
  33         ----------
  34         X : array-like, shape (n_samples, n_features)
  35             List of n_features-dimensional data points. Each row
  36             corresponds to a single data point.
  37 
  38         y : array-like, shape (n_samples,), optional (default=None)
  39             List of labels for X if available. Used to compute
  40             ARI scores.
  41 
  42         Returns
  43         -------
  44         self
  45         """
  46 
  47     def predict(self, X, y=None):  # pragma: no cover
  48         """
  49         Predict clusters based on best model.
  50 
  51         Parameters
  52         ----------
  53         X : array-like, shape (n_samples, n_features)
  54             List of n_features-dimensional data points. Each row
  55             corresponds to a single data point.
  56         y : array-like, shape (n_samples, ), optional (default=None)
  57             List of labels for X if available. Used to compute
  58             ARI scores.
  59 
  60         Returns
  61         -------
  62         labels : array, shape (n_samples,)
  63             Component labels.
  64 
  65         ari : float
  66             Adjusted Rand index. Only returned if y is given.
  67         """
  68         # Check if fit is already called
  69         check_is_fitted(self, ["model_"], all_or_any=all)
  70         labels = self.model_.predict(X)
  71 
  72         if y is None:
  73             return labels
  74         else:
  75             ari = adjusted_rand_score(y, labels)
  76             return labels, ari
  77 
  78     def fit_predict(self, X, y=None):  # pragma: no cover
  79         """
  80         Fit the models and predict clusters based on best model.
  81 
  82         Parameters
  83         ----------
  84         X : array-like, shape (n_samples, n_features)
  85             List of n_features-dimensional data points. Each row
  86             corresponds to a single data point.
  87 
  88         y : array-like, shape (n_samples,), optional (default=None)
  89             List of labels for X if available. Used to compute
  90             ARI scores.
  91 
  92         Returns
  93         -------
  94         labels : array, shape (n_samples,)
  95             Component labels.
  96 
  97         ari : float
  98             Adjusted Rand index. Only returned if y is given.
  99         """
  100         self.fit(X, y)
  101 
  102         if y is None:
  103             labels = self.predict(X, y)
  104             return labels
  105         else:
  106             labels, ari = self.predict(X, y)
  107             return labels, ari
  108
  ```
  --- 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/graspy/cluster/base.py b/graspy/cluster/base.py
  --- a/graspy/cluster/base.py
  +++ b/graspy/cluster/base.py
  @@ -61,19 +61,12 @@
           -------
           labels : array, shape (n_samples,)
               Component labels.
  -
  -        ari : float
  -            Adjusted Rand index. Only returned if y is given.
           """
           # Check if fit is already called
           check_is_fitted(self, ["model_"], all_or_any=all)
           labels = self.model_.predict(X)
   
  -        if y is None:
  -            return labels
  -        else:
  -            ari = adjusted_rand_score(y, labels)
  -            return labels, ari
  +        return labels
   
       def fit_predict(self, X, y=None):  # pragma: no cover
           """
  @@ -93,15 +86,8 @@
           -------
           labels : array, shape (n_samples,)
               Component labels.
  -
  -        ari : float
  -            Adjusted Rand index. Only returned if y is given.
           """
           self.fit(X, y)
   
  -        if y is None:
  -            labels = self.predict(X, y)
  -            return labels
  -        else:
  -            labels, ari = self.predict(X, y)
  -            return labels, ari
  +        labels = self.predict(X, y)
  +        return labels
  
verification_info: {"golden_diff": "diff --git a/graspy/cluster/base.py b/graspy/cluster/base.py\n--- a/graspy/cluster/base.py\n+++ b/graspy/cluster/base.py\n@@ -61,19 +61,12 @@\n         -------\n         labels : array, shape (n_samples,)\n             Component labels.\n-\n-        ari : float\n-            Adjusted Rand index. Only returned if y is given.\n         \"\"\"\n         # Check if fit is already called\n         check_is_fitted(self, [\"model_\"], all_or_any=all)\n         labels = self.model_.predict(X)\n \n-        if y is None:\n-            return labels\n-        else:\n-            ari = adjusted_rand_score(y, labels)\n-            return labels, ari\n+        return labels\n \n     def fit_predict(self, X, y=None):  # pragma: no cover\n         \"\"\"\n@@ -93,15 +86,8 @@\n         -------\n         labels : array, shape (n_samples,)\n             Component labels.\n-\n-        ari : float\n-            Adjusted Rand index. Only returned if y is given.\n         \"\"\"\n         self.fit(X, y)\n \n-        if y is None:\n-            labels = self.predict(X, y)\n-            return labels\n-        else:\n-            labels, ari = self.predict(X, y)\n-            return labels, ari\n+        labels = self.predict(X, y)\n+        return labels\n", "issue": "remove ari return value from AutoGMM.fit_predict\nDoesn't match with API well, should just get rid of this\n", "before_files": [{"content": "# Copyright 2019 NeuroData (http://neurodata.io)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom abc import ABC, abstractmethod\n\nfrom sklearn.base import BaseEstimator, ClusterMixin\nfrom sklearn.metrics import adjusted_rand_score\nfrom sklearn.utils.validation import check_is_fitted\n\n\nclass BaseCluster(ABC, BaseEstimator, ClusterMixin):\n    \"\"\"\n    Base clustering class.\n    \"\"\"\n\n    @abstractmethod\n    def fit(self, X, y=None):\n        \"\"\"\n        Compute clusters based on given method.\n\n        Parameters\n        ----------\n        X : array-like, shape (n_samples, n_features)\n            List of n_features-dimensional data points. Each row\n            corresponds to a single data point.\n\n        y : array-like, shape (n_samples,), optional (default=None)\n            List of labels for X if available. Used to compute\n            ARI scores.\n\n        Returns\n        -------\n        self\n        \"\"\"\n\n    def predict(self, X, y=None):  # pragma: no cover\n        \"\"\"\n        Predict clusters based on best model.\n\n        Parameters\n        ----------\n        X : array-like, shape (n_samples, n_features)\n            List of n_features-dimensional data points. Each row\n            corresponds to a single data point.\n        y : array-like, shape (n_samples, ), optional (default=None)\n            List of labels for X if available. Used to compute\n            ARI scores.\n\n        Returns\n        -------\n        labels : array, shape (n_samples,)\n            Component labels.\n\n        ari : float\n            Adjusted Rand index. Only returned if y is given.\n        \"\"\"\n        # Check if fit is already called\n        check_is_fitted(self, [\"model_\"], all_or_any=all)\n        labels = self.model_.predict(X)\n\n        if y is None:\n            return labels\n        else:\n            ari = adjusted_rand_score(y, labels)\n            return labels, ari\n\n    def fit_predict(self, X, y=None):  # pragma: no cover\n        \"\"\"\n        Fit the models and predict clusters based on best model.\n\n        Parameters\n        ----------\n        X : array-like, shape (n_samples, n_features)\n            List of n_features-dimensional data points. Each row\n            corresponds to a single data point.\n\n        y : array-like, shape (n_samples,), optional (default=None)\n            List of labels for X if available. Used to compute\n            ARI scores.\n\n        Returns\n        -------\n        labels : array, shape (n_samples,)\n            Component labels.\n\n        ari : float\n            Adjusted Rand index. Only returned if y is given.\n        \"\"\"\n        self.fit(X, y)\n\n        if y is None:\n            labels = self.predict(X, y)\n            return labels\n        else:\n            labels, ari = self.predict(X, y)\n            return labels, ari\n", "path": "graspy/cluster/base.py"}], "after_files": [{"content": "# Copyright 2019 NeuroData (http://neurodata.io)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom abc import ABC, abstractmethod\n\nfrom sklearn.base import BaseEstimator, ClusterMixin\nfrom sklearn.metrics import adjusted_rand_score\nfrom sklearn.utils.validation import check_is_fitted\n\n\nclass BaseCluster(ABC, BaseEstimator, ClusterMixin):\n    \"\"\"\n    Base clustering class.\n    \"\"\"\n\n    @abstractmethod\n    def fit(self, X, y=None):\n        \"\"\"\n        Compute clusters based on given method.\n\n        Parameters\n        ----------\n        X : array-like, shape (n_samples, n_features)\n            List of n_features-dimensional data points. Each row\n            corresponds to a single data point.\n\n        y : array-like, shape (n_samples,), optional (default=None)\n            List of labels for X if available. Used to compute\n            ARI scores.\n\n        Returns\n        -------\n        self\n        \"\"\"\n\n    def predict(self, X, y=None):  # pragma: no cover\n        \"\"\"\n        Predict clusters based on best model.\n\n        Parameters\n        ----------\n        X : array-like, shape (n_samples, n_features)\n            List of n_features-dimensional data points. Each row\n            corresponds to a single data point.\n        y : array-like, shape (n_samples, ), optional (default=None)\n            List of labels for X if available. Used to compute\n            ARI scores.\n\n        Returns\n        -------\n        labels : array, shape (n_samples,)\n            Component labels.\n        \"\"\"\n        # Check if fit is already called\n        check_is_fitted(self, [\"model_\"], all_or_any=all)\n        labels = self.model_.predict(X)\n\n        return labels\n\n    def fit_predict(self, X, y=None):  # pragma: no cover\n        \"\"\"\n        Fit the models and predict clusters based on best model.\n\n        Parameters\n        ----------\n        X : array-like, shape (n_samples, n_features)\n            List of n_features-dimensional data points. Each row\n            corresponds to a single data point.\n\n        y : array-like, shape (n_samples,), optional (default=None)\n            List of labels for X if available. Used to compute\n            ARI scores.\n\n        Returns\n        -------\n        labels : array, shape (n_samples,)\n            Component labels.\n        \"\"\"\n        self.fit(X, y)\n\n        labels = self.predict(X, y)\n        return labels\n", "path": "graspy/cluster/base.py"}]}