Compare commits

..

15 Commits

Author SHA1 Message Date
cf4c8a090a convert pt model to onnx 2026-06-18 16:20:14 +08:00
9c46e1c345 fix file_lazy_load 2026-06-18 13:51:36 +08:00
c5d39c8e16 log learning rate 2026-06-18 11:20:08 +08:00
253d16f84e eval classification model with simple metrics 2026-06-18 11:19:50 +08:00
edb72dcb86 mod installation 2026-06-18 09:38:44 +08:00
26ca347c1d test load_config 2026-06-18 09:37:54 +08:00
649533cb17 mod arg 2026-06-18 09:29:56 +08:00
945b04bb56 apply precommit 2026-06-18 09:27:42 +08:00
2f2db72db1 [exp] init train 2026-06-18 09:16:42 +08:00
53499a163e disable ssl verify 2026-06-17 10:04:21 +08:00
38f81be722 log data 2026-06-16 21:29:53 +08:00
42d12922ee implement a sample data preparation 2026-06-16 21:26:26 +08:00
7a4e489914 add dvc webdav 2026-06-16 15:50:25 +08:00
269be95562 dvc serve dataset 2026-06-16 15:47:56 +08:00
5698fca7ae serve dataset 2026-06-16 15:46:16 +08:00
43 changed files with 1524 additions and 5 deletions

3
.dvc/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/config.local
/tmp
/cache

5
.dvc/config Normal file
View File

@ -0,0 +1,5 @@
[core]
remote = webdav
['remote "webdav"']
url = webdavs://file.guineapig.love//home/dvc
ssl_verify = false

View File

@ -0,0 +1,3 @@
['remote "webdav"']
user =
password =

5
.dvcignore Normal file
View File

@ -0,0 +1,5 @@
# Add patterns of files dvc should ignore, which could improve
# the performance. Learn more at
# https://dvc.org/doc/user-guide/dvcignore
quickdraw_bot/data/processed

19
.gitignore vendored
View File

@ -7,4 +7,21 @@ wheels/
*.egg-info
# Virtual environments
.venv
.venv
# Dataset
quickdraw_bot/data
# Temp files
quickdraw_bot/tmp
# DVC
dvc/config.local
# .DS_Store
.DS_Store
# Models
*.pth
*.onnx
*.onnx.data

33
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,33 @@
default_language_version:
python: python3.13
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-added-large-files
args: ["--maxkb=512"]
- id: check-yaml
- id: check-toml
- id: check-docstring-first
- repo: local
hooks:
- id: ruff-format
name: ruff format
entry: uv run ruff format .
language: system
types: [python]
- id: ruff-check
name: ruff check
entry: uv run ruff check --fix .
language: system
types: [python]
- id: pytest
name: pytest
entry: uv run pytest tests/ -vs
language: system
pass_filenames: false
stages: [pre-push]

View File

@ -18,4 +18,6 @@
## Installation
```bash
uv sync --all-groups
uv run pre-commit install
uv run pre-commit install --hook-type pre-push
```

View File

