|
20 | 20 | # Arnaud Joly, Jacob Schreiber
|
21 | 21 | # License: BSD 3 clause
|
22 | 22 |
|
| 23 | +import math |
23 | 24 | import warnings
|
24 | 25 | from abc import ABCMeta, abstractmethod
|
25 | 26 | from numbers import Integral, Real
|
|
64 | 65 |
|
65 | 66 | def _safe_divide(numerator, denominator):
|
66 | 67 | """Prevents overflow and division by zero."""
|
67 |
| - with np.errstate(divide="raise"): |
68 |
| - try: |
69 |
| - return numerator / denominator |
70 |
| - except FloatingPointError: |
71 |
| - return 0.0 |
| 68 | + try: |
| 69 | + # Cast to Python float to trigger a ZeroDivisionError without relying |
| 70 | + # on `np.errstate` that is not supported by Pyodide. |
| 71 | + result = float(numerator) / float(denominator) |
| 72 | + if math.isinf(result): |
| 73 | + warnings.warn("overflow encountered in _safe_divide", RuntimeWarning) |
| 74 | + return result |
| 75 | + except ZeroDivisionError: |
| 76 | + warnings.warn("divide by zero encountered in _safe_divide", RuntimeWarning) |
| 77 | + return 0.0 |
72 | 78 |
|
73 | 79 |
|
74 | 80 | def _init_raw_predictions(X, estimator, loss, use_predict_proba):
|
@@ -235,7 +241,9 @@ def compute_update(y_, indices, neg_gradient, raw_prediction, k):
|
235 | 241 |
|
236 | 242 | # update each leaf (= perform line search)
|
237 | 243 | for leaf in np.nonzero(tree.children_left == TREE_LEAF)[0]:
|
238 |
| - indices = np.nonzero(terminal_regions == leaf)[0] # of terminal regions |
| 244 | + indices = np.nonzero(masked_terminal_regions == leaf)[ |
| 245 | + 0 |
| 246 | + ] # of terminal regions |
239 | 247 | y_ = y.take(indices, axis=0)
|
240 | 248 | sw = None if sample_weight is None else sample_weight[indices]
|
241 | 249 | update = compute_update(y_, indices, neg_gradient, raw_prediction, k)
|
|
0 commit comments