ElasticNetCV alpha_grid does not take positive constraint into account

### Describe the bug

`ElasticNetCV` internally computes `alpha_max` that is just big enough to push all coef to 0.

The existing code (in `_alpha_grid()`) does not take `positive` as an input, and is only correct when `positive=False`.

As a result, `ElasticNetCV(positive=True)` may use the wrong `alpha_max` to define the `alphas_` search grid. Sometimes all the alphas in the search grid will push all coef to 0 💥

This is an easy fix. I'll try to submit a PR...

### Steps/Code to Reproduce

```python
import numpy as np
from sklearn.linear_model import ElasticNetCV, ElasticNet

X = np.array([[1, 1], [1, -1]])
beta = np.array([1, -1e3])
y = X @ beta

config = dict(fit_intercept=False, positive=True)

alpha_grid = ElasticNetCV(cv=2, **config).fit(X, y).alphas_

alpha_max = alpha_grid[0]
alpha_min = alpha_grid[-1]
print(f"{alpha_max=}, {alpha_min=}")

assert ElasticNet(alpha=alpha_max, **config).fit(X, y).coef_.max() == 0  # OK
assert ElasticNet(alpha=alpha_min, **config).fit(X, y).coef_.max() > 0, f"{alpha_min=} still gives all zero coef"
```

### Expected Results

```python
alpha_max=np.float64(2.0), alpha_min=np.float64(0.002)
```

### Actual Results

```python
alpha_max=np.float64(2000.0), alpha_min=np.float64(2.0)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[1], line 17
     14 print(f"{alpha_max=}, {alpha_min=}")
     16 assert ElasticNet(alpha=alpha_max, **config).fit(X, y).coef_.max() == 0  # OK
---> 17 assert ElasticNet(alpha=alpha_min, **config).fit(X, y).coef_.max() > 0, f"{alpha_min=} still gives all zero coef"

AssertionError: alpha_min=np.float64(2.0) still gives all zero coef
```

### Versions

```shell
System:
    python: 3.12.11 | packaged by conda-forge | (main, Jun  4 2025, 14:45:31) [GCC 13.3.0]
executable: /home/jli/miniforge3/envs/torch/bin/python3
   machine: Linux-6.6.87.2-microsoft-standard-WSL2-x86_64-with-glibc2.39

Python dependencies:
      sklearn: 1.7.2
          pip: 25.1.1
   setuptools: 80.9.0
        numpy: 2.3.5
        scipy: 1.16.3
       Cython: None
       pandas: 2.3.0
   matplotlib: 3.10.3
       joblib: 1.5.2
threadpoolctl: 3.6.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libscipy_openblas
       filepath: /home/jli/miniforge3/envs/torch/lib/python3.12/site-packages/numpy.libs/libscipy_openblas64_-fdde5778.so
        version: 0.3.30
threading_layer: pthreads
   architecture: Haswell

       user_api: blas
   internal_api: openblas
    num_threads: 12
         prefix: libscipy_openblas
       filepath: /home/jli/miniforge3/envs/torch/lib/python3.12/site-packages/scipy.libs/libscipy_openblas-b75cc656.so
        version: 0.3.29.dev
threading_layer: pthreads
   architecture: Haswell

       user_api: openmp
   internal_api: openmp
    num_threads: 12
         prefix: libgomp
       filepath: /home/jli/miniforge3/envs/torch/lib/python3.12/site-packages/scikit_learn.libs/libgomp-a34b3233.so.1.0.0
        version: None
```

COMMENT:
My understanding is that the subgradient definition is for the (effective) domain of a function f, without the constraint that the domain is an open set. I understand that [Wikipedia](https://en.wikipedia.org/wiki/Subderivative) limits the definition to an open interval, but it quotes Rockafellar for the definition, so I'll grab the definition from Rockafellar's Variational Analysis book: https://sites.math.washington.edu/~rtr/papers/rtr169-VarAnalysis-RockWets.pdf

<details>

<summary> Definition 8.3 </summary>


<img width="1166" height="1418" alt="Image" src="https://github.com/user-attachments/assets/33528b83-e8c2-4a62-9867-7d9a00a76380" />

</details>

<details>

<summary> R-bar notation (extended real line) explained in Chapter 1 </summary>

<img width="1178" height="402" alt="Image" src="https://github.com/user-attachments/assets/313fe989-7492-476d-9ada-e2614c44b341" />

</details>

<details>

<summary> Constraints and effective domain introduced in Chapter 1.A </summary>

<img width="1148" height="670" alt="Image" src="https://github.com/user-attachments/assets/d34725cf-28ac-4ddd-9b88-cc21b207b1a8" />

</details>

In this case, we can construct `f(x) = +inf if x < 0 else abs(x)` to encode the constraint `x >= 0`.
- This is an appropriate choice because the objective is to minimize the ElasticNet loss.
- The effective domain of `f(x)` is `[0, +inf)`
- I think the subgradient of `f(x)` at `x=0` is `(-inf, 1]` by Rockafellar's definition, but please correct me if I'm wrong.

Labels: Bug, module:linear_model