@ -11,7 +11,9 @@ dependencies = [
"torchvision~=0.27.0",
"torchmetrics~=1.9.0",
"dvc~=3.67.1",
"dvclive~=3.49.1"
"dvclive~=3.49.1",
"dvc-webdav~=3.0.1",
"matplotlib~=3.11.0",
]
[dependency-groups]
@ -23,7 +25,8 @@ dev = [
deploy = [
"onnx~=1.22.0",
"onnxruntime~=1.27.0",
"openvino~=2026.2.0"
"onnxscript~=0.7.0",
"openvino~=2026.2.0",
]
[tool.ruff]
@ -34,4 +37,15 @@ target-version = "py313"
select = ["E", "F", "I"]
[tool.ruff.format]
quote-style = "single"
quote-style = 'single'
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["."]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["quickdraw_bot"]

1
quickdraw_bot/assets/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/model.pth

View File

@ -0,0 +1,29 @@
prepare:
data_dir: ./data
num_of_img_per_class: 10000
data_split:
train: 0.8
valid: 0.1
test: 0.1
random_seed: 1
train:
device_type: mps
train_data_dir: ./data/processed/train
valid_data_dir: ./data/processed/valid
batch_size: 256
num_of_class: 20
optimizer_name: sgd # sgd, adam
learning_rate: 0.001
warmup_epochs: 5
num_of_epochs: 30
file_lazy_load: false
random_seed: 1
exp_msg: init train
eval:
test_data_dir: ./data/processed/test
model_path: ./assets/model.pth
to_onnx:
model_path: ./assets/model.pth
image_size: [28, 28]
cls_map_path: ./data/processed/cate_id_cate_name_map.json
onnx_path: ./assets/model.onnx

View File

@ -0,0 +1,9 @@
metrics:
- ../doc/exp/train/metrics.json
- ../doc/exp/eval/metrics.json
plots:
- ../doc/exp/train/plots/metrics:
x: step
- ../doc/exp/eval/plots/metrics:
x: step
- ../doc/exp/eval/plots/images

View File

@ -0,0 +1,5 @@
outs:
- md5: 5a641ce9dc5db7b16a4868773eb968dc
size: 1755967
hash: md5
path: model.onnx

View File

@ -0,0 +1,5 @@
outs:
- md5: 263f47ef298fee74aed6acc3a316e7ad
size: 1701245
hash: md5
path: model.pth

6
quickdraw_bot/data.dvc Normal file
View File

@ -0,0 +1,6 @@
outs:
- md5: dd93e82604be92816a10bfb1e709edf2.dir
size: 2306020784
nfiles: 20
hash: md5
path: data

View File

@ -0,0 +1,8 @@
{
"test": {
"accuracy": 0.7296500205993652,
"precision": 0.7283352017402649,
"recall": 0.7292018532752991,
"f1": 0.723344087600708
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

View File

@ -0,0 +1,2 @@
step accuracy
0 0.7296500205993652
1 step accuracy
2 0 0.7296500205993652

View File

@ -0,0 +1,2 @@
step f1
0 0.723344087600708
1 step f1
2 0 0.723344087600708

View File

@ -0,0 +1,2 @@
step precision
0 0.7283352017402649
1 step precision
2 0 0.7283352017402649

View File

@ -0,0 +1,2 @@
step recall
0 0.7292018532752991
1 step recall
2 0 0.7292018532752991

View File

@ -0,0 +1,17 @@
{
"train": {
"loss": 1.992799331665039,
"accuracy": 0.4883750081062317,
"precision": 0.48363304138183594,
"recall": 0.4885570704936981,
"f1": 0.4849509298801422
},
"valid": {
"loss": 1.4377805100211614,
"accuracy": 0.7260000109672546,
"precision": 0.723875880241394,
"recall": 0.7256932258605957,
"f1": 0.7193899154663086
},
"step": 29
}

View File

@ -0,0 +1,31 @@
step accuracy
0 0.04570624977350235
1 0.08645624667406082
2 0.15463125705718994
3 0.20809374749660492
4 0.2542562484741211
5 0.29279375076293945
6 0.3235749900341034
7 0.346756249666214
8 0.363993763923645
9 0.3763374984264374
10 0.3868750035762787
11 0.39285001158714294
12 0.400112509727478
13 0.4029250144958496
14 0.403425008058548
15 0.4108937382698059
16 0.42086875438690186
17 0.43145623803138733
18 0.44205623865127563
19 0.44743749499320984
20 0.45317500829696655
21 0.4583125114440918
22 0.45945000648498535
23 0.4590874910354614
24 0.462799996137619
25 0.46361875534057617
26 0.47360000014305115
27 0.47944375872612
28 0.4831624925136566
29 0.4883750081062317
1 step accuracy
2 0 0.04570624977350235
3 1 0.08645624667406082
4 2 0.15463125705718994
5 3 0.20809374749660492
6 4 0.2542562484741211
7 5 0.29279375076293945
8 6 0.3235749900341034
9 7 0.346756249666214
10 8 0.363993763923645
11 9 0.3763374984264374
12 10 0.3868750035762787
13 11 0.39285001158714294
14 12 0.400112509727478
15 13 0.4029250144958496
16 14 0.403425008058548
17 15 0.4108937382698059
18 16 0.42086875438690186
19 17 0.43145623803138733
20 18 0.44205623865127563
21 19 0.44743749499320984
22 20 0.45317500829696655
23 21 0.4583125114440918
24 22 0.45945000648498535
25 23 0.4590874910354614
26 24 0.462799996137619
27 25 0.46361875534057617
28 26 0.47360000014305115
29 27 0.47944375872612
30 28 0.4831624925136566
31 29 0.4883750081062317

View File

@ -0,0 +1,31 @@
step f1
0 0.03369621932506561
1 0.08265631645917892
2 0.14480535686016083
3 0.1954474151134491
4 0.24400727450847626
5 0.2852896749973297
6 0.3165817856788635
7 0.34051138162612915
8 0.3579234480857849
9 0.3706662654876709
10 0.3813643753528595
11 0.38740092515945435
12 0.3947397768497467
13 0.3978673219680786
14 0.3983455300331116
15 0.4061855971813202
16 0.41634228825569153
17 0.4270275831222534
18 0.4378680884838104
19 0.4433649480342865
20 0.44917452335357666
21 0.45438480377197266
22 0.45568108558654785
23 0.45533287525177
24 0.45924824476242065
25 0.45992523431777954
26 0.4698502719402313
27 0.47596246004104614
28 0.4798404574394226
29 0.4849509298801422
1 step f1
2 0 0.03369621932506561
3 1 0.08265631645917892
4 2 0.14480535686016083
5 3 0.1954474151134491
6 4 0.24400727450847626
7 5 0.2852896749973297
8 6 0.3165817856788635
9 7 0.34051138162612915
10 8 0.3579234480857849
11 9 0.3706662654876709
12 10 0.3813643753528595
13 11 0.38740092515945435
14 12 0.3947397768497467
15 13 0.3978673219680786
16 14 0.3983455300331116
17 15 0.4061855971813202
18 16 0.41634228825569153
19 17 0.4270275831222534
20 18 0.4378680884838104
21 19 0.4433649480342865
22 20 0.44917452335357666
23 21 0.45438480377197266
24 22 0.45568108558654785
25 23 0.45533287525177
26 24 0.45924824476242065
27 25 0.45992523431777954
28 26 0.4698502719402313
29 27 0.47596246004104614
30 28 0.4798404574394226
31 29 0.4849509298801422

View File

@ -0,0 +1,31 @@
step loss
0 4.0223345439910885
1 3.1446908485412597
2 2.845902690887451
3 2.7091702819824217
4 2.5876311504364016
5 2.4898329914093016
6 2.4078801975250244
7 2.3469735752105714
8 2.3044276081085204
9 2.2692713054656983
10 2.2433441226959228
11 2.2251542106628417
12 2.2075239395141604
13 2.199652731704712
14 2.2003354278564453
15 2.1802532527923586
16 2.155798588562012
17 2.127256035041809
18 2.1059615146636963
19 2.0936844367980956
20 2.077068444442749
21 2.064746246147156
22 2.0619221328735353
23 2.058998599433899
24 2.0547973834991455
25 2.0490142166137697
26 2.0298474113464358
27 2.0157182762145998
28 2.006533228492737
29 1.992799331665039
1 step loss
2 0 4.0223345439910885
3 1 3.1446908485412597
4 2 2.845902690887451
5 3 2.7091702819824217
6 4 2.5876311504364016
7 5 2.4898329914093016
8 6 2.4078801975250244
9 7 2.3469735752105714
10 8 2.3044276081085204
11 9 2.2692713054656983
12 10 2.2433441226959228
13 11 2.2251542106628417
14 12 2.2075239395141604
15 13 2.199652731704712
16 14 2.2003354278564453
17 15 2.1802532527923586
18 16 2.155798588562012
19 17 2.127256035041809
20 18 2.1059615146636963
21 19 2.0936844367980956
22 20 2.077068444442749
23 21 2.064746246147156
24 22 2.0619221328735353
25 23 2.058998599433899
26 24 2.0547973834991455
27 25 2.0490142166137697
28 26 2.0298474113464358
29 27 2.0157182762145998
30 28 2.006533228492737
31 29 1.992799331665039

View File

@ -0,0 +1,31 @@
step precision
0 0.055038902908563614
1 0.08688722550868988
2 0.14544154703617096
3 0.19598175585269928
4 0.24326808750629425
5 0.28354209661483765
6 0.3143269121646881
7 0.33853644132614136
8 0.3557613492012024
9 0.3688707649707794
10 0.37962812185287476
11 0.3855380415916443
12 0.3929717540740967
13 0.3963885009288788
14 0.39665019512176514
15 0.40454378724098206
16 0.41489875316619873
17 0.42552798986434937
18 0.43634524941444397
19 0.44186848402023315
20 0.4476196765899658
21 0.4529317021369934
22 0.4541561007499695
23 0.45390117168426514
24 0.45794767141342163
25 0.45853471755981445
26 0.46830785274505615
27 0.4746767580509186
28 0.47852134704589844
29 0.48363304138183594
1 step precision
2 0 0.055038902908563614
3 1 0.08688722550868988
4 2 0.14544154703617096
5 3 0.19598175585269928
6 4 0.24326808750629425
7 5 0.28354209661483765
8 6 0.3143269121646881
9 7 0.33853644132614136
10 8 0.3557613492012024
11 9 0.3688707649707794
12 10 0.37962812185287476
13 11 0.3855380415916443
14 12 0.3929717540740967
15 13 0.3963885009288788
16 14 0.39665019512176514
17 15 0.40454378724098206
18 16 0.41489875316619873
19 17 0.42552798986434937
20 18 0.43634524941444397
21 19 0.44186848402023315
22 20 0.4476196765899658
23 21 0.4529317021369934
24 22 0.4541561007499695
25 23 0.45390117168426514
26 24 0.45794767141342163
27 25 0.45853471755981445
28 26 0.46830785274505615
29 27 0.4746767580509186
30 28 0.47852134704589844
31 29 0.48363304138183594

View File

@ -0,0 +1,31 @@
step recall
0 0.04566790908575058
1 0.08645831048488617
2 0.1547394096851349
3 0.2082621306180954
4 0.2544386386871338
5 0.29297617077827454
6 0.3237552046775818
7 0.346926212310791
8 0.364177942276001
9 0.3765082359313965
10 0.3870483636856079
11 0.39303654432296753
12 0.4002862572669983
13 0.403104305267334
14 0.4036043882369995
15 0.4110710322856903
16 0.42104363441467285
17 0.4316273629665375
18 0.44224199652671814
19 0.44761422276496887
20 0.4533519148826599
21 0.4584938883781433
22 0.45962250232696533
23 0.45926111936569214
24 0.46298152208328247
25 0.4637938141822815
26 0.47378331422805786
27 0.4796329736709595
28 0.4833483397960663
29 0.4885570704936981
1 step recall
2 0 0.04566790908575058
3 1 0.08645831048488617
4 2 0.1547394096851349
5 3 0.2082621306180954
6 4 0.2544386386871338
7 5 0.29297617077827454
8 6 0.3237552046775818
9 7 0.346926212310791
10 8 0.364177942276001
11 9 0.3765082359313965
12 10 0.3870483636856079
13 11 0.39303654432296753
14 12 0.4002862572669983
15 13 0.403104305267334
16 14 0.4036043882369995
17 15 0.4110710322856903
18 16 0.42104363441467285
19 17 0.4316273629665375
20 18 0.44224199652671814
21 19 0.44761422276496887
22 20 0.4533519148826599
23 21 0.4584938883781433
24 22 0.45962250232696533
25 23 0.45926111936569214
26 24 0.46298152208328247
27 25 0.4637938141822815
28 26 0.47378331422805786
29 27 0.4796329736709595
30 28 0.4833483397960663
31 29 0.4885570704936981

View File

@ -0,0 +1,31 @@
step accuracy
0 0.04039999842643738
1 0.1996999979019165
2 0.3260500133037567
3 0.4186500012874603
4 0.49950000643730164
5 0.5444499850273132
6 0.5720000267028809
7 0.5917500257492065
8 0.6093500256538391
9 0.6218000054359436
10 0.6304000020027161
11 0.6385499835014343
12 0.6404500007629395
13 0.6446499824523926
14 0.6463500261306763
15 0.6567999720573425
16 0.6672000288963318
17 0.6779500246047974
18 0.6841999888420105
19 0.6896499991416931
20 0.6960499882698059
21 0.6970999836921692
22 0.7006000280380249
23 0.70169997215271
24 0.7010999917984009
25 0.7071499824523926
26 0.7135000228881836
27 0.7184500098228455
28 0.7211499810218811
29 0.7260000109672546
1 step accuracy
2 0 0.04039999842643738
3 1 0.1996999979019165
4 2 0.3260500133037567
5 3 0.4186500012874603
6 4 0.49950000643730164
7 5 0.5444499850273132
8 6 0.5720000267028809
9 7 0.5917500257492065
10 8 0.6093500256538391
11 9 0.6218000054359436
12 10 0.6304000020027161
13 11 0.6385499835014343
14 12 0.6404500007629395
15 13 0.6446499824523926
16 14 0.6463500261306763
17 15 0.6567999720573425
18 16 0.6672000288963318
19 17 0.6779500246047974
20 18 0.6841999888420105
21 19 0.6896499991416931
22 20 0.6960499882698059
23 21 0.6970999836921692
24 22 0.7006000280380249
25 23 0.70169997215271
26 24 0.7010999917984009
27 25 0.7071499824523926
28 26 0.7135000228881836
29 27 0.7184500098228455
30 28 0.7211499810218811
31 29 0.7260000109672546

View File

@ -0,0 +1,31 @@
step f1
0 0.026379385963082314
1 0.1792948693037033
2 0.2925271987915039
3 0.3919405937194824
4 0.47940874099731445
5 0.5274306535720825
6 0.556631863117218
7 0.576585054397583
8 0.5947144031524658
9 0.6082352995872498
10 0.6178301572799683
11 0.6262512803077698
12 0.6278425455093384
13 0.6331325769424438
14 0.6344878673553467
15 0.6453059315681458
16 0.6570700407028198
17 0.6685804128646851
18 0.6745381355285645
19 0.6804145574569702
20 0.6874032020568848
21 0.6882768273353577
22 0.6920892596244812
23 0.693403959274292
24 0.6925287246704102
25 0.6985740661621094
26 0.7053770422935486
27 0.7106728553771973
28 0.7137280106544495
29 0.7193899154663086
1 step f1
2 0 0.026379385963082314
3 1 0.1792948693037033
4 2 0.2925271987915039
5 3 0.3919405937194824
6 4 0.47940874099731445
7 5 0.5274306535720825
8 6 0.556631863117218
9 7 0.576585054397583
10 8 0.5947144031524658
11 9 0.6082352995872498
12 10 0.6178301572799683
13 11 0.6262512803077698
14 12 0.6278425455093384
15 13 0.6331325769424438
16 14 0.6344878673553467
17 15 0.6453059315681458
18 16 0.6570700407028198
19 17 0.6685804128646851
20 18 0.6745381355285645
21 19 0.6804145574569702
22 20 0.6874032020568848
23 21 0.6882768273353577
24 22 0.6920892596244812
25 23 0.693403959274292
26 24 0.6925287246704102
27 25 0.6985740661621094
28 26 0.7053770422935486
29 27 0.7106728553771973
30 28 0.7137280106544495
31 29 0.7193899154663086

View File

@ -0,0 +1,31 @@
step loss
0 3.590050941781153
1 2.7546746489367906
2 2.5154529040372826
3 2.2843858411040485
4 2.0942421291447895
5 1.9563061029096194
6 1.8598378127134298
7 1.7950012200995336
8 1.7452865039245993
9 1.7100401875338977
10 1.6846234753162046
11 1.6670298757432382
12 1.6579805748372138
13 1.6494467530069472
14 1.6449626789817327
15 1.6121938424774362
16 1.5864867349214191
17 1.5629751878448679
18 1.5430825224405602
19 1.5310050943229772
20 1.5175003311302089
21 1.5117049654827843
22 1.5065134658089168
23 1.5018350715878643
24 1.5016868627524074
25 1.4859640613386902
26 1.4698024339313749
27 1.4584274548518508
28 1.4490519852577886
29 1.4377805100211614
1 step loss
2 0 3.590050941781153
3 1 2.7546746489367906
4 2 2.5154529040372826
5 3 2.2843858411040485
6 4 2.0942421291447895
7 5 1.9563061029096194
8 6 1.8598378127134298
9 7 1.7950012200995336
10 8 1.7452865039245993
11 9 1.7100401875338977
12 10 1.6846234753162046
13 11 1.6670298757432382
14 12 1.6579805748372138
15 13 1.6494467530069472
16 14 1.6449626789817327
17 15 1.6121938424774362
18 16 1.5864867349214191
19 17 1.5629751878448679
20 18 1.5430825224405602
21 19 1.5310050943229772
22 20 1.5175003311302089
23 21 1.5117049654827843
24 22 1.5065134658089168
25 23 1.5018350715878643
26 24 1.5016868627524074
27 25 1.4859640613386902
28 26 1.4698024339313749
29 27 1.4584274548518508
30 28 1.4490519852577886
31 29 1.4377805100211614

View File

@ -0,0 +1,31 @@
step precision
0 0.07338898628950119
1 0.18911437690258026
2 0.32449209690093994
3 0.4227263331413269
4 0.49964380264282227
5 0.5427083373069763
6 0.5689945220947266
7 0.5907210111618042
8 0.6088747978210449
9 0.620964527130127
10 0.6287857294082642
11 0.6372801065444946
12 0.6391931772232056
13 0.643118143081665
14 0.6445475816726685
15 0.655581533908844
16 0.6666973829269409
17 0.6765724420547485
18 0.6822240352630615
19 0.6881765127182007
20 0.6948975920677185
21 0.695229172706604
22 0.6998213529586792
23 0.7005149126052856
24 0.6999821662902832
25 0.7058628797531128
26 0.7112910151481628
27 0.7165747880935669
28 0.7200020551681519
29 0.723875880241394
1 step precision
2 0 0.07338898628950119
3 1 0.18911437690258026
4 2 0.32449209690093994
5 3 0.4227263331413269
6 4 0.49964380264282227
7 5 0.5427083373069763
8 6 0.5689945220947266
9 7 0.5907210111618042
10 8 0.6088747978210449
11 9 0.620964527130127
12 10 0.6287857294082642
13 11 0.6372801065444946
14 12 0.6391931772232056
15 13 0.643118143081665
16 14 0.6445475816726685
17 15 0.655581533908844
18 16 0.6666973829269409
19 17 0.6765724420547485
20 18 0.6822240352630615
21 19 0.6881765127182007
22 20 0.6948975920677185
23 21 0.695229172706604
24 22 0.6998213529586792
25 23 0.7005149126052856
26 24 0.6999821662902832
27 25 0.7058628797531128
28 26 0.7112910151481628
29 27 0.7165747880935669
30 28 0.7200020551681519
31 29 0.723875880241394

View File

@ -0,0 +1,31 @@
step recall
0 0.04072221741080284
1 0.19861623644828796
2 0.32381999492645264
3 0.41670864820480347
4 0.4983140230178833
5 0.5435963273048401
6 0.5713088512420654
7 0.5910568237304688
8 0.608674168586731
9 0.6212138533592224
10 0.6297356486320496
11 0.6379297971725464
12 0.6398895382881165
13 0.6441172361373901
14 0.6458127498626709
15 0.6563705205917358
16 0.6666883230209351
17 0.6775047779083252
18 0.6838763952255249
19 0.6894745826721191
20 0.6957231163978577
21 0.6967899203300476
22 0.7002253532409668
23 0.7013353109359741
24 0.7007752656936646
25 0.706775963306427
26 0.7130882740020752
27 0.7181775569915771
28 0.7208318114280701
29 0.7256932258605957
1 step recall
2 0 0.04072221741080284
3 1 0.19861623644828796
4 2 0.32381999492645264
5 3 0.41670864820480347
6 4 0.4983140230178833
7 5 0.5435963273048401
8 6 0.5713088512420654
9 7 0.5910568237304688
10 8 0.608674168586731
11 9 0.6212138533592224
12 10 0.6297356486320496
13 11 0.6379297971725464
14 12 0.6398895382881165
15 13 0.6441172361373901
16 14 0.6458127498626709
17 15 0.6563705205917358
18 16 0.6666883230209351
19 17 0.6775047779083252
20 18 0.6838763952255249
21 19 0.6894745826721191
22 20 0.6957231163978577
23 21 0.6967899203300476
24 22 0.7002253532409668
25 23 0.7013353109359741
26 24 0.7007752656936646
27 25 0.706775963306427
28 26 0.7130882740020752
29 27 0.7181775569915771
30 28 0.7208318114280701
31 29 0.7256932258605957

View File

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="5">
<title>DVC Plot</title>
<script src="https://cdn.jsdelivr.net/npm/vega@5.20.2"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5.2.0"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6.18.2"></script>
<style>
table {
border-spacing: 15px;
}
</style>
</head>
<body>
<div id="metrics_json" style="text-align: center; padding: 10x">
<p>metrics_json</p>
<div style="display: flex;justify-content: center;">
<table>
<thead>
<tr><th style="text-align: right;"> train.loss</th><th style="text-align: right;"> train.accuracy</th><th style="text-align: right;"> train.precision</th><th style="text-align: right;"> train.recall</th><th style="text-align: right;"> train.f1</th><th style="text-align: right;"> valid.loss</th><th style="text-align: right;"> valid.accuracy</th><th style="text-align: right;"> valid.precision</th><th style="text-align: right;"> valid.recall</th><th style="text-align: right;"> valid.f1</th><th style="text-align: right;"> step</th></tr>
</thead>
<tbody>
<tr><td style="text-align: right;"> 1.9928</td><td style="text-align: right;"> 0.488375</td><td style="text-align: right;"> 0.483633</td><td style="text-align: right;"> 0.488557</td><td style="text-align: right;"> 0.484951</td><td style="text-align: right;"> 1.43778</td><td style="text-align: right;"> 0.726</td><td style="text-align: right;"> 0.723876</td><td style="text-align: right;"> 0.725693</td><td style="text-align: right;"> 0.71939</td><td style="text-align: right;"> 29</td></tr>
</tbody>
</table>
</div>
</div>
<div id = "static_valid_f1">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "f1": "0.026379385963082314", "rev": "workspace"}, {"step": "1", "f1": "0.1792948693037033", "rev": "workspace"}, {"step": "2", "f1": "0.2925271987915039", "rev": "workspace"}, {"step": "3", "f1": "0.3919405937194824", "rev": "workspace"}, {"step": "4", "f1": "0.47940874099731445", "rev": "workspace"}, {"step": "5", "f1": "0.5274306535720825", "rev": "workspace"}, {"step": "6", "f1": "0.556631863117218", "rev": "workspace"}, {"step": "7", "f1": "0.576585054397583", "rev": "workspace"}, {"step": "8", "f1": "0.5947144031524658", "rev": "workspace"}, {"step": "9", "f1": "0.6082352995872498", "rev": "workspace"}, {"step": "10", "f1": "0.6178301572799683", "rev": "workspace"}, {"step": "11", "f1": "0.6262512803077698", "rev": "workspace"}, {"step": "12", "f1": "0.6278425455093384", "rev": "workspace"}, {"step": "13", "f1": "0.6331325769424438", "rev": "workspace"}, {"step": "14", "f1": "0.6344878673553467", "rev": "workspace"}, {"step": "15", "f1": "0.6453059315681458", "rev": "workspace"}, {"step": "16", "f1": "0.6570700407028198", "rev": "workspace"}, {"step": "17", "f1": "0.6685804128646851", "rev": "workspace"}, {"step": "18", "f1": "0.6745381355285645", "rev": "workspace"}, {"step": "19", "f1": "0.6804145574569702", "rev": "workspace"}, {"step": "20", "f1": "0.6874032020568848", "rev": "workspace"}, {"step": "21", "f1": "0.6882768273353577", "rev": "workspace"}, {"step": "22", "f1": "0.6920892596244812", "rev": "workspace"}, {"step": "23", "f1": "0.693403959274292", "rev": "workspace"}, {"step": "24", "f1": "0.6925287246704102", "rev": "workspace"}, {"step": "25", "f1": "0.6985740661621094", "rev": "workspace"}, {"step": "26", "f1": "0.7053770422935486", "rev": "workspace"}, {"step": "27", "f1": "0.7106728553771973", "rev": "workspace"}, {"step": "28", "f1": "0.7137280106544495", "rev": "workspace"}, {"step": "29", "f1": "0.7193899154663086", "rev": "workspace"}]}, "title": {"text": "valid/f1", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "f1", "type": "quantitative", "title": "f1", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "f1", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "f1", "type": "quantitative", "title": "f1", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "f1", "type": "quantitative", "title": "f1", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "f1", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_valid_f1', spec);
</script>
</div>
<div id = "static_valid_loss">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "loss": "3.590050941781153", "rev": "workspace"}, {"step": "1", "loss": "2.7546746489367906", "rev": "workspace"}, {"step": "2", "loss": "2.5154529040372826", "rev": "workspace"}, {"step": "3", "loss": "2.2843858411040485", "rev": "workspace"}, {"step": "4", "loss": "2.0942421291447895", "rev": "workspace"}, {"step": "5", "loss": "1.9563061029096194", "rev": "workspace"}, {"step": "6", "loss": "1.8598378127134298", "rev": "workspace"}, {"step": "7", "loss": "1.7950012200995336", "rev": "workspace"}, {"step": "8", "loss": "1.7452865039245993", "rev": "workspace"}, {"step": "9", "loss": "1.7100401875338977", "rev": "workspace"}, {"step": "10", "loss": "1.6846234753162046", "rev": "workspace"}, {"step": "11", "loss": "1.6670298757432382", "rev": "workspace"}, {"step": "12", "loss": "1.6579805748372138", "rev": "workspace"}, {"step": "13", "loss": "1.6494467530069472", "rev": "workspace"}, {"step": "14", "loss": "1.6449626789817327", "rev": "workspace"}, {"step": "15", "loss": "1.6121938424774362", "rev": "workspace"}, {"step": "16", "loss": "1.5864867349214191", "rev": "workspace"}, {"step": "17", "loss": "1.5629751878448679", "rev": "workspace"}, {"step": "18", "loss": "1.5430825224405602", "rev": "workspace"}, {"step": "19", "loss": "1.5310050943229772", "rev": "workspace"}, {"step": "20", "loss": "1.5175003311302089", "rev": "workspace"}, {"step": "21", "loss": "1.5117049654827843", "rev": "workspace"}, {"step": "22", "loss": "1.5065134658089168", "rev": "workspace"}, {"step": "23", "loss": "1.5018350715878643", "rev": "workspace"}, {"step": "24", "loss": "1.5016868627524074", "rev": "workspace"}, {"step": "25", "loss": "1.4859640613386902", "rev": "workspace"}, {"step": "26", "loss": "1.4698024339313749", "rev": "workspace"}, {"step": "27", "loss": "1.4584274548518508", "rev": "workspace"}, {"step": "28", "loss": "1.4490519852577886", "rev": "workspace"}, {"step": "29", "loss": "1.4377805100211614", "rev": "workspace"}]}, "title": {"text": "valid/loss", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "loss", "type": "quantitative", "title": "loss", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "loss", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "loss", "type": "quantitative", "title": "loss", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "loss", "type": "quantitative", "title": "loss", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "loss", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_valid_loss', spec);
</script>
</div>
<div id = "static_valid_accuracy">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "accuracy": "0.04039999842643738", "rev": "workspace"}, {"step": "1", "accuracy": "0.1996999979019165", "rev": "workspace"}, {"step": "2", "accuracy": "0.3260500133037567", "rev": "workspace"}, {"step": "3", "accuracy": "0.4186500012874603", "rev": "workspace"}, {"step": "4", "accuracy": "0.49950000643730164", "rev": "workspace"}, {"step": "5", "accuracy": "0.5444499850273132", "rev": "workspace"}, {"step": "6", "accuracy": "0.5720000267028809", "rev": "workspace"}, {"step": "7", "accuracy": "0.5917500257492065", "rev": "workspace"}, {"step": "8", "accuracy": "0.6093500256538391", "rev": "workspace"}, {"step": "9", "accuracy": "0.6218000054359436", "rev": "workspace"}, {"step": "10", "accuracy": "0.6304000020027161", "rev": "workspace"}, {"step": "11", "accuracy": "0.6385499835014343", "rev": "workspace"}, {"step": "12", "accuracy": "0.6404500007629395", "rev": "workspace"}, {"step": "13", "accuracy": "0.6446499824523926", "rev": "workspace"}, {"step": "14", "accuracy": "0.6463500261306763", "rev": "workspace"}, {"step": "15", "accuracy": "0.6567999720573425", "rev": "workspace"}, {"step": "16", "accuracy": "0.6672000288963318", "rev": "workspace"}, {"step": "17", "accuracy": "0.6779500246047974", "rev": "workspace"}, {"step": "18", "accuracy": "0.6841999888420105", "rev": "workspace"}, {"step": "19", "accuracy": "0.6896499991416931", "rev": "workspace"}, {"step": "20", "accuracy": "0.6960499882698059", "rev": "workspace"}, {"step": "21", "accuracy": "0.6970999836921692", "rev": "workspace"}, {"step": "22", "accuracy": "0.7006000280380249", "rev": "workspace"}, {"step": "23", "accuracy": "0.70169997215271", "rev": "workspace"}, {"step": "24", "accuracy": "0.7010999917984009", "rev": "workspace"}, {"step": "25", "accuracy": "0.7071499824523926", "rev": "workspace"}, {"step": "26", "accuracy": "0.7135000228881836", "rev": "workspace"}, {"step": "27", "accuracy": "0.7184500098228455", "rev": "workspace"}, {"step": "28", "accuracy": "0.7211499810218811", "rev": "workspace"}, {"step": "29", "accuracy": "0.7260000109672546", "rev": "workspace"}]}, "title": {"text": "valid/accuracy", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "accuracy", "type": "quantitative", "title": "accuracy", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "accuracy", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "accuracy", "type": "quantitative", "title": "accuracy", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "accuracy", "type": "quantitative", "title": "accuracy", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "accuracy", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_valid_accuracy', spec);
</script>
</div>
<div id = "static_valid_recall">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "recall": "0.04072221741080284", "rev": "workspace"}, {"step": "1", "recall": "0.19861623644828796", "rev": "workspace"}, {"step": "2", "recall": "0.32381999492645264", "rev": "workspace"}, {"step": "3", "recall": "0.41670864820480347", "rev": "workspace"}, {"step": "4", "recall": "0.4983140230178833", "rev": "workspace"}, {"step": "5", "recall": "0.5435963273048401", "rev": "workspace"}, {"step": "6", "recall": "0.5713088512420654", "rev": "workspace"}, {"step": "7", "recall": "0.5910568237304688", "rev": "workspace"}, {"step": "8", "recall": "0.608674168586731", "rev": "workspace"}, {"step": "9", "recall": "0.6212138533592224", "rev": "workspace"}, {"step": "10", "recall": "0.6297356486320496", "rev": "workspace"}, {"step": "11", "recall": "0.6379297971725464", "rev": "workspace"}, {"step": "12", "recall": "0.6398895382881165", "rev": "workspace"}, {"step": "13", "recall": "0.6441172361373901", "rev": "workspace"}, {"step": "14", "recall": "0.6458127498626709", "rev": "workspace"}, {"step": "15", "recall": "0.6563705205917358", "rev": "workspace"}, {"step": "16", "recall": "0.6666883230209351", "rev": "workspace"}, {"step": "17", "recall": "0.6775047779083252", "rev": "workspace"}, {"step": "18", "recall": "0.6838763952255249", "rev": "workspace"}, {"step": "19", "recall": "0.6894745826721191", "rev": "workspace"}, {"step": "20", "recall": "0.6957231163978577", "rev": "workspace"}, {"step": "21", "recall": "0.6967899203300476", "rev": "workspace"}, {"step": "22", "recall": "0.7002253532409668", "rev": "workspace"}, {"step": "23", "recall": "0.7013353109359741", "rev": "workspace"}, {"step": "24", "recall": "0.7007752656936646", "rev": "workspace"}, {"step": "25", "recall": "0.706775963306427", "rev": "workspace"}, {"step": "26", "recall": "0.7130882740020752", "rev": "workspace"}, {"step": "27", "recall": "0.7181775569915771", "rev": "workspace"}, {"step": "28", "recall": "0.7208318114280701", "rev": "workspace"}, {"step": "29", "recall": "0.7256932258605957", "rev": "workspace"}]}, "title": {"text": "valid/recall", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "recall", "type": "quantitative", "title": "recall", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "recall", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "recall", "type": "quantitative", "title": "recall", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "recall", "type": "quantitative", "title": "recall", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "recall", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_valid_recall', spec);
</script>
</div>
<div id = "static_valid_precision">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "precision": "0.07338898628950119", "rev": "workspace"}, {"step": "1", "precision": "0.18911437690258026", "rev": "workspace"}, {"step": "2", "precision": "0.32449209690093994", "rev": "workspace"}, {"step": "3", "precision": "0.4227263331413269", "rev": "workspace"}, {"step": "4", "precision": "0.49964380264282227", "rev": "workspace"}, {"step": "5", "precision": "0.5427083373069763", "rev": "workspace"}, {"step": "6", "precision": "0.5689945220947266", "rev": "workspace"}, {"step": "7", "precision": "0.5907210111618042", "rev": "workspace"}, {"step": "8", "precision": "0.6088747978210449", "rev": "workspace"}, {"step": "9", "precision": "0.620964527130127", "rev": "workspace"}, {"step": "10", "precision": "0.6287857294082642", "rev": "workspace"}, {"step": "11", "precision": "0.6372801065444946", "rev": "workspace"}, {"step": "12", "precision": "0.6391931772232056", "rev": "workspace"}, {"step": "13", "precision": "0.643118143081665", "rev": "workspace"}, {"step": "14", "precision": "0.6445475816726685", "rev": "workspace"}, {"step": "15", "precision": "0.655581533908844", "rev": "workspace"}, {"step": "16", "precision": "0.6666973829269409", "rev": "workspace"}, {"step": "17", "precision": "0.6765724420547485", "rev": "workspace"}, {"step": "18", "precision": "0.6822240352630615", "rev": "workspace"}, {"step": "19", "precision": "0.6881765127182007", "rev": "workspace"}, {"step": "20", "precision": "0.6948975920677185", "rev": "workspace"}, {"step": "21", "precision": "0.695229172706604", "rev": "workspace"}, {"step": "22", "precision": "0.6998213529586792", "rev": "workspace"}, {"step": "23", "precision": "0.7005149126052856", "rev": "workspace"}, {"step": "24", "precision": "0.6999821662902832", "rev": "workspace"}, {"step": "25", "precision": "0.7058628797531128", "rev": "workspace"}, {"step": "26", "precision": "0.7112910151481628", "rev": "workspace"}, {"step": "27", "precision": "0.7165747880935669", "rev": "workspace"}, {"step": "28", "precision": "0.7200020551681519", "rev": "workspace"}, {"step": "29", "precision": "0.723875880241394", "rev": "workspace"}]}, "title": {"text": "valid/precision", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "precision", "type": "quantitative", "title": "precision", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "precision", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "precision", "type": "quantitative", "title": "precision", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "precision", "type": "quantitative", "title": "precision", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "precision", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_valid_precision', spec);
</script>
</div>
<div id = "static_train_f1">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "f1": "0.03369621932506561", "rev": "workspace"}, {"step": "1", "f1": "0.08265631645917892", "rev": "workspace"}, {"step": "2", "f1": "0.14480535686016083", "rev": "workspace"}, {"step": "3", "f1": "0.1954474151134491", "rev": "workspace"}, {"step": "4", "f1": "0.24400727450847626", "rev": "workspace"}, {"step": "5", "f1": "0.2852896749973297", "rev": "workspace"}, {"step": "6", "f1": "0.3165817856788635", "rev": "workspace"}, {"step": "7", "f1": "0.34051138162612915", "rev": "workspace"}, {"step": "8", "f1": "0.3579234480857849", "rev": "workspace"}, {"step": "9", "f1": "0.3706662654876709", "rev": "workspace"}, {"step": "10", "f1": "0.3813643753528595", "rev": "workspace"}, {"step": "11", "f1": "0.38740092515945435", "rev": "workspace"}, {"step": "12", "f1": "0.3947397768497467", "rev": "workspace"}, {"step": "13", "f1": "0.3978673219680786", "rev": "workspace"}, {"step": "14", "f1": "0.3983455300331116", "rev": "workspace"}, {"step": "15", "f1": "0.4061855971813202", "rev": "workspace"}, {"step": "16", "f1": "0.41634228825569153", "rev": "workspace"}, {"step": "17", "f1": "0.4270275831222534", "rev": "workspace"}, {"step": "18", "f1": "0.4378680884838104", "rev": "workspace"}, {"step": "19", "f1": "0.4433649480342865", "rev": "workspace"}, {"step": "20", "f1": "0.44917452335357666", "rev": "workspace"}, {"step": "21", "f1": "0.45438480377197266", "rev": "workspace"}, {"step": "22", "f1": "0.45568108558654785", "rev": "workspace"}, {"step": "23", "f1": "0.45533287525177", "rev": "workspace"}, {"step": "24", "f1": "0.45924824476242065", "rev": "workspace"}, {"step": "25", "f1": "0.45992523431777954", "rev": "workspace"}, {"step": "26", "f1": "0.4698502719402313", "rev": "workspace"}, {"step": "27", "f1": "0.47596246004104614", "rev": "workspace"}, {"step": "28", "f1": "0.4798404574394226", "rev": "workspace"}, {"step": "29", "f1": "0.4849509298801422", "rev": "workspace"}]}, "title": {"text": "train/f1", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "f1", "type": "quantitative", "title": "f1", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "f1", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "f1", "type": "quantitative", "title": "f1", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "f1", "type": "quantitative", "title": "f1", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "f1", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_train_f1', spec);
</script>
</div>
<div id = "static_train_loss">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "loss": "4.0223345439910885", "rev": "workspace"}, {"step": "1", "loss": "3.1446908485412597", "rev": "workspace"}, {"step": "2", "loss": "2.845902690887451", "rev": "workspace"}, {"step": "3", "loss": "2.7091702819824217", "rev": "workspace"}, {"step": "4", "loss": "2.5876311504364016", "rev": "workspace"}, {"step": "5", "loss": "2.4898329914093016", "rev": "workspace"}, {"step": "6", "loss": "2.4078801975250244", "rev": "workspace"}, {"step": "7", "loss": "2.3469735752105714", "rev": "workspace"}, {"step": "8", "loss": "2.3044276081085204", "rev": "workspace"}, {"step": "9", "loss": "2.2692713054656983", "rev": "workspace"}, {"step": "10", "loss": "2.2433441226959228", "rev": "workspace"}, {"step": "11", "loss": "2.2251542106628417", "rev": "workspace"}, {"step": "12", "loss": "2.2075239395141604", "rev": "workspace"}, {"step": "13", "loss": "2.199652731704712", "rev": "workspace"}, {"step": "14", "loss": "2.2003354278564453", "rev": "workspace"}, {"step": "15", "loss": "2.1802532527923586", "rev": "workspace"}, {"step": "16", "loss": "2.155798588562012", "rev": "workspace"}, {"step": "17", "loss": "2.127256035041809", "rev": "workspace"}, {"step": "18", "loss": "2.1059615146636963", "rev": "workspace"}, {"step": "19", "loss": "2.0936844367980956", "rev": "workspace"}, {"step": "20", "loss": "2.077068444442749", "rev": "workspace"}, {"step": "21", "loss": "2.064746246147156", "rev": "workspace"}, {"step": "22", "loss": "2.0619221328735353", "rev": "workspace"}, {"step": "23", "loss": "2.058998599433899", "rev": "workspace"}, {"step": "24", "loss": "2.0547973834991455", "rev": "workspace"}, {"step": "25", "loss": "2.0490142166137697", "rev": "workspace"}, {"step": "26", "loss": "2.0298474113464358", "rev": "workspace"}, {"step": "27", "loss": "2.0157182762145998", "rev": "workspace"}, {"step": "28", "loss": "2.006533228492737", "rev": "workspace"}, {"step": "29", "loss": "1.992799331665039", "rev": "workspace"}]}, "title": {"text": "train/loss", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "loss", "type": "quantitative", "title": "loss", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "loss", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "loss", "type": "quantitative", "title": "loss", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "loss", "type": "quantitative", "title": "loss", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "loss", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_train_loss', spec);
</script>
</div>
<div id = "static_train_accuracy">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "accuracy": "0.04570624977350235", "rev": "workspace"}, {"step": "1", "accuracy": "0.08645624667406082", "rev": "workspace"}, {"step": "2", "accuracy": "0.15463125705718994", "rev": "workspace"}, {"step": "3", "accuracy": "0.20809374749660492", "rev": "workspace"}, {"step": "4", "accuracy": "0.2542562484741211", "rev": "workspace"}, {"step": "5", "accuracy": "0.29279375076293945", "rev": "workspace"}, {"step": "6", "accuracy": "0.3235749900341034", "rev": "workspace"}, {"step": "7", "accuracy": "0.346756249666214", "rev": "workspace"}, {"step": "8", "accuracy": "0.363993763923645", "rev": "workspace"}, {"step": "9", "accuracy": "0.3763374984264374", "rev": "workspace"}, {"step": "10", "accuracy": "0.3868750035762787", "rev": "workspace"}, {"step": "11", "accuracy": "0.39285001158714294", "rev": "workspace"}, {"step": "12", "accuracy": "0.400112509727478", "rev": "workspace"}, {"step": "13", "accuracy": "0.4029250144958496", "rev": "workspace"}, {"step": "14", "accuracy": "0.403425008058548", "rev": "workspace"}, {"step": "15", "accuracy": "0.4108937382698059", "rev": "workspace"}, {"step": "16", "accuracy": "0.42086875438690186", "rev": "workspace"}, {"step": "17", "accuracy": "0.43145623803138733", "rev": "workspace"}, {"step": "18", "accuracy": "0.44205623865127563", "rev": "workspace"}, {"step": "19", "accuracy": "0.44743749499320984", "rev": "workspace"}, {"step": "20", "accuracy": "0.45317500829696655", "rev": "workspace"}, {"step": "21", "accuracy": "0.4583125114440918", "rev": "workspace"}, {"step": "22", "accuracy": "0.45945000648498535", "rev": "workspace"}, {"step": "23", "accuracy": "0.4590874910354614", "rev": "workspace"}, {"step": "24", "accuracy": "0.462799996137619", "rev": "workspace"}, {"step": "25", "accuracy": "0.46361875534057617", "rev": "workspace"}, {"step": "26", "accuracy": "0.47360000014305115", "rev": "workspace"}, {"step": "27", "accuracy": "0.47944375872612", "rev": "workspace"}, {"step": "28", "accuracy": "0.4831624925136566", "rev": "workspace"}, {"step": "29", "accuracy": "0.4883750081062317", "rev": "workspace"}]}, "title": {"text": "train/accuracy", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "accuracy", "type": "quantitative", "title": "accuracy", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "accuracy", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "accuracy", "type": "quantitative", "title": "accuracy", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "accuracy", "type": "quantitative", "title": "accuracy", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "accuracy", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_train_accuracy', spec);
</script>
</div>
<div id = "static_train_recall">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "recall": "0.04566790908575058", "rev": "workspace"}, {"step": "1", "recall": "0.08645831048488617", "rev": "workspace"}, {"step": "2", "recall": "0.1547394096851349", "rev": "workspace"}, {"step": "3", "recall": "0.2082621306180954", "rev": "workspace"}, {"step": "4", "recall": "0.2544386386871338", "rev": "workspace"}, {"step": "5", "recall": "0.29297617077827454", "rev": "workspace"}, {"step": "6", "recall": "0.3237552046775818", "rev": "workspace"}, {"step": "7", "recall": "0.346926212310791", "rev": "workspace"}, {"step": "8", "recall": "0.364177942276001", "rev": "workspace"}, {"step": "9", "recall": "0.3765082359313965", "rev": "workspace"}, {"step": "10", "recall": "0.3870483636856079", "rev": "workspace"}, {"step": "11", "recall": "0.39303654432296753", "rev": "workspace"}, {"step": "12", "recall": "0.4002862572669983", "rev": "workspace"}, {"step": "13", "recall": "0.403104305267334", "rev": "workspace"}, {"step": "14", "recall": "0.4036043882369995", "rev": "workspace"}, {"step": "15", "recall": "0.4110710322856903", "rev": "workspace"}, {"step": "16", "recall": "0.42104363441467285", "rev": "workspace"}, {"step": "17", "recall": "0.4316273629665375", "rev": "workspace"}, {"step": "18", "recall": "0.44224199652671814", "rev": "workspace"}, {"step": "19", "recall": "0.44761422276496887", "rev": "workspace"}, {"step": "20", "recall": "0.4533519148826599", "rev": "workspace"}, {"step": "21", "recall": "0.4584938883781433", "rev": "workspace"}, {"step": "22", "recall": "0.45962250232696533", "rev": "workspace"}, {"step": "23", "recall": "0.45926111936569214", "rev": "workspace"}, {"step": "24", "recall": "0.46298152208328247", "rev": "workspace"}, {"step": "25", "recall": "0.4637938141822815", "rev": "workspace"}, {"step": "26", "recall": "0.47378331422805786", "rev": "workspace"}, {"step": "27", "recall": "0.4796329736709595", "rev": "workspace"}, {"step": "28", "recall": "0.4833483397960663", "rev": "workspace"}, {"step": "29", "recall": "0.4885570704936981", "rev": "workspace"}]}, "title": {"text": "train/recall", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "recall", "type": "quantitative", "title": "recall", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "recall", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "recall", "type": "quantitative", "title": "recall", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "recall", "type": "quantitative", "title": "recall", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "recall", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_train_recall', spec);
</script>
</div>
<div id = "static_train_precision">
<script type = "text/javascript">
var spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": [{"step": "0", "precision": "0.055038902908563614", "rev": "workspace"}, {"step": "1", "precision": "0.08688722550868988", "rev": "workspace"}, {"step": "2", "precision": "0.14544154703617096", "rev": "workspace"}, {"step": "3", "precision": "0.19598175585269928", "rev": "workspace"}, {"step": "4", "precision": "0.24326808750629425", "rev": "workspace"}, {"step": "5", "precision": "0.28354209661483765", "rev": "workspace"}, {"step": "6", "precision": "0.3143269121646881", "rev": "workspace"}, {"step": "7", "precision": "0.33853644132614136", "rev": "workspace"}, {"step": "8", "precision": "0.3557613492012024", "rev": "workspace"}, {"step": "9", "precision": "0.3688707649707794", "rev": "workspace"}, {"step": "10", "precision": "0.37962812185287476", "rev": "workspace"}, {"step": "11", "precision": "0.3855380415916443", "rev": "workspace"}, {"step": "12", "precision": "0.3929717540740967", "rev": "workspace"}, {"step": "13", "precision": "0.3963885009288788", "rev": "workspace"}, {"step": "14", "precision": "0.39665019512176514", "rev": "workspace"}, {"step": "15", "precision": "0.40454378724098206", "rev": "workspace"}, {"step": "16", "precision": "0.41489875316619873", "rev": "workspace"}, {"step": "17", "precision": "0.42552798986434937", "rev": "workspace"}, {"step": "18", "precision": "0.43634524941444397", "rev": "workspace"}, {"step": "19", "precision": "0.44186848402023315", "rev": "workspace"}, {"step": "20", "precision": "0.4476196765899658", "rev": "workspace"}, {"step": "21", "precision": "0.4529317021369934", "rev": "workspace"}, {"step": "22", "precision": "0.4541561007499695", "rev": "workspace"}, {"step": "23", "precision": "0.45390117168426514", "rev": "workspace"}, {"step": "24", "precision": "0.45794767141342163", "rev": "workspace"}, {"step": "25", "precision": "0.45853471755981445", "rev": "workspace"}, {"step": "26", "precision": "0.46830785274505615", "rev": "workspace"}, {"step": "27", "precision": "0.4746767580509186", "rev": "workspace"}, {"step": "28", "precision": "0.47852134704589844", "rev": "workspace"}, {"step": "29", "precision": "0.48363304138183594", "rev": "workspace"}]}, "title": {"text": "train/precision", "anchor": "middle"}, "width": 300, "height": 300, "params": [{"name": "smooth", "value": 0.001, "bind": {"input": "range", "min": 0.001, "max": 1, "step": 0.001}}], "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "color": {"field": "rev", "scale": {"domain": ["workspace"], "range": ["#945dd6"]}}, "strokeDash": {}}, "layer": [{"layer": [{"params": [{"name": "grid", "select": "interval", "bind": "scales"}], "mark": "line"}, {"transform": [{"filter": {"param": "hover", "empty": false}}], "mark": "point"}], "encoding": {"y": {"field": "precision", "type": "quantitative", "title": "precision", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}, "transform": [{"loess": "precision", "on": "step", "groupby": ["rev"], "bandwidth": {"signal": "smooth"}}]}, {"mark": {"type": "line", "opacity": 0.2}, "encoding": {"x": {"field": "step", "type": "quantitative", "title": "step"}, "y": {"field": "precision", "type": "quantitative", "title": "precision", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"mark": {"type": "circle", "size": 10}, "encoding": {"x": {"aggregate": "max", "field": "step", "type": "quantitative", "title": "step"}, "y": {"aggregate": {"argmax": "step"}, "field": "precision", "type": "quantitative", "title": "precision", "scale": {"zero": false}}, "color": {"field": "rev", "type": "nominal"}}}, {"transform": [{"calculate": "datum.rev", "as": "pivot_field"}, {"pivot": "pivot_field", "op": "mean", "value": "precision", "groupby": ["step"]}], "mark": {"type": "rule", "tooltip": {"content": "data"}, "stroke": "grey"}, "encoding": {"opacity": {"condition": {"value": 0.3, "param": "hover", "empty": false}, "value": 0}}, "params": [{"name": "hover", "select": {"type": "point", "fields": ["step"], "nearest": true, "on": "mouseover", "clear": "mouseout"}}]}]};
vegaEmbed('#static_train_precision', spec);
</script>
</div>
</body>
</html>

View File

@ -0,0 +1,73 @@
# eval.py
#
# author: deng
# date : 20260618
import torch
from dvclive import Live
from torch.utils.data import DataLoader
from torchmetrics import MetricCollection
from torchmetrics.classification import Accuracy, ConfusionMatrix, F1Score, Precision, Recall
from quickdraw_bot.utils.dataset import QuickDrawDataset
from quickdraw_bot.utils.utils import load_config
class Eval:
def __init__(self, config_path: str = './assets/config.yaml'):
self.config = load_config(config_path)['eval']
self._device = torch.device('mps' if torch.mps.is_available() else 'cpu')
def _get_dataloader(self):
test_dataset = QuickDrawDataset(data_dir=self.config['test_data_dir'], return_cate_name=False)
test_dataloader = DataLoader(test_dataset, batch_size=1, shuffle=False)
return test_dataloader
def _get_model(self) -> tuple[torch.nn.Module, int]:
model = torch.load(self.config['model_path'], map_location=self._device, weights_only=False)
model.eval()
num_classes = [m for m in model.modules() if isinstance(m, torch.nn.Linear)][-1].out_features
return model, num_classes
def _get_metrics(self, num_classes: int) -> tuple[MetricCollection, ConfusionMatrix]:
metric_collection = MetricCollection(
[
Accuracy(task='multiclass', num_classes=num_classes, top_k=1),
Precision(task='multiclass', num_classes=num_classes, average='macro'),
Recall(task='multiclass', num_classes=num_classes, average='macro'),
F1Score(task='multiclass', num_classes=num_classes, average='macro'),
]
).to(self._device)
confusion_matrix = ConfusionMatrix(
task='multiclass',
threshold=0.5,
num_classes=num_classes,
).to(self._device)
return metric_collection, confusion_matrix
def run(self):
test_dataloader = self._get_dataloader()
model, num_classes = self._get_model()
metrics, confusion_matrix = self._get_metrics(num_classes=num_classes)
with Live(dir='./doc/exp/eval', dvcyaml='./assets/dvc.yaml') as live:
metrics.reset()
with torch.no_grad():
for inputs, targets in test_dataloader:
inputs = inputs.to(self._device)
targets = targets.to(self._device)
outputs = model(inputs)
metrics.update(outputs, targets)
confusion_matrix.update(outputs, targets)
test_metrics = metrics.compute()
confusion_matrix_fig, _ = confusion_matrix.plot()
live.log_metric('test/accuracy', test_metrics['MulticlassAccuracy'].item())
live.log_metric('test/precision', test_metrics['MulticlassPrecision'].item())
live.log_metric('test/recall', test_metrics['MulticlassRecall'].item())
live.log_metric('test/f1', test_metrics['MulticlassF1Score'].item())
live.log_image('test_confusion_matrix.png', confusion_matrix_fig)
if __name__ == '__main__':
Eval().run()

View File

@ -0,0 +1,92 @@
# prepare.py
#
# author: deng
# date : 20260616
import json
import random
from pathlib import Path
from shutil import rmtree
import numpy as np
from quickdraw_bot.utils.utils import load_config
class Prepare:
def __init__(self, config_path: str = './assets/config.yaml'):
self.config = load_config(config_path)['prepare']
self._set_random_seed()
def _set_random_seed(self):
random.seed(self.config['random_seed'])
np.random.seed(self.config['random_seed'])
def _load_dataset(self) -> tuple[dict[str, np.ndarray], dict[str, int]]:
data: dict[str, list] = {'images': [], 'cate_names': [], 'cate_ids': []}
cls_id_map: dict[str, int] = {}
raw_data_dir = Path(self.config['data_dir']) / 'raw'
for npy_file in sorted(raw_data_dir.glob('*.npy')):
class_name = npy_file.stem.removeprefix('full_numpy_bitmap_')
if class_name not in cls_id_map:
cls_id_map[class_name] = len(cls_id_map)
images = np.load(npy_file) # shape: (N, 784)
images = images.reshape(-1, 1, 28, 28) # shape: (N, 1, 28, 28)
images = images.astype(np.int8)
if images.shape[0] < self.config['num_of_img_per_class']:
print(f'Class {class_name} has less than {self.config["num_of_img_per_class"]} samples, keep all')
data['images'].extend(images)
data['cate_names'].extend([class_name] * images.shape[0])
data['cate_ids'].extend([cls_id_map[class_name]] * images.shape[0])
else:
random_indice = np.random.choice(images.shape[0], self.config['num_of_img_per_class'], replace=False)
data['images'].extend(images[random_indice])
data['cate_names'].extend([class_name] * self.config['num_of_img_per_class'])
data['cate_ids'].extend([cls_id_map[class_name]] * self.config['num_of_img_per_class'])
data['images'] = np.array(data['images']).astype(np.uint8)
data['cate_names'] = np.array(data['cate_names']).astype('S30')
data['cate_ids'] = np.array(data['cate_ids']).astype(np.uint16)
return data, cls_id_map
def _split_data(self, data: dict[str, np.ndarray]) -> dict[str, dict[str, np.ndarray]]:
weights = self.config['data_split']
if abs(sum(weights.values()) - 1.0) > 1e-6:
raise ValueError('Sum of data_split weights must be 1.0')
element_count = len(next(iter(data.values())))
shuffled_indices = np.random.permutation(element_count)
sets: dict[str, dict[str, np.ndarray]] = {}
start = 0
for i, (name, weight) in enumerate(weights.items()):
if i == len(weights) - 1:
idx = shuffled_indices[start:]
else:
end = start + round(weight * element_count)
idx = shuffled_indices[start:end]
start = end
sets[name] = {key: value[idx] for key, value in data.items()}
return sets
def _save_data(self, sets: dict[str, dict[str, np.ndarray]], cls_id_map: dict[str, int]) -> None:
save_dir = Path(self.config['data_dir']) / 'processed'
if save_dir.exists():
rmtree(save_dir)
save_dir.mkdir()
for usage, data in sets.items():
usage_dir = save_dir / usage
usage_dir.mkdir()
for key, value in data.items():
np.save(f'{usage_dir}/{key}.npy', value)
cate_id_cate_name_map = {v: k for k, v in cls_id_map.items()}
with open(f'{save_dir}/cate_id_cate_name_map.json', 'w') as f:
json.dump(cate_id_cate_name_map, f, indent=2)
def run(self):
data, cls_id_map = self._load_dataset()
sets = self._split_data(data)
self._save_data(sets, cls_id_map)
if __name__ == '__main__':
Prepare().run()

98
quickdraw_bot/to_onnx.py Normal file
View File

@ -0,0 +1,98 @@
# to_onnx.py
#
# author: deng
# date : 20260618
import json
import time
from pathlib import Path
import cv2
import numpy as np
import onnxruntime as ort
import torch
from quickdraw_bot.utils.utils import load_config
class Pipeline(torch.nn.Module):
def __init__(self, model: torch.nn.Module, input_size: tuple[int, int]):
super().__init__()
self._model = model
self._input_size = input_size
def forward(self, inputs: torch.Tensor) -> torch.Tensor:
inputs = inputs.float() / 255.0
inputs = torch.nn.functional.interpolate(inputs, size=self._input_size, mode='bilinear', align_corners=False)
logits = self._model(inputs)
probs = torch.nn.functional.softmax(logits, dim=-1)
return probs
class ToONNX:
def __init__(self, config_path: str = './assets/config.yaml'):
self.config = load_config(config_path)['to_onnx']
def _get_cls_map(self) -> dict[int, str]:
cls_map_path = Path(self.config['cls_map_path'])
if not cls_map_path.exists():
return None
with open(cls_map_path, 'r') as f:
cls_map = json.load(f)
return cls_map
def _get_model(self) -> torch.nn.Module:
model = torch.load(self.config['model_path'], map_location='cpu', weights_only=False)
model.eval()
return model
def _get_pipeline(self) -> torch.nn.Module:
pipeline = Pipeline(
model=self._get_model(),
input_size=tuple(self.config['image_size']),
)
return pipeline
def run(self) -> None:
pipeline = self._get_pipeline()
dummy_input = torch.randint(0, 256, (1, 1, self.config['image_size'][0], self.config['image_size'][1]), dtype=torch.uint8)
torch.onnx.export(
pipeline,
dummy_input,
self.config['onnx_path'],
input_names=['inputs'],
output_names=['outputs'],
dynamic_axes={'inputs': {0: 'batch_size', 2: 'height', 3: 'width'}, 'outputs': {0: 'batch_size'}},
opset_version=18,
dynamo=False,
verbose=True,
)
print(f'Done! ONNX file saved to {self.config["onnx_path"]}')
def test_infer(self, image_path: str) -> None:
# Get cls map
cls_map: dict[str, str] = self._get_cls_map()
cls_names = list(cls_map.values())
# Load Image
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = image[np.newaxis, np.newaxis, :, :]
# Infer
onnx_session = ort.InferenceSession(
self.config['onnx_path'],
providers=['CPUExecutionProvider'],
)
start_time = time.perf_counter()
outputs = onnx_session.run(None, {'inputs': image})[0]
elapsed_time_ms = (time.perf_counter() - start_time) * 1000
result = [{cls_name: round(float(prob), 3) for cls_name, prob in zip(cls_names, prob_arr)} for prob_arr in outputs]
print(f'Elapsed time: {elapsed_time_ms:.2f} ms')
print(f'Image: {image_path}')
print(f'Result: {result}')
if __name__ == '__main__':
ToONNX().run()
ToONNX().test_infer('./assets/favicon.png')

View File

@ -0,0 +1,168 @@
# train.py
#
# author: deng
# date : 20260617
import random
import numpy as np
import torch
from dvclive import Live
from torch.utils.data import DataLoader
from torchmetrics import MetricCollection
from torchmetrics.classification import Accuracy, ConfusionMatrix, F1Score, Precision, Recall
from tqdm import tqdm
from quickdraw_bot.utils.dataset import QuickDrawDataset
from quickdraw_bot.utils.model import BabyCNN
from quickdraw_bot.utils.utils import load_config
class Train:
def __init__(self, config_path: str = './assets/config.yaml'):
self.config = load_config(config_path)['train']
self._device = torch.device(self.config['device_type'])
self._ensure_reproducibility()
def _ensure_reproducibility(self) -> None:
torch.use_deterministic_algorithms(mode=True, warn_only=True)
random.seed(self.config['random_seed'])
np.random.seed(self.config['random_seed'])
torch.manual_seed(self.config['random_seed'])
def _get_dataloader(self):
train_dataset = QuickDrawDataset(
data_dir=self.config['train_data_dir'],
enable_data_aug=True,
file_lazy_load=self.config['file_lazy_load'],
return_cate_name=False,
# vis_dir='./tmp'
)
valid_dataset = QuickDrawDataset(
data_dir=self.config['valid_data_dir'],
enable_data_aug=False,
file_lazy_load=self.config['file_lazy_load'],
return_cate_name=False,
)
train_dataloader = DataLoader(
train_dataset,
batch_size=self.config['batch_size'],
shuffle=True,
num_workers=4,
pin_memory=False, # not support for mps
persistent_workers=True,
)
valid_dataloader = DataLoader(
valid_dataset,
batch_size=self.config['batch_size'],
shuffle=False,
num_workers=1,
pin_memory=False, # not support for mps
persistent_workers=True,
)
return train_dataloader, valid_dataloader
def _get_model(self) -> torch.nn.Module:
model = BabyCNN(num_classes=self.config['num_of_class'], dropout_p=0.3).to(self._device)
model.train()
return model
def _get_optimizer(self, model: torch.nn.Module) -> torch.optim.Optimizer:
if self.config['optimizer_name'] == 'adam':
optimizer = torch.optim.Adam(model.parameters(), lr=self.config['learning_rate'])
elif self.config['optimizer_name'] == 'sgd':
optimizer = torch.optim.SGD(model.parameters(), lr=self.config['learning_rate'])
else:
raise ValueError(f'Unknown optimizer name: {self.config["optimizer_name"]}')
return optimizer
def _get_scheduler(self, optimizer: torch.optim.Optimizer) -> torch.optim.lr_scheduler._LRScheduler:
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=1, eta_min=0.0001)
if self.config['warmup_epochs'] > 0:
warmup = torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=0.01, end_factor=1.0, total_iters=self.config['warmup_epochs'])
scheduler = torch.optim.lr_scheduler.SequentialLR(optimizer, schedulers=[warmup, scheduler], milestones=[self.config['warmup_epochs']])
return scheduler
def _get_loss(self) -> torch.nn.modules.loss._Loss:
loss = torch.nn.CrossEntropyLoss(label_smoothing=0.1).to(self._device)
return loss
def _get_metrics(self) -> tuple[MetricCollection, ConfusionMatrix]:
metric_collection = MetricCollection(
[
Accuracy(task='multiclass', num_classes=self.config['num_of_class'], top_k=1),
Precision(task='multiclass', num_classes=self.config['num_of_class'], average='macro'),
Recall(task='multiclass', num_classes=self.config['num_of_class'], average='macro'),
F1Score(task='multiclass', num_classes=self.config['num_of_class'], average='macro'),
]
).to(self._device)
confusion_matrix = ConfusionMatrix(
task='multiclass',
threshold=0.5,
num_classes=self.config['num_of_class'],
).to(self._device)
return metric_collection, confusion_matrix
def run(self):
train_dataloader, valid_dataloader = self._get_dataloader()
model = self._get_model()
optimizer = self._get_optimizer(model)
scheduler = self._get_scheduler(optimizer)
loss = self._get_loss()
metrics, _ = self._get_metrics()
with Live(dir='./doc/exp/train', report='html', dvcyaml='./assets/dvc.yaml', exp_message=self.config['exp_msg']) as live:
for epoch in tqdm(range(self.config['num_of_epochs']), desc='Training Epoch'):
metrics.reset()
model.train()
total_train_loss = 0.0
for inputs, targets in train_dataloader:
inputs = inputs.to(self._device)
targets = targets.to(self._device)
optimizer.zero_grad()
outputs = model(inputs)
train_loss = loss(outputs, targets)
total_train_loss += train_loss.item()
train_loss.backward()
optimizer.step()
metrics.update(outputs, targets)
train_metrics = metrics.compute()
avg_train_loss = total_train_loss / len(train_dataloader)
train_learning_rate = round(optimizer.param_groups[0]['lr'], 6)
metrics.reset()
model.eval()
total_valid_loss = 0.0
with torch.no_grad():
for inputs, targets in valid_dataloader:
inputs = inputs.to(self._device)
targets = targets.to(self._device)
outputs = model(inputs)
valid_loss = loss(outputs, targets)
total_valid_loss += valid_loss.item()
metrics.update(outputs, targets)
valid_metrics = metrics.compute()
avg_valid_loss = total_valid_loss / len(valid_dataloader)
live.log_metric('train/loss', avg_train_loss)
live.log_metric('train/learning_rate', train_learning_rate)
live.log_metric('train/accuracy', train_metrics['MulticlassAccuracy'].item())
live.log_metric('train/precision', train_metrics['MulticlassPrecision'].item())
live.log_metric('train/recall', train_metrics['MulticlassRecall'].item())
live.log_metric('train/f1', train_metrics['MulticlassF1Score'].item())
live.log_metric('valid/loss', avg_valid_loss)
live.log_metric('valid/accuracy', valid_metrics['MulticlassAccuracy'].item())
live.log_metric('valid/precision', valid_metrics['MulticlassPrecision'].item())
live.log_metric('valid/recall', valid_metrics['MulticlassRecall'].item())
live.log_metric('valid/f1', valid_metrics['MulticlassF1Score'].item())
scheduler.step()
live.next_step()
torch.save(model, './assets/model.pth')
if __name__ == '__main__':
Train().run()

