pytorch-optimizer 2.11.1__tar.gz → 2.11.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/PKG-INFO +14 -14
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/README.rst +11 -11
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pyproject.toml +6 -7
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/__init__.py +2 -1
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adabelief.py +1 -1
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/dadapt.py +129 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/fp16.py +1 -1
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/lomo.py +1 -1
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/lookahead.py +15 -3
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/rotograd.py +2 -2
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/LICENSE +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/base/optimizer.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/base/types.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/__init__.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/a2grad.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/apollo.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/gc.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/gsam.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/utils.py +0 -0
- {pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/yogi.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
|
-
Name:
|
|
3
|
-
Version: 2.11.
|
|
2
|
+
Name: pytorch_optimizer
|
|
3
|
+
Version: 2.11.2
|
|
4
4
|
Summary: optimizer & lr scheduler & objective function collections in PyTorch
|
|
5
5
|
Home-page: https://github.com/kozistr/pytorch_optimizer
|
|
6
6
|
License: Apache-2.0
|
|
7
|
-
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,AdamP,AdamS,Adan,AggMo,AliG,Amos,Apollo,AvaGrad,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DiffGrad,Fromage,Gravity,GSAM,LARS,Lamb,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SopihaH,SRMM,SWATS,Tiger,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge
|
|
7
|
+
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,AdamP,AdamS,Adan,AggMo,AliG,Amos,Apollo,AvaGrad,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,Fromage,Gravity,GSAM,LARS,Lamb,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SopihaH,SRMM,SWATS,Tiger,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge
|
|
8
8
|
Author: kozistr
|
|
9
9
|
Author-email: kozistr@gmail.com
|
|
10
10
|
Maintainer: kozistr
|
|
@@ -54,7 +54,7 @@ pytorch-optimizer
|
|
|
54
54
|
|
|
55
55
|
| **pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
|
|
56
56
|
| I just re-implemented (speed & memory tweaks, plug-ins) the algorithm while based on the original paper. Also, It includes useful and practical optimization ideas.
|
|
57
|
-
| Currently,
|
|
57
|
+
| Currently, **60 optimizers**, **10 lr schedulers**, and **13 loss functions** are supported!
|
|
58
58
|
|
|
|
59
59
|
| Highly inspired by `pytorch-optimizer <https://github.com/jettify/pytorch-optimizer>`__.
|
|
60
60
|
|
|
@@ -69,20 +69,20 @@ So, please double-check the license before using it at your work.
|
|
|
69
69
|
Installation
|
|
70
70
|
~~~~~~~~~~~~
|
|
71
71
|
|
|
72
|
-
::
|
|
72
|
+
.. code-block:: bash
|
|
73
73
|
|
|
74
74
|
$ pip3 install -U pytorch-optimizer
|
|
75
75
|
|
|
76
76
|
If there's a version issue when installing the package, try with `--no-deps` option.
|
|
77
77
|
|
|
78
|
-
::
|
|
78
|
+
.. code-block:: bash
|
|
79
79
|
|
|
80
80
|
$ pip3 install -U --no-deps pytorch-optimizer
|
|
81
81
|
|
|
82
82
|
Simple Usage
|
|
83
83
|
~~~~~~~~~~~~
|
|
84
84
|
|
|
85
|
-
::
|
|
85
|
+
.. code-block:: python
|
|
86
86
|
|
|
87
87
|
from pytorch_optimizer import AdamP
|
|
88
88
|
|
|
@@ -99,7 +99,7 @@ Simple Usage
|
|
|
99
99
|
|
|
100
100
|
Also, you can load the optimizer via `torch.hub`
|
|
101
101
|
|
|
102
|
-
::
|
|
102
|
+
.. code-block:: python
|
|
103
103
|
|
|
104
104
|
import torch
|
|
105
105
|
|
|
@@ -109,7 +109,7 @@ Also, you can load the optimizer via `torch.hub`
|
|
|
109
109
|
|
|
110
110
|
If you want to build the optimizer with parameters & configs, there's `create_optimizer()` API.
|
|
111
111
|
|
|
112
|
-
::
|
|
112
|
+
.. code-block:: python
|
|
113
113
|
|
|
114
114
|
from pytorch_optimizer import create_optimizer
|
|
115
115
|
|
|
@@ -127,7 +127,7 @@ Supported Optimizers
|
|
|
127
127
|
|
|
128
128
|
You can check the supported optimizers with below code.
|
|
129
129
|
|
|
130
|
-
::
|
|
130
|
+
.. code-block:: python
|
|
131
131
|
|
|
132
132
|
from pytorch_optimizer import get_supported_optimizers
|
|
133
133
|
|
|
@@ -268,7 +268,7 @@ Supported LR Scheduler
|
|
|
268
268
|
|
|
269
269
|
You can check the supported learning rate schedulers with below code.
|
|
270
270
|
|
|
271
|
-
::
|
|
271
|
+
.. code-block:: python
|
|
272
272
|
|
|
273
273
|
from pytorch_optimizer import get_supported_lr_schedulers
|
|
274
274
|
|
|
@@ -287,7 +287,7 @@ Supported Loss Function
|
|
|
287
287
|
|
|
288
288
|
You can check the supported loss functions with below code.
|
|
289
289
|
|
|
290
|
-
::
|
|
290
|
+
.. code-block:: python
|
|
291
291
|
|
|
292
292
|
from pytorch_optimizer import get_supported_loss_functions
|
|
293
293
|
|
|
@@ -471,9 +471,9 @@ Hyeongchan Kim / `@kozistr <http://kozistr.tech/about>`__
|
|
|
471
471
|
:target: https://pytorch-optimizers.readthedocs.io/en/latest/?badge=latest
|
|
472
472
|
.. |PyPI version| image:: https://badge.fury.io/py/pytorch-optimizer.svg
|
|
473
473
|
:target: https://badge.fury.io/py/pytorch-optimizer
|
|
474
|
-
.. |PyPi download| image:: https://pepy.tech/badge/pytorch-optimizer
|
|
474
|
+
.. |PyPi download| image:: https://static.pepy.tech/badge/pytorch-optimizer
|
|
475
475
|
:target: https://pepy.tech/project/pytorch-optimizer
|
|
476
|
-
.. |PyPi month download| image:: https://pepy.tech/badge/pytorch-optimizer/month
|
|
476
|
+
.. |PyPi month download| image:: https://static.pepy.tech/badge/pytorch-optimizer/month
|
|
477
477
|
:target: https://pepy.tech/project/pytorch-optimizer
|
|
478
478
|
.. |PyPI pyversions| image:: https://img.shields.io/pypi/pyversions/pytorch-optimizer.svg
|
|
479
479
|
:target: https://pypi.python.org/pypi/pytorch-optimizer/
|
|
@@ -16,7 +16,7 @@ pytorch-optimizer
|
|
|
16
16
|
|
|
17
17
|
| **pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
|
|
18
18
|
| I just re-implemented (speed & memory tweaks, plug-ins) the algorithm while based on the original paper. Also, It includes useful and practical optimization ideas.
|
|
19
|
-
| Currently,
|
|
19
|
+
| Currently, **60 optimizers**, **10 lr schedulers**, and **13 loss functions** are supported!
|
|
20
20
|
|
|
|
21
21
|
| Highly inspired by `pytorch-optimizer <https://github.com/jettify/pytorch-optimizer>`__.
|
|
22
22
|
|
|
@@ -31,20 +31,20 @@ So, please double-check the license before using it at your work.
|
|
|
31
31
|
Installation
|
|
32
32
|
~~~~~~~~~~~~
|
|
33
33
|
|
|
34
|
-
::
|
|
34
|
+
.. code-block:: bash
|
|
35
35
|
|
|
36
36
|
$ pip3 install -U pytorch-optimizer
|
|
37
37
|
|
|
38
38
|
If there's a version issue when installing the package, try with `--no-deps` option.
|
|
39
39
|
|
|
40
|
-
::
|
|
40
|
+
.. code-block:: bash
|
|
41
41
|
|
|
42
42
|
$ pip3 install -U --no-deps pytorch-optimizer
|
|
43
43
|
|
|
44
44
|
Simple Usage
|
|
45
45
|
~~~~~~~~~~~~
|
|
46
46
|
|
|
47
|
-
::
|
|
47
|
+
.. code-block:: python
|
|
48
48
|
|
|
49
49
|
from pytorch_optimizer import AdamP
|
|
50
50
|
|
|
@@ -61,7 +61,7 @@ Simple Usage
|
|
|
61
61
|
|
|
62
62
|
Also, you can load the optimizer via `torch.hub`
|
|
63
63
|
|
|
64
|
-
::
|
|
64
|
+
.. code-block:: python
|
|
65
65
|
|
|
66
66
|
import torch
|
|
67
67
|
|
|
@@ -71,7 +71,7 @@ Also, you can load the optimizer via `torch.hub`
|
|
|
71
71
|
|
|
72
72
|
If you want to build the optimizer with parameters & configs, there's `create_optimizer()` API.
|
|
73
73
|
|
|
74
|
-
::
|
|
74
|
+
.. code-block:: python
|
|
75
75
|
|
|
76
76
|
from pytorch_optimizer import create_optimizer
|
|
77
77
|
|
|
@@ -89,7 +89,7 @@ Supported Optimizers
|
|
|
89
89
|
|
|
90
90
|
You can check the supported optimizers with below code.
|
|
91
91
|
|
|
92
|
-
::
|
|
92
|
+
.. code-block:: python
|
|
93
93
|
|
|
94
94
|
from pytorch_optimizer import get_supported_optimizers
|
|
95
95
|
|
|
@@ -230,7 +230,7 @@ Supported LR Scheduler
|
|
|
230
230
|
|
|
231
231
|
You can check the supported learning rate schedulers with below code.
|
|
232
232
|
|
|
233
|
-
::
|
|
233
|
+
.. code-block:: python
|
|
234
234
|
|
|
235
235
|
from pytorch_optimizer import get_supported_lr_schedulers
|
|
236
236
|
|
|
@@ -249,7 +249,7 @@ Supported Loss Function
|
|
|
249
249
|
|
|
250
250
|
You can check the supported loss functions with below code.
|
|
251
251
|
|
|
252
|
-
::
|
|
252
|
+
.. code-block:: python
|
|
253
253
|
|
|
254
254
|
from pytorch_optimizer import get_supported_loss_functions
|
|
255
255
|
|
|
@@ -433,9 +433,9 @@ Hyeongchan Kim / `@kozistr <http://kozistr.tech/about>`__
|
|
|
433
433
|
:target: https://pytorch-optimizers.readthedocs.io/en/latest/?badge=latest
|
|
434
434
|
.. |PyPI version| image:: https://badge.fury.io/py/pytorch-optimizer.svg
|
|
435
435
|
:target: https://badge.fury.io/py/pytorch-optimizer
|
|
436
|
-
.. |PyPi download| image:: https://pepy.tech/badge/pytorch-optimizer
|
|
436
|
+
.. |PyPi download| image:: https://static.pepy.tech/badge/pytorch-optimizer
|
|
437
437
|
:target: https://pepy.tech/project/pytorch-optimizer
|
|
438
|
-
.. |PyPi month download| image:: https://pepy.tech/badge/pytorch-optimizer/month
|
|
438
|
+
.. |PyPi month download| image:: https://static.pepy.tech/badge/pytorch-optimizer/month
|
|
439
439
|
:target: https://pepy.tech/project/pytorch-optimizer
|
|
440
440
|
.. |PyPI pyversions| image:: https://img.shields.io/pypi/pyversions/pytorch-optimizer.svg
|
|
441
441
|
:target: https://pypi.python.org/pypi/pytorch-optimizer/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "2.11.
|
|
3
|
+
version = "2.11.2"
|
|
4
4
|
description = "optimizer & lr scheduler & objective function collections in PyTorch"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
authors = ["kozistr <kozistr@gmail.com>"]
|
|
@@ -13,10 +13,10 @@ keywords = [
|
|
|
13
13
|
"pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "ASGD", "AccSGD", "AdaBelief", "AdaBound",
|
|
14
14
|
"AdaDelta", "AdaFactor", "AdaMax", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdaHessian", "Adai", "AdamP",
|
|
15
15
|
"AdamS", "Adan", "AggMo", "AliG", "Amos", "Apollo", "AvaGrad", "CAME", "DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan",
|
|
16
|
-
"DAdaptSGD", "DiffGrad", "Fromage", "Gravity", "GSAM", "LARS", "Lamb", "Lion", "LOMO", "Lookahead",
|
|
17
|
-
"MSVAG", "Nero", "NovoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam",
|
|
18
|
-
"Ranger21", "RotoGrad", "SAM", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SopihaH",
|
|
19
|
-
"SWATS", "Tiger", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard",
|
|
16
|
+
"DAdaptSGD", "DAdaptLion", "DiffGrad", "Fromage", "Gravity", "GSAM", "LARS", "Lamb", "Lion", "LOMO", "Lookahead",
|
|
17
|
+
"MADGRAD", "MSVAG", "Nero", "NovoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam",
|
|
18
|
+
"Ranger", "Ranger21", "RotoGrad", "SAM", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SopihaH",
|
|
19
|
+
"SRMM", "SWATS", "Tiger", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard",
|
|
20
20
|
"Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge",
|
|
21
21
|
]
|
|
22
22
|
classifiers = [
|
|
@@ -60,7 +60,7 @@ black = [
|
|
|
60
60
|
{ version = "==23.3.0", python = ">=3.7,<3.8" },
|
|
61
61
|
{ version = "^23.7.0", python = ">=3.8"}
|
|
62
62
|
]
|
|
63
|
-
ruff = "^0.0.
|
|
63
|
+
ruff = "^0.0.286"
|
|
64
64
|
pytest = "^7.4.0"
|
|
65
65
|
pytest-cov = "^4.1.0"
|
|
66
66
|
|
|
@@ -122,7 +122,6 @@ testpaths = "tests"
|
|
|
122
122
|
[tool.coverage.run]
|
|
123
123
|
omit = [
|
|
124
124
|
"./pytorch_optimizer/optimizer/gsam.py",
|
|
125
|
-
"./pytorch_optimizer/optimizer/fp16.py",
|
|
126
125
|
"./pytorch_optimizer/optimizer/rotograd.py",
|
|
127
126
|
]
|
|
128
127
|
|
|
@@ -48,7 +48,7 @@ from pytorch_optimizer.optimizer.amos import Amos
|
|
|
48
48
|
from pytorch_optimizer.optimizer.apollo import Apollo
|
|
49
49
|
from pytorch_optimizer.optimizer.avagrad import AvaGrad
|
|
50
50
|
from pytorch_optimizer.optimizer.came import CAME
|
|
51
|
-
from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptSGD
|
|
51
|
+
from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptLion, DAdaptSGD
|
|
52
52
|
from pytorch_optimizer.optimizer.diffgrad import DiffGrad
|
|
53
53
|
from pytorch_optimizer.optimizer.fp16 import DynamicLossScaler, SafeFP16Optimizer
|
|
54
54
|
from pytorch_optimizer.optimizer.fromage import Fromage
|
|
@@ -171,6 +171,7 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
171
171
|
LOMO,
|
|
172
172
|
Tiger,
|
|
173
173
|
CAME,
|
|
174
|
+
DAdaptLion,
|
|
174
175
|
]
|
|
175
176
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
176
177
|
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adabelief.py
RENAMED
|
@@ -35,7 +35,7 @@ class AdaBelief(Optimizer, BaseOptimizer):
|
|
|
35
35
|
weight_decay: float = 0.0,
|
|
36
36
|
weight_decouple: bool = True,
|
|
37
37
|
fixed_decay: bool = False,
|
|
38
|
-
rectify: bool =
|
|
38
|
+
rectify: bool = False,
|
|
39
39
|
n_sma_threshold: int = 5,
|
|
40
40
|
degenerated_to_sgd: bool = True,
|
|
41
41
|
ams_bound: bool = False,
|
|
@@ -699,3 +699,132 @@ class DAdaptAdan(Optimizer, BaseOptimizer):
|
|
|
699
699
|
group['k'] += 1
|
|
700
700
|
|
|
701
701
|
return loss
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
class DAdaptLion(Optimizer, BaseOptimizer):
|
|
705
|
+
r"""Lion with D-Adaptation. Leave LR set to 1 unless you encounter instability. This implementation is based on V3.
|
|
706
|
+
|
|
707
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
708
|
+
:param lr: float. learning rate.
|
|
709
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
710
|
+
:param d0: float. initial D estimate for D-adaptation (default 1e-6). Rarely needs changing.
|
|
711
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
712
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
713
|
+
:param fixed_decay: bool. fix weight decay.
|
|
714
|
+
"""
|
|
715
|
+
|
|
716
|
+
def __init__(
|
|
717
|
+
self,
|
|
718
|
+
params: PARAMETERS,
|
|
719
|
+
lr: float = 1.0,
|
|
720
|
+
betas: BETAS = (0.9, 0.999),
|
|
721
|
+
d0: float = 1e-6,
|
|
722
|
+
weight_decay: float = 0.0,
|
|
723
|
+
weight_decouple: bool = False,
|
|
724
|
+
fixed_decay: bool = False,
|
|
725
|
+
):
|
|
726
|
+
self.validate_learning_rate(lr)
|
|
727
|
+
self.validate_betas(betas)
|
|
728
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
729
|
+
|
|
730
|
+
defaults: DEFAULTS = {
|
|
731
|
+
'lr': lr,
|
|
732
|
+
'betas': betas,
|
|
733
|
+
'd': d0,
|
|
734
|
+
'weight_decay': weight_decay,
|
|
735
|
+
'weight_decouple': weight_decouple,
|
|
736
|
+
'fixed_decay': fixed_decay,
|
|
737
|
+
'step': 0,
|
|
738
|
+
}
|
|
739
|
+
super().__init__(params, defaults)
|
|
740
|
+
|
|
741
|
+
def __str__(self) -> str:
|
|
742
|
+
return 'DAdaptLion'
|
|
743
|
+
|
|
744
|
+
@torch.no_grad()
|
|
745
|
+
def reset(self):
|
|
746
|
+
for group in self.param_groups:
|
|
747
|
+
group['step'] = 0
|
|
748
|
+
for p in group['params']:
|
|
749
|
+
if p.grad is None:
|
|
750
|
+
continue
|
|
751
|
+
|
|
752
|
+
state = self.state[p]
|
|
753
|
+
|
|
754
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
755
|
+
state['s'] = torch.zeros_like(p)
|
|
756
|
+
|
|
757
|
+
@torch.no_grad()
|
|
758
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
759
|
+
loss: LOSS = None
|
|
760
|
+
if closure is not None:
|
|
761
|
+
with torch.enable_grad():
|
|
762
|
+
loss = closure()
|
|
763
|
+
|
|
764
|
+
group = self.param_groups[0]
|
|
765
|
+
device = group['params'][0].device
|
|
766
|
+
|
|
767
|
+
if 'numerator_weighted' not in group:
|
|
768
|
+
group['numerator_weighted'] = torch.tensor([0.0], device=device)
|
|
769
|
+
numerator_weighted = group['numerator_weighted']
|
|
770
|
+
|
|
771
|
+
sk_l1 = torch.tensor([0.0], device=device)
|
|
772
|
+
numerator_accumulator = torch.tensor([0.0], device=device)
|
|
773
|
+
|
|
774
|
+
beta1, beta2 = group['betas']
|
|
775
|
+
beta2_sq = math.sqrt(beta2)
|
|
776
|
+
|
|
777
|
+
d, lr = group['d'], group['lr']
|
|
778
|
+
d_lr: float = d * lr
|
|
779
|
+
|
|
780
|
+
for group in self.param_groups:
|
|
781
|
+
for p in group['params']:
|
|
782
|
+
if p.grad is None:
|
|
783
|
+
continue
|
|
784
|
+
|
|
785
|
+
grad = p.grad
|
|
786
|
+
if grad.is_sparse:
|
|
787
|
+
raise NoSparseGradientError(str(self))
|
|
788
|
+
|
|
789
|
+
state = self.state[p]
|
|
790
|
+
if len(state) == 0:
|
|
791
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
792
|
+
state['s'] = torch.zeros_like(p)
|
|
793
|
+
|
|
794
|
+
self.apply_weight_decay(
|
|
795
|
+
p=p,
|
|
796
|
+
grad=grad,
|
|
797
|
+
lr=d_lr,
|
|
798
|
+
weight_decay=group['weight_decay'],
|
|
799
|
+
weight_decouple=group['weight_decouple'],
|
|
800
|
+
fixed_decay=group['fixed_decay'],
|
|
801
|
+
)
|
|
802
|
+
|
|
803
|
+
exp_avg, s = state['exp_avg'], state['s']
|
|
804
|
+
|
|
805
|
+
update = exp_avg.clone().mul_(beta1).add_(grad, alpha=1.0 - beta1).sign_()
|
|
806
|
+
p.add_(update, alpha=-d_lr)
|
|
807
|
+
|
|
808
|
+
exp_avg.mul_(beta2).add_(grad, alpha=(1.0 - beta2) * d_lr)
|
|
809
|
+
|
|
810
|
+
numerator_accumulator.add_(torch.dot(update.flatten(), s.flatten()), alpha=d_lr)
|
|
811
|
+
s.mul_(beta2_sq).add_(update, alpha=(1.0 - beta2_sq) * d_lr)
|
|
812
|
+
|
|
813
|
+
sk_l1.add_(s.abs().sum())
|
|
814
|
+
|
|
815
|
+
numerator_weighted.mul_(beta2_sq).add_(numerator_accumulator, alpha=1.0 - beta2_sq)
|
|
816
|
+
|
|
817
|
+
if sk_l1 == 0:
|
|
818
|
+
return loss
|
|
819
|
+
|
|
820
|
+
if lr > 0.0:
|
|
821
|
+
d_hat: float = (numerator_weighted / ((1.0 - beta2_sq) * sk_l1)).item()
|
|
822
|
+
d = max(d, d_hat)
|
|
823
|
+
|
|
824
|
+
for group in self.param_groups:
|
|
825
|
+
group['step'] += 1
|
|
826
|
+
|
|
827
|
+
group['numerator_weighted'] = numerator_weighted
|
|
828
|
+
group['d'] = d
|
|
829
|
+
|
|
830
|
+
return loss
|
|
@@ -46,7 +46,7 @@ class LOMO(BaseOptimizer, Optimizer):
|
|
|
46
46
|
self.grad_norms: List[torch.Tensor] = []
|
|
47
47
|
self.clip_coef: Optional[float] = None
|
|
48
48
|
|
|
49
|
-
p0: torch.Tensor =
|
|
49
|
+
p0: torch.Tensor = next(iter(self.model.parameters()))
|
|
50
50
|
|
|
51
51
|
self.grad_func: Callable[[Any], Any] = (
|
|
52
52
|
self.fuse_update_zero3() if hasattr(p0, 'ds_tensor') else self.fuse_update()
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/lookahead.py
RENAMED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
from collections import defaultdict
|
|
2
|
-
from typing import Dict
|
|
2
|
+
from typing import Callable, Dict
|
|
3
3
|
|
|
4
4
|
import torch
|
|
5
|
+
from torch.optim import Optimizer
|
|
5
6
|
|
|
6
7
|
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
7
|
-
from pytorch_optimizer.base.types import CLOSURE, LOSS, OPTIMIZER, STATE
|
|
8
|
+
from pytorch_optimizer.base.types import CLOSURE, DEFAULTS, LOSS, OPTIMIZER, STATE
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class Lookahead(BaseOptimizer):
|
|
11
|
+
class Lookahead(Optimizer, BaseOptimizer):
|
|
11
12
|
r"""k steps forward, 1 step back.
|
|
12
13
|
|
|
13
14
|
:param optimizer: OPTIMIZER. base optimizer.
|
|
@@ -27,12 +28,16 @@ class Lookahead(BaseOptimizer):
|
|
|
27
28
|
self.validate_range(alpha, 'alpha', 0.0, 1.0)
|
|
28
29
|
self.validate_options(pullback_momentum, 'pullback_momentum', ['none', 'reset', 'pullback'])
|
|
29
30
|
|
|
31
|
+
self._optimizer_step_pre_hooks: Dict[int, Callable] = {}
|
|
32
|
+
self._optimizer_step_post_hooks: Dict[int, Callable] = {}
|
|
33
|
+
|
|
30
34
|
self.alpha = alpha
|
|
31
35
|
self.k = k
|
|
32
36
|
self.pullback_momentum = pullback_momentum
|
|
33
37
|
|
|
34
38
|
self.optimizer = optimizer
|
|
35
39
|
self.param_groups = self.optimizer.param_groups
|
|
40
|
+
|
|
36
41
|
self.state: STATE = defaultdict(dict)
|
|
37
42
|
|
|
38
43
|
for group in self.param_groups:
|
|
@@ -46,6 +51,13 @@ class Lookahead(BaseOptimizer):
|
|
|
46
51
|
if self.pullback_momentum == 'pullback':
|
|
47
52
|
state['slow_momentum'] = torch.zeros_like(p)
|
|
48
53
|
|
|
54
|
+
self.defaults: DEFAULTS = {
|
|
55
|
+
'lookahead_alpha': alpha,
|
|
56
|
+
'lookahead_k': k,
|
|
57
|
+
'lookahead_pullback_momentum': pullback_momentum,
|
|
58
|
+
**optimizer.defaults,
|
|
59
|
+
}
|
|
60
|
+
|
|
49
61
|
def __getstate__(self):
|
|
50
62
|
return {
|
|
51
63
|
'state': self.state,
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/rotograd.py
RENAMED
|
@@ -219,7 +219,7 @@ class RotateOnly(nn.Module):
|
|
|
219
219
|
self.backbone.to(*args, **kwargs)
|
|
220
220
|
for head in self.heads:
|
|
221
221
|
head.to(*args, **kwargs)
|
|
222
|
-
return super(
|
|
222
|
+
return super().to(*args, **kwargs)
|
|
223
223
|
|
|
224
224
|
def train(self, mode: bool = True) -> nn.Module:
|
|
225
225
|
super().train(mode)
|
|
@@ -284,7 +284,7 @@ class RotateOnly(nn.Module):
|
|
|
284
284
|
if not self.training:
|
|
285
285
|
raise AssertionError('Backward should only be called when training')
|
|
286
286
|
|
|
287
|
-
if self.iteration_counter
|
|
287
|
+
if self.iteration_counter in (0, self.burn_in_period):
|
|
288
288
|
for i, loss in enumerate(losses):
|
|
289
289
|
self.initial_losses[i] = loss.item()
|
|
290
290
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/loss/cross_entropy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/__init__.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/chebyshev.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/lr_scheduler/proportion.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adabound.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adadelta.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adafactor.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adahessian.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adanorm.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adashift.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/adasmooth.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/avagrad.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/diffgrad.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/fromage.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/gravity.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/madgrad.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/novograd.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/prodigy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/ranger21.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/shampoo.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.11.1 → pytorch_optimizer-2.11.2}/pytorch_optimizer/optimizer/shampoo_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|