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()

```

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

{"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"}]}