View File

@ -0,0 +1,87 @@
# dataset.py
#
# author: deng
# date : 20260617
from pathlib import Path
import numpy as np
import torch
from torchvision.transforms import v2
class QuickDrawDataset(torch.utils.data.Dataset):
def __init__(
self,
data_dir: str,
image_shape: tuple[int, int, int] = (1, 28, 28),
enable_data_aug: bool = False,
file_lazy_load: bool = False,
return_cate_name: bool = False,
vis_dir: str = None,
) -> None:
super().__init__()
self._images: torch.Tensor | np.ndarray = None
self._cate_names: list[str] = []
self._cate_ids: torch.Tensor = []
self._transform: callable = None
self._enable_data_aug = enable_data_aug
self._data_dir = Path(data_dir)
self._image_shape = image_shape
self._file_lazy_load = file_lazy_load
self._return_cate_name = return_cate_name
self._vis_dir = Path(vis_dir) if vis_dir is not None else None
self._set_data_transform()
self._collect_data()
def _set_data_transform(self) -> None:
aug_pipeline = []
if self._enable_data_aug:
aug_pipeline = [
v2.RandomHorizontalFlip(p=0.2),
v2.RandomApply([v2.RandomAffine(degrees=(-30, 30), translate=(0.2, 0.2), scale=(0.8, 1.2), shear=(-10, 10))], p=0.5),
v2.RandomPerspective(distortion_scale=0.15, p=0.2),
v2.RandomApply([v2.ElasticTransform(alpha=15.0, sigma=3.0)], p=0.2),
v2.RandomErasing(p=0.2, scale=(0.02, 0.2)),
]
self._transform = v2.Compose(
[
*aug_pipeline,
v2.Resize(self._image_shape[1:]),
v2.ToDtype(torch.float32, scale=True),
]
)
def _collect_data(self) -> None:
self._cate_names = [cate_name.decode() for cate_name in np.load(self._data_dir / 'cate_names.npy')]
self._cate_ids = torch.from_numpy(np.load(self._data_dir / 'cate_ids.npy')).long()
if self._file_lazy_load:
self._images = np.load(self._data_dir / 'images.npy', mmap_mode='r')
else:
self._images = torch.from_numpy(np.load(self._data_dir / 'images.npy'))
def __len__(self) -> int:
return len(self._cate_ids)
def __getitem__(self, index: int) -> tuple[torch.Tensor, torch.Tensor]:
if self._file_lazy_load:
x = torch.from_numpy(self._images[index])
else:
x = self._images[index]
x = self._transform(x)
y = self._cate_ids[index]
if self._vis_dir is not None:
vis_path = self._vis_dir / f'{index:05d}_{self._cate_names[index]}.png'
if not vis_path.exists():
v2.ToPILImage()(x).save(vis_path)
if self._return_cate_name:
return x, y, self._cate_names[index]
return x, y
def set_data_aug(self, enable_data_aug: bool) -> None:
self._enable_data_aug = enable_data_aug
self._set_data_transform()

View File

@ -0,0 +1,51 @@
# model.py
#
# author: deng
# date : 20260617
import torch
import torch.nn as nn
import torch.nn.functional as F
class BabyCNN(nn.Module):
def __init__(self, num_classes: int = 10, dropout_p: float = 0.5) -> None:
super().__init__()
# Conv Block 1: 28x28 -> 14x14
self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1)
self.bn1 = nn.BatchNorm2d(num_features=32)
# Conv Block 2: 14x14 -> 7x7
self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(num_features=64)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.dropout = nn.Dropout(p=dropout_p)
# FC Layers
self.fc1 = nn.Linear(in_features=64 * 7 * 7, out_features=128)
self.fc2 = nn.Linear(in_features=128, out_features=num_classes)
self._init_weights()
def _init_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
if m.bias is not None:
nn.init.zeros_(m.bias)
elif isinstance(m, nn.BatchNorm2d):
nn.init.ones_(m.weight)
nn.init.zeros_(m.bias)
elif isinstance(m, nn.Linear):
nn.init.kaiming_normal_(m.weight, nonlinearity='relu')
nn.init.zeros_(m.bias)
def forward(self, x: torch.Tensor) -> torch.Tensor:
x = self.pool(F.relu(self.bn1(self.conv1(x))))
x = self.pool(F.relu(self.bn2(self.conv2(x))))
x = x.view(x.size(0), -1)
x = self.dropout(F.relu(self.fc1(x)))
x = self.fc2(x)
return x

View File

@ -0,0 +1,8 @@
# utils.py
import yaml
def load_config(config_path: str) -> dict:
with open(config_path, 'r') as f:
return yaml.safe_load(f)

0
tests/__init__.py Normal file
View File

23
tests/test_utils.py Normal file
View File

@ -0,0 +1,23 @@
# test_utils.py
import pytest
from quickdraw_bot.utils.utils import load_config
class TestUtils:
def test_load_config_load_valid_yaml(self, tmp_path):
config_file = tmp_path / 'config.yaml'
config_file.write_text('key: value\nnested:\n a: 1\n')
result = load_config(str(config_file))
assert result == {'key': 'value', 'nested': {'a': 1}}
def test_load_config_returns_dict(self, tmp_path):
config_file = tmp_path / 'config.yaml'
config_file.write_text('foo: bar\n')
result = load_config(str(config_file))
assert isinstance(result, dict)
def test_load_config_file_not_found(self):
with pytest.raises(FileNotFoundError):
load_config('/nonexistent/path/config.yaml')

327
uv.lock generated
View File

@ -152,6 +152,18 @@ version = "4.9.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" }
[[package]]
name = "anyio"
version = "4.14.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "idna" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ba/16/9826f089383c593cdfc4a6e5aca94d9e91ae1692c57af82c3b2aa5e810f7/anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9", size = 123506, upload-time = "2026-06-15T22:00:47.595Z" },
]
[[package]]
name = "appdirs"
version = "1.4.4"
@ -408,6 +420,61 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a6/c4/0679472c60052c27efa612b4cd3ddd2a23e885dcdc73461781d2c802d39e/configobj-5.0.9-py2.py3-none-any.whl", hash = "sha256:1ba10c5b6ee16229c79a05047aeda2b55eb4e80d7c7d8ecf17ec1ca600c79882", size = 35615, upload-time = "2024-11-26T14:03:32.972Z" },
]
[[package]]
name = "contourpy"
version = "1.3.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
]
sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" },
{ url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" },
{ url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" },
{ url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" },
{ url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" },
{ url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" },
{ url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" },
{ url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" },
{ url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" },
{ url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" },
{ url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" },
{ url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" },
{ url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" },
{ url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" },
{ url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" },
{ url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" },
{ url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" },
{ url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" },
{ url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" },
{ url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" },
{ url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" },
{ url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" },
{ url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" },
{ url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" },
{ url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" },
{ url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" },
{ url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" },
{ url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" },
{ url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" },
{ url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" },
{ url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" },
{ url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" },
{ url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" },
{ url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" },
{ url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" },
{ url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" },
{ url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" },
{ url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" },
{ url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" },
{ url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" },
{ url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" },
{ url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" },
{ url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" },
{ url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" },
]
[[package]]
name = "cryptography"
version = "49.0.0"
@ -522,6 +589,15 @@ nvtx = [
{ name = "nvidia-nvtx", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]
[[package]]
name = "cycler"
version = "0.12.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
]
[[package]]
name = "dictdiffer"
version = "0.9.0"
@ -738,6 +814,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/64/bf/f23e8eff38556d479ab421f8b9ac9a9a0b44f8400098c934dce0607da1de/dvc_task-0.40.2-py3-none-any.whl", hash = "sha256:3891b94cf9d349072ee32ce47217b73530b1905e6dd5a1e378bd74afc8b4c030", size = 21392, upload-time = "2024-10-08T12:47:30.317Z" },
]
[[package]]
name = "dvc-webdav"
version = "3.0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "dvc" },
{ name = "webdav4" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a0/12/71c963fa0f1c1200983c40ab54978ba36e2a459a646c7266248c8594dd37/dvc_webdav-3.0.1.tar.gz", hash = "sha256:3c0d04afb0985a2c156f0b719f4b9437ce4acd346647d8f6fee043b5e917c76e", size = 15411, upload-time = "2025-12-05T04:43:49.677Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2c/5a/018ee41cc0e8ea88823b1dccaa97d02597f7cdcd80840acd18ec707c753d/dvc_webdav-3.0.1-py3-none-any.whl", hash = "sha256:e7ad8d1d1a1cb04505752a71474d183f934a493acc5deb07a72530e6cfd03448", size = 13338, upload-time = "2025-12-05T04:43:48.536Z" },
]
[[package]]
name = "dvclive"
version = "3.49.1"
@ -806,6 +895,39 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c9/67/97efedcd446c8561e3430d35a2ed6c467df724cc2e44dea5dd8a1e62d4cd/flufl_lock-9.1.0-py3-none-any.whl", hash = "sha256:84d7c85628604dc878fea29bf19262498aec1bd3f162f83be291507169681a9b", size = 11234, upload-time = "2026-04-27T18:38:16.697Z" },
]
[[package]]
name = "fonttools"
version = "4.63.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" },
{ url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" },
{ url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" },
{ url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" },
{ url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" },
{ url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" },
{ url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" },
{ url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" },
{ url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" },
{ url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" },
{ url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" },
{ url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" },
{ url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" },
{ url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" },
{ url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" },
{ url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" },
{ url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" },
{ url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" },
{ url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" },
{ url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" },
{ url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" },
{ url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" },
{ url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" },
{ url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" },
{ url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" },
]
[[package]]
name = "frozenlist"
version = "1.8.0"
@ -962,6 +1084,43 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/8f/b3/6086ab9cfd4a27517a1269e8b7c48621beb79ccc0affd2485b9747976bfe/gto-1.9.0-py3-none-any.whl", hash = "sha256:e94371a67c25256f973722c5891e551ca3cd8cc25864dcf468f2b16e6bcca6b8", size = 45038, upload-time = "2025-10-08T17:05:26.947Z" },
]
[[package]]
name = "h11"
version = "0.16.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
]
[[package]]
name = "httpcore"
version = "1.0.9"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
]
[[package]]
name = "httpx"
version = "0.28.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "certifi" },
{ name = "httpcore" },
{ name = "idna" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
]
[[package]]
name = "hydra-core"
version = "1.3.3"
@ -1030,6 +1189,73 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
]
[[package]]
name = "kiwisolver"
version = "1.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" },
{ url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" },
{ url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" },
{ url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" },
{ url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" },
{ url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" },
{ url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" },
{ url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" },
{ url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" },
{ url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" },
{ url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" },
{ url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" },
{ url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" },
{ url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" },
{ url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" },
{ url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" },
{ url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" },
{ url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" },
{ url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" },
{ url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" },
{ url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" },
{ url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" },
{ url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" },
{ url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" },
{ url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" },
{ url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" },
{ url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" },
{ url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" },
{ url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" },
{ url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" },
{ url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" },
{ url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" },
{ url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" },
{ url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" },
{ url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" },
{ url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" },
{ url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" },
{ url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" },
{ url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" },
{ url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" },
{ url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" },
{ url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" },
{ url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" },
{ url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" },
{ url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" },
{ url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" },
{ url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" },
{ url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" },
{ url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" },
{ url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" },
{ url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" },
{ url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" },
{ url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" },
{ url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" },
{ url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" },
{ url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" },
{ url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" },
{ url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" },
{ url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" },
]
[[package]]
name = "kombu"
version = "5.6.2"
@ -1122,6 +1348,53 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
]
[[package]]
name = "matplotlib"
version = "3.11.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "contourpy" },
{ name = "cycler" },
{ name = "fonttools" },
{ name = "kiwisolver" },
{ name = "numpy" },
{ name = "packaging" },
{ name = "pillow" },
{ name = "pyparsing" },
{ name = "python-dateutil" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1f/24/080c99d223d158d3a8902769269ab6da5b50f7a0e6e072513907e02b7a6c/matplotlib-3.11.0.tar.gz", hash = "sha256:68c0c7be01b30dcca3638934f7f591df73401235cbdbf0d1ab1c71e7db7f8b57", size = 33251176, upload-time = "2026-06-12T02:29:15.508Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/55/41/aa47f156b061d14c98b906f76c428507397708ec63ff94f410ae1752b426/matplotlib-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce3b839b34ae1f430b4616893a2945a2999debaa7e94e7e29a2a8bbf286f7b5", size = 9450532, upload-time = "2026-06-12T02:28:06.769Z" },
{ url = "https://files.pythonhosted.org/packages/8c/4f/5a9eb0375e81413953febf8af7b012a6b6357f53438a15c4f5ad86c6bbb5/matplotlib-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:373db8f91214e8ccaf35ac833cc1dd59dd961e148bbd55dd027141591dde1313", size = 9279760, upload-time = "2026-06-12T02:28:09.152Z" },
{ url = "https://files.pythonhosted.org/packages/a4/c0/1117d53077e3ac3152503a84e9cf7a5c239576805ee71276e80c2aaa7471/matplotlib-3.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be152b7570324dc8d01574cc9474dd2d803237acf528bcbb5b211fa347461a09", size = 10031623, upload-time = "2026-06-12T02:28:11.26Z" },
{ url = "https://files.pythonhosted.org/packages/92/7e/e937138daffad65b71bf831a377809dcbc830fb4f31a31e067dc1faa2575/matplotlib-3.11.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:126f256df600652d7e4b394cf3164ff75210a00038f287c95a012a6f58d0e83f", size = 10839372, upload-time = "2026-06-12T02:28:14.102Z" },
{ url = "https://files.pythonhosted.org/packages/1d/c2/438ecc197ffb8023b6b9922915542f2172f5fd45b76703b0b4fc47322243/matplotlib-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:03acfeddf87b0dddb11b081ef7740ad445a3ca8bcb6b8e3011b08f2cf802b75c", size = 10924099, upload-time = "2026-06-12T02:28:16.383Z" },
{ url = "https://files.pythonhosted.org/packages/40/2e/395883da416f378b3ed2c9f3e843ac477eae1ce731b671b79adaa6f0bacd/matplotlib-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:ab3722f04f3ff34c23b5012c5873d2894174e06c3822fcdac3610965a5ac7d06", size = 9329727, upload-time = "2026-06-12T02:28:18.581Z" },
{ url = "https://files.pythonhosted.org/packages/61/82/2c388956abf8bf392dfb5b8917c502f1082df6a941b781ab8c8e5ba2474b/matplotlib-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c945824670fb8915b4ac879e5e61f3c58e0913022f70a0de4c082b17372f8771", size = 9003506, upload-time = "2026-06-12T02:28:20.474Z" },
{ url = "https://files.pythonhosted.org/packages/c8/c1/34454baa44da7975ada82e9aea37105ec47059514dc967d3be14426ba8dc/matplotlib-3.11.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3489c3dc487669b4a980bc3068f87856de7a1564248d3f6c629efb2a58b03f24", size = 9499838, upload-time = "2026-06-12T02:28:22.713Z" },
{ url = "https://files.pythonhosted.org/packages/b1/c3/98fe79a398cf232219f090163a7fa7e6766e9f2e0ad26df54d6f8934d8ee/matplotlib-3.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6a98f5476ce784a50ce09998f4ae1e6a9f25043cef8a480c98949902eda74620", size = 9332298, upload-time = "2026-06-12T02:28:24.796Z" },
{ url = "https://files.pythonhosted.org/packages/95/e4/b4b7c33151e74e5c802f3cde1ba807ebfc38401e329b44e215a5888dd76d/matplotlib-3.11.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:565af866fd63e4bd3f987d580afe27c44c2552a3b3305f4ecbb85133601ea6f3", size = 10045491, upload-time = "2026-06-12T02:28:27.141Z" },
{ url = "https://files.pythonhosted.org/packages/71/28/394548efd68354110c1a1be11fe6b6e559e06d1a23da35908a0e316c55a9/matplotlib-3.11.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6b3e64dea5062c570f04358e2711859f3531b459f29516274fbad889079e4f3", size = 10857059, upload-time = "2026-06-12T02:28:29.222Z" },
{ url = "https://files.pythonhosted.org/packages/c8/44/e7922e6e2a4d63bdfbc9dc4a53e3850ab438d46cf42e6779bb15ec92c948/matplotlib-3.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:942b37c5db1899610bd1543ce8e13e4ecff9a4633e7f63bb6aa9205d2644ebd1", size = 10939576, upload-time = "2026-06-12T02:28:31.66Z" },
{ url = "https://files.pythonhosted.org/packages/3d/be/b1ca96003a441d619b727fee21d671fdff7a5ce2f1bb797b2521aa2f679a/matplotlib-3.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:c08e649a6313e1291e713623b97a38e5bb4aa580b2a100a94a3309bc6b9c8eb3", size = 9379519, upload-time = "2026-06-12T02:28:33.888Z" },
{ url = "https://files.pythonhosted.org/packages/e3/72/4bf3b91821c34596dd6a7bdac5836d94f744144c8208939ef49d8ec43f7e/matplotlib-3.11.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2746cd2c113742ff6ce37a864c5ac5fd7aa644568f445e66166e457ac78e40e0", size = 9055456, upload-time = "2026-06-12T02:28:35.878Z" },
{ url = "https://files.pythonhosted.org/packages/57/52/a94102ac99eb78e2fe9b826674f9ef9ee23327110ea6ab4776c1b4eb6209/matplotlib-3.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3338e3e3de128cf50d0d2fb92a122815daf9c755bd882a474343c05f8fd7ec79", size = 9452137, upload-time = "2026-06-12T02:28:37.93Z" },
{ url = "https://files.pythonhosted.org/packages/7c/03/b8cdb625a21f710dfa11bbca1f48fb4057d2c0286975f8b415bf80942c99/matplotlib-3.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:25c2e5455efd8d99f41fb79871a31feb7d301569642e332ec58d72cfe9282bc3", size = 9281514, upload-time = "2026-06-12T02:28:40.028Z" },
{ url = "https://files.pythonhosted.org/packages/b7/2d/4e1240ea82ee197dfb3851e71f71c87eeeb975f1753b56a0588e4e80739a/matplotlib-3.11.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9695457a467ff86d23f35037a43deb6f1134dd6d3e2ac8ce1e2087cff09ffb9", size = 10843005, upload-time = "2026-06-12T02:28:42.39Z" },
{ url = "https://files.pythonhosted.org/packages/29/dc/6377ecfaa5fef79430f74a1a16638b4e2aa30d4692bae2c19f9d76fe3b01/matplotlib-3.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19c16c61dea63b3582918503e6b294193961261d9daa806d4ae2151f1ad05430", size = 11127459, upload-time = "2026-06-12T02:28:44.483Z" },
{ url = "https://files.pythonhosted.org/packages/6f/41/795c405aa7560443a3b01309424cde4a1113b85c90b8a63417444a749617/matplotlib-3.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2d72ea8b7924f3cb955e61518d21e43b3df1e6c8a793b480a0c1214f185d30ba", size = 10925160, upload-time = "2026-06-12T02:28:46.564Z" },
{ url = "https://files.pythonhosted.org/packages/1a/f7/3a9e6389a7cfaeff76c56e40c2dabcb13110e21e82f837228c834ebe748c/matplotlib-3.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:1c02da0a629dfa9debf52725ea06866b74c1fb70a895bae05e4493d34074f9f2", size = 9485186, upload-time = "2026-06-12T02:28:49.344Z" },
{ url = "https://files.pythonhosted.org/packages/8b/c0/396478ee7cf2091d182db8b4a8695f6a37f1ddb978989cf9dbb84cd5c123/matplotlib-3.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aa55d73b3117d4b07f959cd9eb6f69b375d8df3414139c479388e551aa5d999d", size = 9160349, upload-time = "2026-06-12T02:28:51.382Z" },
{ url = "https://files.pythonhosted.org/packages/c5/6f/1c3bd51bb2b34eaacdcf3c3d859dbb357f952fc8020c617dc118ad7c9e38/matplotlib-3.11.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a9d8c6e7cd2f0ddf11d8d92e520dd1d9d2abb0cf6ac8831e338666c81e905847", size = 9500921, upload-time = "2026-06-12T02:28:53.443Z" },
{ url = "https://files.pythonhosted.org/packages/e0/0d/4d861d0121840cb1a3fd4a10deb211efd6fccd481ed23e553f31f4f4da4a/matplotlib-3.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:be050fcf32f729eda99f7f75a80bf67612ce16ab9ac1c23a387dcaede95cb70e", size = 9332190, upload-time = "2026-06-12T02:28:55.623Z" },
{ url = "https://files.pythonhosted.org/packages/4b/cb/22f6bc35711a0b5639a784e74e653e77c86210bd4304449dd399a482f74e/matplotlib-3.11.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfabef0230d0697aa0d717385194dd41162e00207a68bf4abf94c2bf4c27dca0", size = 10854181, upload-time = "2026-06-12T02:28:57.856Z" },
{ url = "https://files.pythonhosted.org/packages/3f/7e/9a9eaca731a2939589da520f0ebe8fd8753d0f51fca98c7d20af6dbe261a/matplotlib-3.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1644db30e759199443493ac5e5caec24fdb775a8f6123021f85ba47c4133c3cb", size = 11137715, upload-time = "2026-06-12T02:29:00.555Z" },
{ url = "https://files.pythonhosted.org/packages/ef/f9/9b030b6088354acb0296871bb624b25befc1c42509d3c6cd17420c83a5b8/matplotlib-3.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15b0d160079cb10699a0e98b5989c70677b2df7cacdc62af67c30f2facec46d9", size = 10939427, upload-time = "2026-06-12T02:29:02.527Z" },
{ url = "https://files.pythonhosted.org/packages/59/94/6b273eaee4ee250863567d100865da61a5c1527fa67f527b7ed22e0dd29c/matplotlib-3.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:446307e6b04b57b1f1239e228a1ec2af0d589a1008cebc3dfa3f5441d095cfb6", size = 9535809, upload-time = "2026-06-12T02:29:04.994Z" },
{ url = "https://files.pythonhosted.org/packages/60/95/1d36bddf2b7e2692c1540e78a6e5bc88bc1496b137e3e35a611f91b65ac3/matplotlib-3.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:652fb5696271d4c50f196d22a5ff4f8e4444c74f847423570d7dc0aa2bbd0159", size = 9209226, upload-time = "2026-06-12T02:29:07.033Z" },
]
[[package]]
name = "mdurl"
version = "0.1.2"
@ -1520,6 +1793,22 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/00/50/257a880384a1dd502d543b0067945074d63cd17d0840e958355bc8197da8/onnx-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:8e268cdc0547e3949799ffd4a44451dc2b9080b57d0824a2db680b6ec65506f0", size = 17231391, upload-time = "2026-06-15T12:50:03.047Z" },
]
[[package]]
name = "onnx-ir"
version = "0.2.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ml-dtypes" },
{ name = "numpy" },
{ name = "onnx" },
{ name = "sympy" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/35/e6/672fefb2f108d077f58181a7babf4c0f8d1182a30353ffc9c79c63afc5ee/onnx_ir-0.2.1.tar.gz", hash = "sha256:8b8b10a93f43e65962104de6070c43c5dacb0e3cdfefc7c8059dd83c9db64f35", size = 144279, upload-time = "2026-04-20T20:21:47.735Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8c/aa/f7a53321c60b9ad9ee184b6018292ed6b5389947592a2c8c09c736bb7f9e/onnx_ir-0.2.1-py3-none-any.whl", hash = "sha256:c7285da889312f91882de2092e298a9eeeefbfc1d1951c49d983992967eb09a7", size = 166792, upload-time = "2026-04-20T20:21:46.357Z" },
]
[[package]]
name = "onnxruntime"
version = "1.27.0"
@ -1547,6 +1836,23 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/f6/2bac21f722aa45d876d4a51f26bd0ef30e704068a3cd5021a5a7cd784271/onnxruntime-1.27.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:370d211e1ceeac4cd5f45301655463ac59e27cdc74d9f7aeb2d19ff4b7a76715", size = 18670781, upload-time = "2026-06-15T22:43:17.151Z" },
]
[[package]]
name = "onnxscript"
version = "0.7.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ml-dtypes" },
{ name = "numpy" },
{ name = "onnx" },
{ name = "onnx-ir" },
{ name = "packaging" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9b/99/fd948eba63ba65b52265a4cd09a14f96bb9f5b730fcef58876c4358bf406/onnxscript-0.7.0.tar.gz", hash = "sha256:c95ed7b339b02cface56ee27689565c46612e1fc542c562298dddfdad5268dc5", size = 612032, upload-time = "2026-04-20T17:09:19.775Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b9/ce/2ed92575cc3be4ea1db5f38f16f20765f9b20b69b14d6c1d9972658a8ee9/onnxscript-0.7.0-py3-none-any.whl", hash = "sha256:5b356907d4501e9919f8599c91d8da967406a37b1fac2b40caa55a49acf242ea", size = 714842, upload-time = "2026-04-20T17:09:22.089Z" },
]
[[package]]
name = "opencv-python-headless"
version = "4.13.0.92"
@ -2156,10 +2462,12 @@ wheels = [
[[package]]
name = "quickdraw-bot"
version = "0.0.1"
source = { virtual = "." }
source = { editable = "." }
dependencies = [
{ name = "dvc" },
{ name = "dvc-webdav" },
{ name = "dvclive" },
{ name = "matplotlib" },
{ name = "numpy" },
{ name = "opencv-python-headless" },
{ name = "torch" },
@ -2171,6 +2479,7 @@ dependencies = [
deploy = [
{ name = "onnx" },
{ name = "onnxruntime" },
{ name = "onnxscript" },
{ name = "openvino" },
]
dev = [
@ -2182,7 +2491,9 @@ dev = [
[package.metadata]
requires-dist = [
{ name = "dvc", specifier = "~=3.67.1" },
{ name = "dvc-webdav", specifier = "~=3.0.1" },
{ name = "dvclive", specifier = "~=3.49.1" },
{ name = "matplotlib", specifier = "~=3.11.0" },
{ name = "numpy", specifier = "~=2.4.6" },
{ name = "opencv-python-headless", specifier = "~=4.13.0.92" },
{ name = "torch", specifier = "~=2.12.0" },
@ -2194,6 +2505,7 @@ requires-dist = [
deploy = [
{ name = "onnx", specifier = "~=1.22.0" },
{ name = "onnxruntime", specifier = "~=1.27.0" },
{ name = "onnxscript", specifier = "~=0.7.0" },
{ name = "openvino", specifier = "~=2026.2.0" },
]
dev = [
@ -2609,6 +2921,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/bd/6e/95b0e537de1f4d4301f76f944642c6da50d1511cc7b3d64dc418a66c7509/wcwidth-0.8.1-py3-none-any.whl", hash = "sha256:f453740b1e4a4f3291faa37944c555d71056c4da08d59809b307ef4feba695c8", size = 323092, upload-time = "2026-06-08T05:57:21.413Z" },
]
[[package]]
name = "webdav4"
version = "0.11.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "httpx" },
{ name = "python-dateutil" },
]
sdist = { url = "https://files.pythonhosted.org/packages/bb/2d/3d20527d81b25ef039ac92c15f4b9c8760b099e4e0fbf2b1d5d24ef78c3f/webdav4-0.11.0.tar.gz", hash = "sha256:7062c6640e0520bfbd49862bdd335db839e519bf2ca02cd4f89957069ed600ea", size = 228940, upload-time = "2026-02-19T04:43:03.549Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a5/72/274a2a641fd7b14a5ad3191cfec31dc65db857da107340863bbfda9b1682/webdav4-0.11.0-py3-none-any.whl", hash = "sha256:9a8690a919bf65b90b5f8159e29b4465bd82d926ea8f334a9c70ba6cd88f52f1", size = 36517, upload-time = "2026-02-19T04:43:04.712Z" },
]
[[package]]
name = "yarl"
version = "1.24.2"