diff --git a/examples/Model definition b/examples/Model definition new file mode 100644 index 0000000000000000000000000000000000000000..e036630190f905d09a303c7a275fe06d056fbe99 --- /dev/null +++ b/examples/Model definition @@ -0,0 +1,334 @@ +{ + "edges": [ + { + "id": "Input: embedding 1 Linear 1", + "source": "Input: embedding 1", + "sourceHandle": "x", + "target": "Linear 1", + "targetHandle": "x" + }, + { + "id": "Input: label 1 MSE loss 1", + "source": "Input: label 1", + "sourceHandle": "y", + "target": "MSE loss 1", + "targetHandle": "y" + }, + { + "id": "Linear 1 Activation 2", + "source": "Linear 1", + "sourceHandle": "x", + "target": "Activation 2", + "targetHandle": "x" + }, + { + "id": "Activation 2 MSE loss 1", + "source": "Activation 2", + "sourceHandle": "x", + "target": "MSE loss 1", + "targetHandle": "x" + }, + { + "id": "MSE loss 1 Optimizer 2", + "source": "MSE loss 1", + "sourceHandle": "loss", + "target": "Optimizer 2", + "targetHandle": "loss" + } + ], + "env": "PyTorch model", + "nodes": [ + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: embedding", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: embedding" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: embedding 1", + "position": { + "x": 91.0, + "y": 266.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Linear", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "output_dim": { + "default": "same", + "name": "output_dim", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "output_dim": "same" + }, + "status": "planned", + "title": "Linear" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Linear 1", + "position": { + "x": 86.0, + "y": 33.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + }, + "y": { + "name": "y", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "MSE loss", + "outputs": { + "loss": { + "name": "loss", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "MSE loss" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "MSE loss 1", + "position": { + "x": 315.0, + "y": -510.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: label", + "outputs": { + "y": { + "name": "y", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: label" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: label 1", + "position": { + "x": 615.0, + "y": -165.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Activation", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "type": { + "default": "ReLU", + "name": "type", + "type": { + "enum": [ + "ReLU", + "Leaky ReLU", + "Tanh", + "Mish" + ] + } + } + }, + "position": { + "x": 419.0, + "y": 396.0 + }, + "type": "basic" + }, + "params": { + "type": "Leaky ReLU" + }, + "status": "planned", + "title": "Activation" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Activation 2", + "position": { + "x": 93.61643829835265, + "y": -229.04087132886406 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": { + "loss": { + "name": "loss", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Optimizer", + "outputs": {}, + "params": { + "lr": { + "default": 0.001, + "name": "lr", + "type": { + "type": "" + } + }, + "type": { + "default": "AdamW", + "name": "type", + "type": { + "enum": [ + "AdamW", + "Adafactor", + "Adagrad", + "SGD", + "Lion", + "Paged AdamW", + "Galore AdamW" + ] + } + } + }, + "position": { + "x": 526.0, + "y": 116.0 + }, + "type": "basic" + }, + "params": { + "lr": "0.1", + "type": "SGD" + }, + "status": "planned", + "title": "Optimizer" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Optimizer 2", + "position": { + "x": 305.6132943499785, + "y": -804.0094318451224 + }, + "type": "basic", + "width": 200.0 + } + ] +} diff --git a/examples/Model use b/examples/Model use new file mode 100644 index 0000000000000000000000000000000000000000..e2980f402139928ae57379d38ae63a36ef0df32d --- /dev/null +++ b/examples/Model use @@ -0,0 +1,1404 @@ +{ + "edges": [ + { + "id": "Import Parquet 1 Train/test split 1", + "source": "Import Parquet 1", + "sourceHandle": "output", + "target": "Train/test split 1", + "targetHandle": "bundle" + }, + { + "id": "Train/test split 1 Define model 1", + "source": "Train/test split 1", + "sourceHandle": "output", + "target": "Define model 1", + "targetHandle": "bundle" + }, + { + "id": "Define model 1 Train model 2", + "source": "Define model 1", + "sourceHandle": "output", + "target": "Train model 2", + "targetHandle": "bundle" + }, + { + "id": "Train model 2 Model inference 1", + "source": "Train model 2", + "sourceHandle": "output", + "target": "Model inference 1", + "targetHandle": "bundle" + }, + { + "id": "Model inference 1 View tables 1", + "source": "Model inference 1", + "sourceHandle": "output", + "target": "View tables 1", + "targetHandle": "bundle" + } + ], + "env": "LynxKite Graph Analytics", + "nodes": [ + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + } + }, + "other": {}, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Train/test split", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "table_name": { + "default": null, + "name": "table_name", + "type": { + "type": "" + } + }, + "test_ratio": { + "default": 0.1, + "name": "test_ratio", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "table_name": "df", + "test_ratio": 0.1 + }, + "status": "done", + "title": "Train/test split" + }, + "dragHandle": ".bg-primary", + "height": 282.0, + "id": "Train/test split 1", + "position": { + "x": 345.0, + "y": 139.0 + }, + "type": "basic", + "width": 259.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [], + "meta": { + "inputs": {}, + "name": "Import Parquet", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "filename": { + "default": null, + "name": "filename", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "filename": "uploads/plus-one-dataset.parquet" + }, + "status": "done", + "title": "Import Parquet" + }, + "dragHandle": ".bg-primary", + "height": 403.0, + "id": "Import Parquet 1", + "position": { + "x": -166.0, + "y": 112.0 + }, + "type": "basic", + "width": 371.0 + }, + { + "data": { + "display": { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ], + "data": [ + [ + "[0.52046251 0.45887971 0.72169858 0.29517919]", + "[1.52046251 1.45887971 1.72169852 1.29517913]" + ], + [ + "[0.85706753 0.61447072 0.41741937 0.85147089]", + "[1.85706758 1.61447072 1.41741943 1.85147095]" + ], + [ + "[0.11560339 0.57495481 0.76535827 0.0391947 ]", + "[1.11560345 1.57495475 1.76535821 1.0391947 ]" + ], + [ + "[0.19409031 0.68692201 0.60667384 0.57829887]", + "[1.19409037 1.68692207 1.60667384 1.57829881]" + ], + [ + "[0.76807946 0.98855817 0.08259124 0.01730657]", + "[1.76807952 1.98855817 1.0825913 1.01730657]" + ], + [ + "[0.67269951 0.10478973 0.5584439 0.83605725]", + "[1.67269945 1.10478973 1.5584439 1.83605719]" + ], + [ + "[0.18686318 0.49356437 0.51323432 0.75392658]", + "[1.18686318 1.49356437 1.51323438 1.75392652]" + ], + [ + "[0.18149549 0.30520517 0.30946714 0.16786289]", + "[1.18149543 1.30520511 1.30946708 1.16786289]" + ], + [ + "[4.27091718e-01 4.89909172e-01 6.92297399e-01 2.57611275e-04]", + "[1.42709172 1.48990917 1.69229746 1.00025761]" + ], + [ + "[0.32225502 0.16999388 0.05823922 0.9628762 ]", + "[1.32225502 1.16999388 1.05823922 1.9628762 ]" + ], + [ + "[0.50783676 0.04156506 0.21984279 0.8454656 ]", + "[1.50783682 1.04156506 1.21984279 1.84546566]" + ], + [ + "[0.98324287 0.99464184 0.14008355 0.47651017]", + "[1.98324287 1.99464178 1.14008355 1.47651017]" + ], + [ + "[0.11693293 0.49860179 0.55020827 0.88832849]", + "[1.11693287 1.49860179 1.55020833 1.88832855]" + ], + [ + "[0.48959708 0.48549271 0.32688856 0.356677 ]", + "[1.48959708 1.48549271 1.32688856 1.35667706]" + ], + [ + "[0.50272274 0.54912758 0.17663097 0.79070699]", + "[1.50272274 1.54912758 1.17663097 1.79070699]" + ], + [ + "[0.04508126 0.76880038 0.80721325 0.62542385]", + "[1.04508126 1.76880038 1.80721331 1.62542391]" + ], + [ + "[0.19908059 0.17570406 0.51475513 0.1893943 ]", + "[1.19908059 1.175704 1.51475513 1.18939424]" + ], + [ + "[0.40167677 0.25953674 0.9407078 0.76308483]", + "[1.40167677 1.25953674 1.9407078 1.76308489]" + ], + [ + "[0.2480728 0.21694398 0.63941365 0.57128876]", + "[1.24807286 1.21694398 1.6394136 1.57128882]" + ], + [ + "[0.24388778 0.07268471 0.68350857 0.73431659]", + "[1.24388778 1.07268476 1.68350863 1.73431659]" + ], + [ + "[0.62569475 0.9881897 0.83639616 0.9828859 ]", + "[1.62569475 1.9881897 1.83639622 1.98288584]" + ], + [ + "[0.56922203 0.98222166 0.76851749 0.28615737]", + "[1.56922197 1.9822216 1.76851749 1.28615737]" + ], + [ + "[0.88776821 0.51636773 0.30333066 0.32230979]", + "[1.88776827 1.51636767 1.30333066 1.32230973]" + ], + [ + "[0.90817457 0.89270043 0.38583666 0.66566533]", + "[1.90817451 1.89270043 1.3858366 1.66566539]" + ], + [ + "[0.48507756 0.80808765 0.77162558 0.47834778]", + "[1.48507762 1.80808759 1.77162552 1.47834778]" + ], + [ + "[0.68062544 0.98093534 0.14778823 0.53244978]", + "[1.68062544 1.98093534 1.14778829 1.53244972]" + ], + [ + "[0.31518555 0.49643308 0.11509258 0.95458382]", + "[1.31518555 1.49643302 1.11509252 1.95458388]" + ], + [ + "[0.79121011 0.54161114 0.69369799 0.1520769 ]", + "[1.79121017 1.54161119 1.69369793 1.15207696]" + ], + [ + "[0.79423058 0.07138705 0.061777 0.18766576]", + "[1.79423058 1.07138705 1.061777 1.1876657 ]" + ], + [ + "[0.23942459 0.90487361 0.69337189 0.65089428]", + "[1.23942459 1.90487361 1.69337189 1.65089428]" + ], + [ + "[0.94516498 0.08422136 0.5608117 0.07652664]", + "[1.94516492 1.08422136 1.56081176 1.07652664]" + ], + [ + "[0.26661873 0.45946234 0.13510543 0.81294441]", + "[1.26661873 1.4594624 1.13510537 1.81294441]" + ], + [ + "[0.30754459 0.77694583 0.09278506 0.38326019]", + "[1.30754459 1.77694583 1.09278512 1.38326025]" + ], + [ + "[0.27845025 0.32472342 0.82203609 0.77107543]", + "[1.27845025 1.32472348 1.82203603 1.77107549]" + ], + [ + "[0.4827103 0.10563457 0.98858833 0.82286644]", + "[1.48271036 1.10563457 1.98858833 1.82286644]" + ], + [ + "[0.98033333 0.97656083 0.38939917 0.81491041]", + "[1.98033333 1.97656083 1.38939917 1.81491041]" + ], + [ + "[0.74064726 0.4155122 0.09800029 0.49930882]", + "[1.74064732 1.4155122 1.09800029 1.49930882]" + ], + [ + "[0.78956431 0.87284744 0.06880784 0.03455889]", + "[1.78956437 1.87284744 1.06880784 1.03455889]" + ], + [ + "[0.94221359 0.57740951 0.98649532 0.40934443]", + "[1.94221354 1.57740951 1.98649526 1.40934443]" + ], + [ + "[0.00497234 0.39319336 0.57054168 0.75150961]", + "[1.00497234 1.39319336 1.57054162 1.75150967]" + ], + [ + "[0.44330525 0.09997386 0.89025736 0.90507984]", + "[1.44330525 1.09997392 1.89025736 1.90507984]" + ], + [ + "[0.72290605 0.96945059 0.68354797 0.15270454]", + "[1.72290611 1.96945059 1.68354797 1.15270448]" + ], + [ + "[0.75292218 0.81470108 0.49657214 0.56217098]", + "[1.75292218 1.81470108 1.49657214 1.56217098]" + ], + [ + "[0.33480108 0.59181517 0.76198453 0.98062384]", + "[1.33480108 1.59181523 1.76198459 1.98062384]" + ], + [ + "[0.52784437 0.54268694 0.12358981 0.72116476]", + "[1.52784443 1.54268694 1.12358975 1.7211647 ]" + ], + [ + "[0.73217702 0.65233225 0.44077861 0.33837909]", + "[1.73217702 1.65233231 1.44077861 1.33837914]" + ], + [ + "[0.34084332 0.73018837 0.54168713 0.91440833]", + "[1.34084332 1.73018837 1.54168713 1.91440833]" + ], + [ + "[0.60110539 0.3618983 0.32342511 0.98672163]", + "[1.60110545 1.3618983 1.32342505 1.98672163]" + ], + [ + "[0.77427191 0.21829212 0.12769502 0.74303615]", + "[1.77427197 1.21829212 1.12769508 1.74303615]" + ], + [ + "[0.08107251 0.2602725 0.18861133 0.44833237]", + "[1.08107257 1.2602725 1.18861127 1.44833231]" + ], + [ + "[0.59812403 0.78395379 0.0291847 0.81814629]", + "[1.59812403 1.78395379 1.0291847 1.81814623]" + ], + [ + "[0.93488538 0.73882395 0.37345302 0.0274905 ]", + "[1.93488538 1.73882389 1.37345302 1.0274905 ]" + ], + [ + "[0.30631393 0.48311198 0.87847513 0.67559886]", + "[1.30631399 1.48311198 1.87847519 1.67559886]" + ], + [ + "[0.18720162 0.74115586 0.98626411 0.30355608]", + "[1.18720162 1.74115586 1.98626411 1.30355608]" + ], + [ + "[0.85566247 0.83362883 0.48424995 0.25265992]", + "[1.85566247 1.83362889 1.48424995 1.25265992]" + ], + [ + "[0.95928186 0.84273899 0.71514636 0.38619852]", + "[1.95928192 1.84273899 1.7151463 1.38619852]" + ], + [ + "[0.32565445 0.90939188 0.07488042 0.13730896]", + "[1.32565451 1.90939188 1.07488036 1.13730896]" + ], + [ + "[0.9829582 0.59269661 0.40120947 0.95487177]", + "[1.9829582 1.59269667 1.40120947 1.95487177]" + ], + [ + "[0.79905868 0.89367443 0.75429088 0.3190186 ]", + "[1.79905868 1.89367437 1.75429082 1.3190186 ]" + ], + [ + "[0.54914117 0.03810108 0.87531954 0.73044223]", + "[1.54914117 1.03810108 1.87531948 1.73044229]" + ], + [ + "[0.67418337 0.79634351 0.23229051 0.71345252]", + "[1.67418337 1.79634356 1.23229051 1.71345258]" + ], + [ + "[0.87285906 0.48354989 0.39394957 0.59456545]", + "[1.872859 1.48354983 1.39394951 1.59456539]" + ], + [ + "[0.81788456 0.58174163 0.29376316 0.7971254 ]", + "[1.81788456 1.58174157 1.29376316 1.79712534]" + ], + [ + "[0.94559073 0.65736622 0.25761551 0.48553199]", + "[1.94559073 1.65736628 1.25761557 1.48553205]" + ], + [ + "[0.60075855 0.12234765 0.00614399 0.30560958]", + "[1.60075855 1.12234759 1.00614405 1.30560958]" + ], + [ + "[0.39147133 0.29854035 0.84663737 0.58175623]", + "[1.39147139 1.29854035 1.84663737 1.58175623]" + ], + [ + "[0.02162331 0.81861657 0.92468154 0.07808572]", + "[1.02162337 1.81861663 1.92468154 1.07808566]" + ], + [ + "[0.02235305 0.52774918 0.7331115 0.84358269]", + "[1.02235305 1.52774918 1.7331115 1.84358263]" + ], + [ + "[0.6080932 0.56563014 0.32107437 0.72599429]", + "[1.60809326 1.5656302 1.32107437 1.72599435]" + ], + [ + "[0.67447788 0.6125319 0.98007888 0.65968603]", + "[1.67447782 1.6125319 1.98007894 1.65968609]" + ], + [ + "[0.47963417 0.81818312 0.48720706 0.49339259]", + "[1.47963417 1.81818318 1.48720706 1.49339259]" + ], + [ + "[0.9630242 0.76359051 0.24853623 0.76881069]", + "[1.96302414 1.76359057 1.24853623 1.76881075]" + ], + [ + "[0.60609657 0.96257663 0.19292736 0.95702219]", + "[1.60609651 1.96257663 1.19292736 1.95702219]" + ], + [ + "[0.80654246 0.08253473 0.74478531 0.71257162]", + "[1.8065424 1.08253479 1.74478531 1.71257162]" + ], + [ + "[0.70167565 0.26930219 0.5660674 0.61194974]", + "[1.70167565 1.26930213 1.56606746 1.61194968]" + ], + [ + "[0.76933283 0.86241865 0.44114518 0.65644735]", + "[1.76933289 1.86241865 1.44114518 1.65644741]" + ], + [ + "[0.59492421 0.90274489 0.38069052 0.46101224]", + "[1.59492421 1.90274489 1.38069057 1.46101224]" + ], + [ + "[0.15064228 0.03198934 0.25754827 0.51484001]", + "[1.15064228 1.03198934 1.25754833 1.51484001]" + ], + [ + "[0.12024075 0.21342516 0.56858408 0.58644271]", + "[1.12024069 1.21342516 1.56858408 1.58644271]" + ], + [ + "[0.91730917 0.22574073 0.09591609 0.33056474]", + "[1.91730917 1.22574067 1.09591603 1.33056474]" + ], + [ + "[0.49691743 0.61873293 0.90698647 0.94486356]", + "[1.49691749 1.61873293 1.90698647 1.94486356]" + ], + [ + "[0.6032477 0.83361369 0.18538666 0.19108021]", + "[1.60324764 1.83361363 1.18538666 1.19108021]" + ], + [ + "[0.63235509 0.70352674 0.96188956 0.46240485]", + "[1.63235509 1.70352674 1.96188951 1.46240485]" + ], + [ + "[0.37959969 0.42820001 0.10690689 0.96353984]", + "[1.37959969 1.42820001 1.10690689 1.96353984]" + ], + [ + "[0.49607176 0.1922397 0.46640229 0.78321403]", + "[1.49607182 1.19223976 1.46640229 1.78321409]" + ], + [ + "[0.40234613 0.54987347 0.49542785 0.54153186]", + "[1.40234613 1.54987347 1.49542785 1.5415318 ]" + ], + [ + "[0.80893755 0.92237449 0.88346356 0.93164903]", + "[1.80893755 1.92237449 1.88346362 1.93164897]" + ], + [ + "[0.12858278 0.09930819 0.83222693 0.72485673]", + "[1.12858272 1.09930825 1.83222699 1.72485673]" + ], + [ + "[0.72470158 0.4940322 0.41027349 0.89364016]", + "[1.72470164 1.49403214 1.41027355 1.89364016]" + ], + [ + "[0.47856545 0.46267092 0.6376707 0.84747767]", + "[1.47856545 1.46267092 1.63767076 1.84747767]" + ], + [ + "[0.49584109 0.80599248 0.07096875 0.75872749]", + "[1.49584103 1.80599248 1.07096875 1.75872755]" + ], + [ + "[0.43500566 0.66041756 0.80293626 0.96224713]", + "[1.43500566 1.66041756 1.80293632 1.96224713]" + ], + [ + "[0.78397602 0.74223626 0.26603186 0.41664881]", + "[1.78397608 1.74223626 1.26603186 1.41664886]" + ], + [ + "[0.28942841 0.05601001 0.33039129 0.27781558]", + "[1.28942847 1.05601001 1.33039129 1.27781558]" + ], + [ + "[0.68094063 0.45189077 0.22661722 0.37354094]", + "[1.68094063 1.45189071 1.22661722 1.37354088]" + ], + [ + "[0.43681622 0.74680805 0.83598751 0.12414402]", + "[1.43681622 1.74680805 1.83598757 1.12414408]" + ], + [ + "[0.47870928 0.17129105 0.27300501 0.20634609]", + "[1.47870922 1.17129111 1.27300501 1.20634604]" + ], + [ + "[0.72795159 0.79317838 0.27832931 0.96576637]", + "[1.72795153 1.79317832 1.27832937 1.96576643]" + ], + [ + "[0.87608397 0.93200487 0.80169648 0.37758952]", + "[1.87608397 1.93200493 1.80169654 1.37758946]" + ], + [ + "[0.68891573 0.25576538 0.96339929 0.503833 ]", + "[1.68891573 1.25576544 1.96339929 1.50383306]" + ] + ] + }, + "df_test": { + "columns": [ + "x", + "y", + "predicted" + ], + "data": [ + [ + "[0.49691743 0.61873293 0.90698647 0.94486356]", + "[1.49691749 1.61873293 1.90698647 1.94486356]", + "[1.4993021488189697, 1.6404846906661987, 1.923316240310669, 1.9422152042388916]" + ], + [ + "[0.56922203 0.98222166 0.76851749 0.28615737]", + "[1.56922197 1.9822216 1.76851749 1.28615737]", + "[1.5835213661193848, 1.9884355068206787, 1.7694181203842163, 1.2917503118515015]" + ], + [ + "[0.90817457 0.89270043 0.38583666 0.66566533]", + "[1.90817451 1.89270043 1.3858366 1.66566539]", + "[1.9053494930267334, 1.9083378314971924, 1.3998609781265259, 1.6636812686920166]" + ], + [ + "[0.72795159 0.79317838 0.27832931 0.96576637]", + "[1.72795153 1.79317832 1.27832937 1.96576643]", + "[1.734963297843933, 1.8026459217071533, 1.2926064729690552, 1.9596911668777466]" + ], + [ + "[0.04508126 0.76880038 0.80721325 0.62542385]", + "[1.04508126 1.76880038 1.80721331 1.62542391]", + "[1.0830243825912476, 1.7584562301635742, 1.8005754947662354, 1.6277496814727783]" + ], + [ + "[0.6032477 0.83361369 0.18538666 0.19108021]", + "[1.60324764 1.83361363 1.18538666 1.19108021]", + "[1.6177492141723633, 1.8144152164459229, 1.1718573570251465, 1.1950569152832031]" + ], + [ + "[0.15064228 0.03198934 0.25754827 0.51484001]", + "[1.15064228 1.03198934 1.25754833 1.51484001]", + "[1.1556042432785034, 0.9955940246582031, 1.2316606044769287, 1.5150485038757324]" + ], + [ + "[0.48959708 0.48549271 0.32688856 0.356677 ]", + "[1.48959708 1.48549271 1.32688856 1.35667706]", + "[1.4930214881896973, 1.467790961265564, 1.3132573366165161, 1.3589863777160645]" + ], + [ + "[0.08107251 0.2602725 0.18861133 0.44833237]", + "[1.08107257 1.2602725 1.18861127 1.44833231]", + "[1.102121114730835, 1.2180893421173096, 1.160165548324585, 1.4495322704315186]" + ], + [ + "[0.68094063 0.45189077 0.22661722 0.37354094]", + "[1.68094063 1.45189071 1.22661722 1.37354088]", + "[1.6725687980651855, 1.4393560886383057, 1.2169336080551147, 1.3746893405914307]" + ] + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ], + "data": [ + [ + "[0.52046251 0.45887971 0.72169858 0.29517919]", + "[1.52046251 1.45887971 1.72169852 1.29517913]" + ], + [ + "[0.85706753 0.61447072 0.41741937 0.85147089]", + "[1.85706758 1.61447072 1.41741943 1.85147095]" + ], + [ + "[0.11560339 0.57495481 0.76535827 0.0391947 ]", + "[1.11560345 1.57495475 1.76535821 1.0391947 ]" + ], + [ + "[0.19409031 0.68692201 0.60667384 0.57829887]", + "[1.19409037 1.68692207 1.60667384 1.57829881]" + ], + [ + "[0.76807946 0.98855817 0.08259124 0.01730657]", + "[1.76807952 1.98855817 1.0825913 1.01730657]" + ], + [ + "[0.67269951 0.10478973 0.5584439 0.83605725]", + "[1.67269945 1.10478973 1.5584439 1.83605719]" + ], + [ + "[0.18686318 0.49356437 0.51323432 0.75392658]", + "[1.18686318 1.49356437 1.51323438 1.75392652]" + ], + [ + "[0.18149549 0.30520517 0.30946714 0.16786289]", + "[1.18149543 1.30520511 1.30946708 1.16786289]" + ], + [ + "[4.27091718e-01 4.89909172e-01 6.92297399e-01 2.57611275e-04]", + "[1.42709172 1.48990917 1.69229746 1.00025761]" + ], + [ + "[0.32225502 0.16999388 0.05823922 0.9628762 ]", + "[1.32225502 1.16999388 1.05823922 1.9628762 ]" + ], + [ + "[0.50783676 0.04156506 0.21984279 0.8454656 ]", + "[1.50783682 1.04156506 1.21984279 1.84546566]" + ], + [ + "[0.98324287 0.99464184 0.14008355 0.47651017]", + "[1.98324287 1.99464178 1.14008355 1.47651017]" + ], + [ + "[0.11693293 0.49860179 0.55020827 0.88832849]", + "[1.11693287 1.49860179 1.55020833 1.88832855]" + ], + [ + "[0.50272274 0.54912758 0.17663097 0.79070699]", + "[1.50272274 1.54912758 1.17663097 1.79070699]" + ], + [ + "[0.19908059 0.17570406 0.51475513 0.1893943 ]", + "[1.19908059 1.175704 1.51475513 1.18939424]" + ], + [ + "[0.40167677 0.25953674 0.9407078 0.76308483]", + "[1.40167677 1.25953674 1.9407078 1.76308489]" + ], + [ + "[0.2480728 0.21694398 0.63941365 0.57128876]", + "[1.24807286 1.21694398 1.6394136 1.57128882]" + ], + [ + "[0.24388778 0.07268471 0.68350857 0.73431659]", + "[1.24388778 1.07268476 1.68350863 1.73431659]" + ], + [ + "[0.62569475 0.9881897 0.83639616 0.9828859 ]", + "[1.62569475 1.9881897 1.83639622 1.98288584]" + ], + [ + "[0.88776821 0.51636773 0.30333066 0.32230979]", + "[1.88776827 1.51636767 1.30333066 1.32230973]" + ], + [ + "[0.48507756 0.80808765 0.77162558 0.47834778]", + "[1.48507762 1.80808759 1.77162552 1.47834778]" + ], + [ + "[0.68062544 0.98093534 0.14778823 0.53244978]", + "[1.68062544 1.98093534 1.14778829 1.53244972]" + ], + [ + "[0.31518555 0.49643308 0.11509258 0.95458382]", + "[1.31518555 1.49643302 1.11509252 1.95458388]" + ], + [ + "[0.79121011 0.54161114 0.69369799 0.1520769 ]", + "[1.79121017 1.54161119 1.69369793 1.15207696]" + ], + [ + "[0.79423058 0.07138705 0.061777 0.18766576]", + "[1.79423058 1.07138705 1.061777 1.1876657 ]" + ], + [ + "[0.23942459 0.90487361 0.69337189 0.65089428]", + "[1.23942459 1.90487361 1.69337189 1.65089428]" + ], + [ + "[0.94516498 0.08422136 0.5608117 0.07652664]", + "[1.94516492 1.08422136 1.56081176 1.07652664]" + ], + [ + "[0.26661873 0.45946234 0.13510543 0.81294441]", + "[1.26661873 1.4594624 1.13510537 1.81294441]" + ], + [ + "[0.30754459 0.77694583 0.09278506 0.38326019]", + "[1.30754459 1.77694583 1.09278512 1.38326025]" + ], + [ + "[0.27845025 0.32472342 0.82203609 0.77107543]", + "[1.27845025 1.32472348 1.82203603 1.77107549]" + ], + [ + "[0.4827103 0.10563457 0.98858833 0.82286644]", + "[1.48271036 1.10563457 1.98858833 1.82286644]" + ], + [ + "[0.98033333 0.97656083 0.38939917 0.81491041]", + "[1.98033333 1.97656083 1.38939917 1.81491041]" + ], + [ + "[0.74064726 0.4155122 0.09800029 0.49930882]", + "[1.74064732 1.4155122 1.09800029 1.49930882]" + ], + [ + "[0.78956431 0.87284744 0.06880784 0.03455889]", + "[1.78956437 1.87284744 1.06880784 1.03455889]" + ], + [ + "[0.94221359 0.57740951 0.98649532 0.40934443]", + "[1.94221354 1.57740951 1.98649526 1.40934443]" + ], + [ + "[0.00497234 0.39319336 0.57054168 0.75150961]", + "[1.00497234 1.39319336 1.57054162 1.75150967]" + ], + [ + "[0.44330525 0.09997386 0.89025736 0.90507984]", + "[1.44330525 1.09997392 1.89025736 1.90507984]" + ], + [ + "[0.72290605 0.96945059 0.68354797 0.15270454]", + "[1.72290611 1.96945059 1.68354797 1.15270448]" + ], + [ + "[0.75292218 0.81470108 0.49657214 0.56217098]", + "[1.75292218 1.81470108 1.49657214 1.56217098]" + ], + [ + "[0.33480108 0.59181517 0.76198453 0.98062384]", + "[1.33480108 1.59181523 1.76198459 1.98062384]" + ], + [ + "[0.52784437 0.54268694 0.12358981 0.72116476]", + "[1.52784443 1.54268694 1.12358975 1.7211647 ]" + ], + [ + "[0.73217702 0.65233225 0.44077861 0.33837909]", + "[1.73217702 1.65233231 1.44077861 1.33837914]" + ], + [ + "[0.34084332 0.73018837 0.54168713 0.91440833]", + "[1.34084332 1.73018837 1.54168713 1.91440833]" + ], + [ + "[0.60110539 0.3618983 0.32342511 0.98672163]", + "[1.60110545 1.3618983 1.32342505 1.98672163]" + ], + [ + "[0.77427191 0.21829212 0.12769502 0.74303615]", + "[1.77427197 1.21829212 1.12769508 1.74303615]" + ], + [ + "[0.59812403 0.78395379 0.0291847 0.81814629]", + "[1.59812403 1.78395379 1.0291847 1.81814623]" + ], + [ + "[0.93488538 0.73882395 0.37345302 0.0274905 ]", + "[1.93488538 1.73882389 1.37345302 1.0274905 ]" + ], + [ + "[0.30631393 0.48311198 0.87847513 0.67559886]", + "[1.30631399 1.48311198 1.87847519 1.67559886]" + ], + [ + "[0.18720162 0.74115586 0.98626411 0.30355608]", + "[1.18720162 1.74115586 1.98626411 1.30355608]" + ], + [ + "[0.85566247 0.83362883 0.48424995 0.25265992]", + "[1.85566247 1.83362889 1.48424995 1.25265992]" + ], + [ + "[0.95928186 0.84273899 0.71514636 0.38619852]", + "[1.95928192 1.84273899 1.7151463 1.38619852]" + ], + [ + "[0.32565445 0.90939188 0.07488042 0.13730896]", + "[1.32565451 1.90939188 1.07488036 1.13730896]" + ], + [ + "[0.9829582 0.59269661 0.40120947 0.95487177]", + "[1.9829582 1.59269667 1.40120947 1.95487177]" + ], + [ + "[0.79905868 0.89367443 0.75429088 0.3190186 ]", + "[1.79905868 1.89367437 1.75429082 1.3190186 ]" + ], + [ + "[0.54914117 0.03810108 0.87531954 0.73044223]", + "[1.54914117 1.03810108 1.87531948 1.73044229]" + ], + [ + "[0.67418337 0.79634351 0.23229051 0.71345252]", + "[1.67418337 1.79634356 1.23229051 1.71345258]" + ], + [ + "[0.87285906 0.48354989 0.39394957 0.59456545]", + "[1.872859 1.48354983 1.39394951 1.59456539]" + ], + [ + "[0.81788456 0.58174163 0.29376316 0.7971254 ]", + "[1.81788456 1.58174157 1.29376316 1.79712534]" + ], + [ + "[0.94559073 0.65736622 0.25761551 0.48553199]", + "[1.94559073 1.65736628 1.25761557 1.48553205]" + ], + [ + "[0.60075855 0.12234765 0.00614399 0.30560958]", + "[1.60075855 1.12234759 1.00614405 1.30560958]" + ], + [ + "[0.39147133 0.29854035 0.84663737 0.58175623]", + "[1.39147139 1.29854035 1.84663737 1.58175623]" + ], + [ + "[0.02162331 0.81861657 0.92468154 0.07808572]", + "[1.02162337 1.81861663 1.92468154 1.07808566]" + ], + [ + "[0.02235305 0.52774918 0.7331115 0.84358269]", + "[1.02235305 1.52774918 1.7331115 1.84358263]" + ], + [ + "[0.6080932 0.56563014 0.32107437 0.72599429]", + "[1.60809326 1.5656302 1.32107437 1.72599435]" + ], + [ + "[0.67447788 0.6125319 0.98007888 0.65968603]", + "[1.67447782 1.6125319 1.98007894 1.65968609]" + ], + [ + "[0.47963417 0.81818312 0.48720706 0.49339259]", + "[1.47963417 1.81818318 1.48720706 1.49339259]" + ], + [ + "[0.9630242 0.76359051 0.24853623 0.76881069]", + "[1.96302414 1.76359057 1.24853623 1.76881075]" + ], + [ + "[0.60609657 0.96257663 0.19292736 0.95702219]", + "[1.60609651 1.96257663 1.19292736 1.95702219]" + ], + [ + "[0.80654246 0.08253473 0.74478531 0.71257162]", + "[1.8065424 1.08253479 1.74478531 1.71257162]" + ], + [ + "[0.70167565 0.26930219 0.5660674 0.61194974]", + "[1.70167565 1.26930213 1.56606746 1.61194968]" + ], + [ + "[0.76933283 0.86241865 0.44114518 0.65644735]", + "[1.76933289 1.86241865 1.44114518 1.65644741]" + ], + [ + "[0.59492421 0.90274489 0.38069052 0.46101224]", + "[1.59492421 1.90274489 1.38069057 1.46101224]" + ], + [ + "[0.12024075 0.21342516 0.56858408 0.58644271]", + "[1.12024069 1.21342516 1.56858408 1.58644271]" + ], + [ + "[0.91730917 0.22574073 0.09591609 0.33056474]", + "[1.91730917 1.22574067 1.09591603 1.33056474]" + ], + [ + "[0.63235509 0.70352674 0.96188956 0.46240485]", + "[1.63235509 1.70352674 1.96188951 1.46240485]" + ], + [ + "[0.37959969 0.42820001 0.10690689 0.96353984]", + "[1.37959969 1.42820001 1.10690689 1.96353984]" + ], + [ + "[0.49607176 0.1922397 0.46640229 0.78321403]", + "[1.49607182 1.19223976 1.46640229 1.78321409]" + ], + [ + "[0.40234613 0.54987347 0.49542785 0.54153186]", + "[1.40234613 1.54987347 1.49542785 1.5415318 ]" + ], + [ + "[0.80893755 0.92237449 0.88346356 0.93164903]", + "[1.80893755 1.92237449 1.88346362 1.93164897]" + ], + [ + "[0.12858278 0.09930819 0.83222693 0.72485673]", + "[1.12858272 1.09930825 1.83222699 1.72485673]" + ], + [ + "[0.72470158 0.4940322 0.41027349 0.89364016]", + "[1.72470164 1.49403214 1.41027355 1.89364016]" + ], + [ + "[0.47856545 0.46267092 0.6376707 0.84747767]", + "[1.47856545 1.46267092 1.63767076 1.84747767]" + ], + [ + "[0.49584109 0.80599248 0.07096875 0.75872749]", + "[1.49584103 1.80599248 1.07096875 1.75872755]" + ], + [ + "[0.43500566 0.66041756 0.80293626 0.96224713]", + "[1.43500566 1.66041756 1.80293632 1.96224713]" + ], + [ + "[0.78397602 0.74223626 0.26603186 0.41664881]", + "[1.78397608 1.74223626 1.26603186 1.41664886]" + ], + [ + "[0.28942841 0.05601001 0.33039129 0.27781558]", + "[1.28942847 1.05601001 1.33039129 1.27781558]" + ], + [ + "[0.43681622 0.74680805 0.83598751 0.12414402]", + "[1.43681622 1.74680805 1.83598757 1.12414408]" + ], + [ + "[0.47870928 0.17129105 0.27300501 0.20634609]", + "[1.47870922 1.17129111 1.27300501 1.20634604]" + ], + [ + "[0.87608397 0.93200487 0.80169648 0.37758952]", + "[1.87608397 1.93200493 1.80169654 1.37758946]" + ], + [ + "[0.68891573 0.25576538 0.96339929 0.503833 ]", + "[1.68891573 1.25576544 1.96339929 1.50383306]" + ] + ] + } + }, + "other": { + "model": "ModelConfig(model=Sequential(\n (0) - Linear(in_features=4, out_features=4, bias=True): Input__embedding_1_x -> Linear_1_x\n (1) - : Linear_1_x -> Activation_2_x\n (2) - Identity(): Activation_2_x -> Activation_2_x\n), model_inputs=['Input__embedding_1_x'], model_outputs=['Activation_2_x'], loss_inputs=['Input__label_1_y', 'Activation_2_x'], loss=Sequential(\n (0) - : Activation_2_x, Input__label_1_y -> MSE_loss_1_loss\n (1) - Identity(): MSE_loss_1_loss -> loss\n), optimizer=SGD (\nParameter Group 0\n dampening: 0\n differentiable: False\n foreach: None\n fused: None\n lr: 0.1\n maximize: False\n momentum: 0\n nesterov: False\n weight_decay: 0\n), source_workspace=None, trained=True)" + }, + "relations": [] + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "predicted", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__embedding_1_x" + ], + "loss_inputs": [ + "Input__label_1_y", + "Activation_2_x" + ], + "outputs": [ + "Activation_2_x" + ], + "trained": true + }, + "type": "model" + } + }, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View tables", + "outputs": {}, + "params": { + "limit": { + "default": 100.0, + "name": "limit", + "type": { + "type": "" + } + } + }, + "type": "table_view" + }, + "params": { + "limit": 100.0 + }, + "status": "done", + "title": "View tables" + }, + "dragHandle": ".bg-primary", + "height": 711.0, + "id": "View tables 1", + "position": { + "x": 2900.3734843758352, + "y": -128.41609608842867 + }, + "type": "table_view", + "width": 836.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ] + } + }, + "other": {}, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Define model", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "model_workspace": { + "default": null, + "name": "model_workspace", + "type": { + "type": "" + } + }, + "save_as": { + "default": "model", + "name": "save_as", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "model_workspace": "Model definition", + "save_as": "model" + }, + "status": "done", + "title": "Define model" + }, + "dragHandle": ".bg-primary", + "height": 537.0, + "id": "Define model 1", + "position": { + "x": 795.0, + "y": -45.0 + }, + "type": "basic", + "width": 498.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__embedding_1_x" + ], + "loss_inputs": [ + "Input__label_1_y", + "Activation_2_x" + ], + "outputs": [ + "Activation_2_x" + ], + "trained": false + }, + "type": "model" + } + }, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Train model", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "epochs": { + "default": 1.0, + "name": "epochs", + "type": { + "type": "" + } + }, + "input_mapping": { + "default": null, + "name": "input_mapping", + "type": { + "type": "" + } + }, + "model_name": { + "default": "model", + "name": "model_name", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "epochs": "1001", + "input_mapping": "{\"map\":{\"Input__embedding_1_x\":{\"column\":\"x\",\"df\":\"df_train\"},\"Input__label_1_y\":{\"column\":\"y\",\"df\":\"df_train\"}}}", + "model_name": "model" + }, + "status": "done", + "title": "Train model" + }, + "dragHandle": ".bg-primary", + "height": 604.0, + "id": "Train model 2", + "position": { + "x": 1399.5245787239226, + "y": -19.196202428593544 + }, + "type": "basic", + "width": 586.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "predicted", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__embedding_1_x" + ], + "loss_inputs": [ + "Input__label_1_y", + "Activation_2_x" + ], + "outputs": [ + "Activation_2_x" + ], + "trained": true + }, + "type": "model" + } + }, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Model inference", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "input_mapping": { + "default": null, + "name": "input_mapping", + "type": { + "type": "" + } + }, + "model_name": { + "default": "model", + "name": "model_name", + "type": { + "type": "" + } + }, + "output_mapping": { + "default": null, + "name": "output_mapping", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "input_mapping": "{\"map\":{\"Input__embedding_1_x\":{\"column\":\"x\",\"df\":\"df_test\"}}}", + "model_name": "model", + "output_mapping": "{\"map\":{\"Activation_2_x\":{\"column\":\"predicted\",\"df\":\"df_test\"}}}" + }, + "status": "done", + "title": "Model inference" + }, + "dragHandle": ".bg-primary", + "height": 893.0, + "id": "Model inference 1", + "position": { + "x": 2181.718373860645, + "y": -69.44701793295484 + }, + "type": "basic", + "width": 529.0 + } + ] +} diff --git a/examples/ODE-GNN b/examples/ODE-GNN new file mode 100644 index 0000000000000000000000000000000000000000..9068d6506e6ef8f0ade35c7ea70b2ad7661149c0 --- /dev/null +++ b/examples/ODE-GNN @@ -0,0 +1,796 @@ +{ + "edges": [ + { + "id": "Input: embedding 1 Graph conv 1", + "source": "Input: embedding 1", + "sourceHandle": "x", + "target": "Graph conv 1", + "targetHandle": "x" + }, + { + "id": "Input: graph edges 1 Graph conv 1", + "source": "Input: graph edges 1", + "sourceHandle": "edges", + "target": "Graph conv 1", + "targetHandle": "edges" + }, + { + "id": "Graph conv 1 Activation 1", + "source": "Graph conv 1", + "sourceHandle": "x", + "target": "Activation 1", + "targetHandle": "x" + }, + { + "id": "Activation 1 Repeat 1", + "source": "Activation 1", + "sourceHandle": "x", + "target": "Repeat 1", + "targetHandle": "input" + }, + { + "id": "Repeat 1 Graph conv 1", + "source": "Repeat 1", + "sourceHandle": "output", + "target": "Graph conv 1", + "targetHandle": "x" + }, + { + "id": "Input: sequential 1 LSTM 1", + "source": "Input: sequential 1", + "sourceHandle": "y", + "target": "LSTM 1", + "targetHandle": "x" + }, + { + "id": "Input: zeros 1 LSTM 1", + "source": "Input: zeros 1", + "sourceHandle": "x", + "target": "LSTM 1", + "targetHandle": "h" + }, + { + "id": "Recurrent chain 1 LSTM 1", + "source": "Recurrent chain 1", + "sourceHandle": "output", + "target": "LSTM 1", + "targetHandle": "h" + }, + { + "id": "LSTM 1 Recurrent chain 1", + "source": "LSTM 1", + "sourceHandle": "h", + "target": "Recurrent chain 1", + "targetHandle": "input" + }, + { + "id": "Activation 1 Concatenate 1", + "source": "Activation 1", + "sourceHandle": "x", + "target": "Concatenate 1", + "targetHandle": "a" + }, + { + "id": "LSTM 1 Concatenate 1", + "source": "LSTM 1", + "sourceHandle": "x", + "target": "Concatenate 1", + "targetHandle": "b" + }, + { + "id": "Input: label 1 MSE loss 1", + "source": "Input: label 1", + "sourceHandle": "y", + "target": "MSE loss 1", + "targetHandle": "y" + }, + { + "id": "MSE loss 1 Optimizer 1", + "source": "MSE loss 1", + "sourceHandle": "loss", + "target": "Optimizer 1", + "targetHandle": "loss" + }, + { + "id": "Concatenate 1 Neural ODE 2", + "source": "Concatenate 1", + "sourceHandle": "x", + "target": "Neural ODE 2", + "targetHandle": "x" + }, + { + "id": "Neural ODE 2 MSE loss 1", + "source": "Neural ODE 2", + "sourceHandle": "x", + "target": "MSE loss 1", + "targetHandle": "x" + } + ], + "env": "PyTorch model", + "nodes": [ + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "edges": { + "name": "edges", + "position": "bottom", + "type": { + "type": "tensor" + } + }, + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Graph conv", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "type": { + "default": "1", + "name": "type", + "type": { + "enum": [ + "GCNConv", + "GATConv", + "GATv2Conv", + "SAGEConv" + ] + } + } + }, + "type": "basic" + }, + "params": { + "type": 1.0 + }, + "status": "planned", + "title": "Graph conv" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Graph conv 1", + "position": { + "x": 350.98078368755864, + "y": 195.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": { + "input": { + "name": "input", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "name": "Repeat", + "outputs": { + "output": { + "name": "output", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "params": { + "times": { + "default": 1.0, + "name": "times", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "times": "5" + }, + "status": "planned", + "title": "Repeat" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Repeat 1", + "position": { + "x": -94.15168677219138, + "y": 14.525356969883305 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": { + "a": { + "name": "a", + "position": "bottom", + "type": { + "type": "tensor" + } + }, + "b": { + "name": "b", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Concatenate", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Concatenate" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Concatenate 1", + "position": { + "x": 477.88148637482334, + "y": -372.62774030487003 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: graph edges", + "outputs": { + "edges": { + "name": "edges", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: graph edges" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: graph edges 1", + "position": { + "x": 515.6535517374441, + "y": 545.4709559884296 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: embedding", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: embedding" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: embedding 1", + "position": { + "x": 246.6527948448857, + "y": 551.6313504198322 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Activation", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "type": { + "default": "1", + "name": "type", + "type": { + "enum": [ + "ReLU", + "LeakyReLU", + "Tanh", + "Mish" + ] + } + } + }, + "type": "basic" + }, + "params": { + "type": 1.0 + }, + "status": "planned", + "title": "Activation" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Activation 1", + "position": { + "x": 354.3731834561054, + "y": -73.74768512965228 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": { + "h": { + "name": "h", + "position": "bottom", + "type": { + "type": "tensor" + } + }, + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "LSTM", + "outputs": { + "h": { + "name": "h", + "position": "top", + "type": { + "type": "tensor" + } + }, + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "LSTM" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "LSTM 1", + "position": { + "x": 960.0, + "y": 135.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: sequential", + "outputs": { + "y": { + "name": "y", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: sequential" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: sequential 1", + "position": { + "x": 1005.0, + "y": 510.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: zeros", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: zeros" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: zeros 1", + "position": { + "x": 1290.0, + "y": 405.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": { + "input": { + "name": "input", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "name": "Recurrent chain", + "outputs": { + "output": { + "name": "output", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Recurrent chain" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Recurrent chain 1", + "position": { + "x": 1224.6603040746108, + "y": 135.44839862151363 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + }, + "y": { + "name": "y", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "MSE loss", + "outputs": { + "loss": { + "name": "loss", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "MSE loss" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "MSE loss 1", + "position": { + "x": 915.0, + "y": -900.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Input: label", + "outputs": { + "y": { + "name": "y", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Input: label" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: label 1", + "position": { + "x": 1095.0, + "y": -450.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "loss": { + "name": "loss", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Optimizer", + "outputs": {}, + "params": { + "lr": { + "default": 0.001, + "name": "lr", + "type": { + "type": "" + } + }, + "type": { + "default": "1", + "name": "type", + "type": { + "enum": [ + "AdamW", + "Adafactor", + "Adagrad", + "SGD", + "Lion", + "Paged AdamW", + "Galore AdamW" + ] + } + } + }, + "type": "basic" + }, + "params": { + "lr": 0.001, + "type": 1.0 + }, + "status": "planned", + "title": "Optimizer" + }, + "dragHandle": ".bg-primary", + "height": 247.0, + "id": "Optimizer 1", + "position": { + "x": 915.3430278730226, + "y": -1268.0577550022126 + }, + "type": "basic", + "width": 190.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Neural ODE", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "absolute_tolerance": { + "default": null, + "name": "absolute_tolerance", + "type": { + "type": "None" + } + }, + "method": { + "default": "1", + "name": "method", + "type": { + "enum": [ + "dopri8", + "dopri5", + "bosh3", + "fehlberg2", + "adaptive_heun", + "euler", + "midpoint", + "rk4", + "explicit_adams", + "implicit_adams" + ] + } + }, + "relative_tolerance": { + "default": null, + "name": "relative_tolerance", + "type": { + "type": "None" + } + } + }, + "type": "basic" + }, + "params": { + "absolute_tolerance": null, + "method": 1.0, + "relative_tolerance": null + }, + "status": "planned", + "title": "Neural ODE" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Neural ODE 2", + "position": { + "x": 342.3226409443945, + "y": -687.1882072175634 + }, + "type": "basic", + "width": 200.0 + } + ] +} diff --git a/examples/ODE-GNN experiment b/examples/ODE-GNN experiment new file mode 100644 index 0000000000000000000000000000000000000000..a7f890e74e5d9560f2ca764bed444d82257d53b2 --- /dev/null +++ b/examples/ODE-GNN experiment @@ -0,0 +1,466 @@ +{ + "edges": [ + { + "id": "Import CSV 1 Train/test split 1", + "source": "Import CSV 1", + "sourceHandle": "output", + "target": "Train/test split 1", + "targetHandle": "bundle" + }, + { + "id": "Train/test split 1 Create graph 1", + "source": "Train/test split 1", + "sourceHandle": "output", + "target": "Create graph 1", + "targetHandle": "bundle" + }, + { + "id": "Biomedical foundation graph (PLACEHOLDER) 1 Create graph 1", + "source": "Biomedical foundation graph (PLACEHOLDER) 1", + "sourceHandle": "output", + "target": "Create graph 1", + "targetHandle": "bundle" + }, + { + "id": "Define model 1 Create graph 1", + "source": "Define model 1", + "sourceHandle": "output", + "target": "Create graph 1", + "targetHandle": "bundle" + }, + { + "id": "Create graph 1 Train model 1", + "source": "Create graph 1", + "sourceHandle": "output", + "target": "Train model 1", + "targetHandle": "bundle" + }, + { + "id": "Train model 1 Model inference 1", + "source": "Train model 1", + "sourceHandle": "output", + "target": "Model inference 1", + "targetHandle": "bundle" + } + ], + "env": "LynxKite Graph Analytics", + "nodes": [ + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Biomedical foundation graph (PLACEHOLDER)", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "filter_nodes": { + "default": null, + "name": "filter_nodes", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "filter_nodes": "drug,gene,disease" + }, + "status": "done", + "title": "Biomedical foundation graph (PLACEHOLDER)" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Biomedical foundation graph (PLACEHOLDER) 1", + "position": { + "x": 230.1082040835347, + "y": 643.2454063689602 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": "Missing input: bundle", + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Train/test split", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "table_name": { + "default": null, + "name": "table_name", + "type": { + "type": "" + } + }, + "test_ratio": { + "default": 0.1, + "name": "test_ratio", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "table_name": null, + "test_ratio": 0.1 + }, + "status": "planned", + "title": "Train/test split" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Train/test split 1", + "position": { + "x": 313.3745540124723, + "y": 412.5466021460861 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": "[Errno 2] No such file or directory: ''", + "meta": { + "inputs": {}, + "name": "Import CSV", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "columns": { + "default": "", + "name": "columns", + "type": { + "type": "" + } + }, + "filename": { + "default": null, + "name": "filename", + "type": { + "type": "" + } + }, + "separator": { + "default": "", + "name": "separator", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "columns": "", + "filename": null, + "separator": "" + }, + "status": "done", + "title": "Import CSV" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Import CSV 1", + "position": { + "x": -2.1743215714344757, + "y": 346.06014722935214 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": "Missing input: bundle", + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Model inference", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "model_mapping": { + "default": null, + "name": "model_mapping", + "type": { + "type": "" + } + }, + "model_name": { + "default": null, + "name": "model_name", + "type": { + "type": "" + } + }, + "save_output_as": { + "default": "prediction", + "name": "save_output_as", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "model_mapping": "input: data_test", + "model_name": "model", + "save_output_as": "prediction" + }, + "status": "done", + "title": "Model inference" + }, + "dragHandle": ".bg-primary", + "height": 339.0, + "id": "Model inference 1", + "position": { + "x": 1736.5697434242886, + "y": 357.0743204289906 + }, + "type": "basic", + "width": 281.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": "Missing input: bundle", + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "list[lynxkite_graph_analytics.core.Bundle]" + } + } + }, + "name": "Organize", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "relations": { + "default": null, + "name": "relations", + "type": { + "type": "" + } + } + }, + "type": "graph_creation_view" + }, + "params": { + "relations": null + }, + "status": "planned", + "title": "Organize" + }, + "dragHandle": ".bg-primary", + "height": 322.0, + "id": "Create graph 1", + "position": { + "x": 846.6882598271658, + "y": 480.6258932907771 + }, + "type": "graph_creation_view", + "width": 313.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Define model", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "model_workspace": { + "default": null, + "name": "model_workspace", + "type": { + "type": "" + } + }, + "save_as": { + "default": "model", + "name": "save_as", + "type": { + "type": "" + } + } + }, + "position": { + "x": 286.0, + "y": 208.0 + }, + "type": "basic" + }, + "params": { + "model_workspace": "ODE-GNN", + "save_as": "model" + }, + "status": "done", + "title": "Define model" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Define model 1", + "position": { + "x": 311.976524267066, + "y": 146.99006795914332 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": "Missing input: bundle", + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Train model", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "epochs": { + "default": 1.0, + "name": "epochs", + "type": { + "type": "" + } + }, + "model_mapping": { + "default": null, + "name": "model_mapping", + "type": { + "type": "" + } + }, + "model_name": { + "default": null, + "name": "model_name", + "type": { + "type": "" + } + } + }, + "position": { + "x": 995.0, + "y": 350.0 + }, + "type": "basic" + }, + "params": { + "epochs": 1.0, + "model_mapping": "input: data_train", + "model_name": "model" + }, + "status": "planned", + "title": "Train model" + }, + "dragHandle": ".bg-primary", + "height": 342.0, + "id": "Train model 1", + "position": { + "x": 1358.7213662492159, + "y": 352.03096133771896 + }, + "type": "basic", + "width": 296.0 + } + ] +} diff --git a/examples/uploads/plus-one-dataset.parquet b/examples/uploads/plus-one-dataset.parquet new file mode 100644 index 0000000000000000000000000000000000000000..03eb0a488400bc0864067da24dca11ca43a021ea Binary files /dev/null and b/examples/uploads/plus-one-dataset.parquet differ diff --git a/lynxkite-app/src/lynxkite_app/crdt.py b/lynxkite-app/src/lynxkite_app/crdt.py index d86096ecb584b8d6a402d41ef1597a953963fc1f..b347718f770f220de084ea25820af47a85001868 100644 --- a/lynxkite-app/src/lynxkite_app/crdt.py +++ b/lynxkite-app/src/lynxkite_app/crdt.py @@ -90,6 +90,7 @@ last_ws_input = None def clean_input(ws_pyd): for node in ws_pyd.nodes: node.data.display = None + node.data.input_metadata = None node.data.error = None node.data.status = workspace.NodeStatus.done node.position.x = 0 @@ -168,9 +169,12 @@ def try_to_load_workspace(ws: pycrdt.Map, name: str): """ if os.path.exists(name): ws_pyd = workspace.load(name) - # We treat the display field as a black box, since it is a large - # dictionary that is meant to change as a whole. - crdt_update(ws, ws_pyd.model_dump(), non_collaborative_fields={"display"}) + crdt_update( + ws, + ws_pyd.model_dump(), + # We treat some fields as black boxes. They are not edited on the frontend. + non_collaborative_fields={"display", "input_metadata"}, + ) last_known_versions = {} diff --git a/lynxkite-app/tests/test_main.py b/lynxkite-app/tests/test_main.py index c9d15c8b7752b8d443f822727a2c40d056b24551..9297620297c7b853e175845e1523cc7cbe3f7e64 100644 --- a/lynxkite-app/tests/test_main.py +++ b/lynxkite-app/tests/test_main.py @@ -37,6 +37,7 @@ def test_save_and_load(): "type": "basic", "data": { "display": None, + "input_metadata": None, "error": "Unknown operation.", "title": "Test node", "params": {"param1": "value"}, diff --git a/lynxkite-app/web/playwright.config.ts b/lynxkite-app/web/playwright.config.ts index b0d3e4c31adf4a28eaed19a16dd856d3364f4e5b..ff79f58b63212bc7b3487f77bc0cdc0da22e5452 100644 --- a/lynxkite-app/web/playwright.config.ts +++ b/lynxkite-app/web/playwright.config.ts @@ -24,7 +24,7 @@ export default defineConfig({ ], webServer: { command: "cd ../../examples && lynxkite", - url: "http://127.0.0.1:8000", + port: 8000, reuseExistingServer: false, }, }); diff --git a/lynxkite-app/web/src/apiTypes.ts b/lynxkite-app/web/src/apiTypes.ts index 5bed31c557f4b610c9a8cf39c2d7ad2446e48c94..2f696b3f2f3013998034ad9519ccbf13ebfc0177 100644 --- a/lynxkite-app/web/src/apiTypes.ts +++ b/lynxkite-app/web/src/apiTypes.ts @@ -5,6 +5,8 @@ /* Do not modify it by hand - just update the pydantic models and then re-run the script */ +export type NodeStatus = "planned" | "active" | "done"; + export interface DirectoryEntry { name: string; type: string; @@ -40,8 +42,9 @@ export interface WorkspaceNodeData { [k: string]: unknown; }; display?: unknown; + input_metadata?: unknown; error?: string | null; - in_progress?: boolean; + status?: NodeStatus; [k: string]: unknown; } export interface Position { diff --git a/lynxkite-app/web/src/index.css b/lynxkite-app/web/src/index.css index f3561c3a343a695185772a3e7f9ff508fc8b290c..34b6559527a8e03656a9fe131ad788c85515467c 100644 --- a/lynxkite-app/web/src/index.css +++ b/lynxkite-app/web/src/index.css @@ -256,6 +256,14 @@ body { cursor: pointer; } } + + .model-mapping-param { + border: 1px solid var(--fallback-bc, oklch(var(--bc) / 0.2)); + border-collapse: separate; + border-radius: 5px; + padding: 5px 10px; + width: 100%; + } } .params-expander { diff --git a/lynxkite-app/web/src/workspace/Workspace.tsx b/lynxkite-app/web/src/workspace/Workspace.tsx index e4156840da5ec172f37009eee6f847d85f9095eb..ce762006268972c8d4f4c6d57bf6411eb46bdabd 100644 --- a/lynxkite-app/web/src/workspace/Workspace.tsx +++ b/lynxkite-app/web/src/workspace/Workspace.tsx @@ -383,6 +383,8 @@ function LynxKiteFlow() { proOptions={{ hideAttribution: true }} maxZoom={1} minZoom={0.3} + zoomOnScroll={false} + preventScrolling={false} defaultEdgeOptions={{ markerEnd: { type: MarkerType.ArrowClosed, diff --git a/lynxkite-app/web/src/workspace/nodes/NodeGroupParameter.tsx b/lynxkite-app/web/src/workspace/nodes/NodeGroupParameter.tsx index 28564d40ead0e2644ff4af774ce0cd79d4ae05c0..bbdd1dba5daed50e69df64090a6cf390a4e479d5 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeGroupParameter.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeGroupParameter.tsx @@ -24,6 +24,7 @@ interface GroupsType { interface NodeGroupParameterProps { meta: { selector: SelectorType; groups: GroupsType }; value: any; + data: any; setParam: (name: string, value: any, options?: { delay: number }) => void; deleteParam: (name: string, options?: { delay: number }) => void; } @@ -31,6 +32,7 @@ interface NodeGroupParameterProps { export default function NodeGroupParameter({ meta, value, + data, setParam, deleteParam, }: NodeGroupParameterProps) { @@ -60,6 +62,7 @@ export default function NodeGroupParameter({ name={selector.name} key={selector.name} value={selectedValue} + data={data} meta={selector} onChange={handleSelectorChange} /> diff --git a/lynxkite-app/web/src/workspace/nodes/NodeParameter.tsx b/lynxkite-app/web/src/workspace/nodes/NodeParameter.tsx index 39b46006d248f36247cae85bcae8d5c84856aa2c..2176956291cba6a2919002aa97239f07ee30eeab 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeParameter.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeParameter.tsx @@ -1,15 +1,187 @@ -const BOOLEAN = ""; +// @ts-ignore +import ArrowsHorizontal from "~icons/tabler/arrows-horizontal.jsx"; +const BOOLEAN = ""; +const MODEL_TRAINING_INPUT_MAPPING = + ""; +const MODEL_INFERENCE_INPUT_MAPPING = + ""; +const MODEL_OUTPUT_MAPPING = + ""; function ParamName({ name }: { name: string }) { return ( {name.replace(/_/g, " ")} ); } +function Input({ + value, + onChange, +}: { + value: string; + onChange: (value: string, options?: { delay: number }) => void; +}) { + return ( + onChange(evt.currentTarget.value, { delay: 2 })} + onBlur={(evt) => onChange(evt.currentTarget.value, { delay: 0 })} + onKeyDown={(evt) => + evt.code === "Enter" && onChange(evt.currentTarget.value, { delay: 0 }) + } + /> + ); +} + +function getModelBindings( + data: any, + variant: "training input" | "inference input" | "output", +): string[] { + function bindingsOfModel(m: any): string[] { + switch (variant) { + case "training input": + return [ + ...m.inputs, + ...m.loss_inputs.filter((i: string) => !m.outputs.includes(i)), + ]; + case "inference input": + return m.inputs; + case "output": + return m.outputs; + } + } + const bindings = new Set(); + const inputs = data?.input_metadata?.value ?? data?.input_metadata ?? []; + for (const input of inputs) { + const other = input.other ?? {}; + for (const e of Object.values(other) as any[]) { + if (e.type === "model") { + for (const b of bindingsOfModel(e.model)) { + bindings.add(b); + } + } + } + } + const list = [...bindings]; + list.sort(); + return list; +} + +function parseJsonOrEmpty(json: string): object { + try { + const j = JSON.parse(json); + if (j !== null && typeof j === "object") { + return j; + } + } catch (e) {} + return {}; +} + +function ModelMapping({ value, onChange, data, variant }: any) { + const v: any = parseJsonOrEmpty(value); + v.map ??= {}; + const dfs: { [df: string]: string[] } = {}; + const inputs = data?.input_metadata?.value ?? data?.input_metadata ?? []; + for (const input of inputs) { + const dataframes = input.dataframes as { + [df: string]: { columns: string[] }; + }; + for (const [df, { columns }] of Object.entries(dataframes)) { + dfs[df] = columns; + } + } + const bindings = getModelBindings(data, variant); + return ( + + + {bindings.length > 0 ? ( + bindings.map((binding: string) => ( + + + + + + + )) + ) : ( + + + + )} + +
{binding} + + + + + {variant === "output" ? ( + { + const columnSpec = { + ...(v.map?.[binding] || {}), + column, + }; + const map = { ...v.map, [binding]: columnSpec }; + onChange(JSON.stringify({ map }), options); + }} + /> + ) : ( + + )} +
no bindings
+ ); +} + interface NodeParameterProps { name: string; value: any; meta: any; + data: any; onChange: (value: any, options?: { delay: number }) => void; } @@ -17,6 +189,7 @@ export default function NodeParameter({ name, value, meta, + data, onChange, }: NodeParameterProps) { return ( @@ -56,29 +229,50 @@ export default function NodeParameter({ ) : meta?.type?.type === BOOLEAN ? (
- ) : ( + ) : meta?.type?.type === MODEL_TRAINING_INPUT_MAPPING ? ( <> - onChange(evt.currentTarget.value, { delay: 2 })} - onBlur={(evt) => onChange(evt.currentTarget.value, { delay: 0 })} - onKeyDown={(evt) => - evt.code === "Enter" && - onChange(evt.currentTarget.value, { delay: 0 }) - } + + + ) : meta?.type?.type === MODEL_INFERENCE_INPUT_MAPPING ? ( + <> + + + ) : meta?.type?.type === MODEL_OUTPUT_MAPPING ? ( + <> + + + + ) : ( + <> + + + )} ); diff --git a/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx b/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx index ef568a41f0cca30dd88a097722d470b4d78d4e5c..824136faf9953ed6403e9224c983c12874507dee 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx @@ -49,6 +49,7 @@ function NodeWithParams(props: any) { setParam(name, value, opts || {}) @@ -62,6 +63,7 @@ function NodeWithParams(props: any) { name={name} key={name} value={value} + data={props.data} meta={metaParams?.[name]} onChange={(value: any, opts?: UpdateOptions) => setParam(name, value, opts || {}) diff --git a/lynxkite-core/src/lynxkite/core/ops.py b/lynxkite-core/src/lynxkite/core/ops.py index 023406649eb056bc83f8091bedb43551917fefd2..7d53df1e7dd201ffff3ffa28bfb4cd6b19eab25a 100644 --- a/lynxkite-core/src/lynxkite/core/ops.py +++ b/lynxkite-core/src/lynxkite/core/ops.py @@ -61,7 +61,7 @@ class Parameter(BaseConfig): @staticmethod def options(name, options, default=None): e = enum.Enum(f"OptionsFor_{name}", options) - return Parameter.basic(name, e[default or options[0]], e) + return Parameter.basic(name, default or options[0], e) @staticmethod def collapsed(name, default, type=None): @@ -106,11 +106,13 @@ class Result: The `output` attribute is what will be used as input for other operations. The `display` attribute is used to send data to display on the UI. The value has to be JSON-serializable. + `input_metadata` is a list of JSON objects describing each input. """ output: typing.Any = None display: ReadOnlyJSON | None = None error: str | None = None + input_metadata: ReadOnlyJSON | None = None MULTI_INPUT = Input(name="multi", type="*") @@ -140,6 +142,11 @@ def _param_to_type(name, value, type): return None if value == "" else _param_to_type(name, value, type) case (type, types.NoneType): return None if value == "" else _param_to_type(name, value, type) + if isinstance(type, typeof) and issubclass(type, pydantic.BaseModel): + try: + return type.model_validate_json(value) + except pydantic.ValidationError: + return None return value @@ -154,9 +161,7 @@ class Op(BaseConfig): def __call__(self, *inputs, **params): # Convert parameters. - for p in params: - if p in self.params: - params[p] = _param_to_type(p, params[p], self.params[p].type) + params = self.convert_params(params) res = self.func(*inputs, **params) if not isinstance(res, Result): # Automatically wrap the result in a Result object, if it isn't already. @@ -172,6 +177,16 @@ class Op(BaseConfig): res.display = res.output return res + def convert_params(self, params): + """Returns the parameters converted to the expected type.""" + res = {} + for p in params: + if p in self.params: + res[p] = _param_to_type(p, params[p], self.params[p].type) + else: + res[p] = params[p] + return res + def op(env: str, name: str, *, view="basic", outputs=None, params=None): """Decorator for defining an operation.""" diff --git a/lynxkite-core/src/lynxkite/core/workspace.py b/lynxkite-core/src/lynxkite/core/workspace.py index 6721b12e9eed69d4772d732e9d4993bfa285b296..25eda5ced1a652fe8fb3b4e5a76e83b6a3dd9e94 100644 --- a/lynxkite-core/src/lynxkite/core/workspace.py +++ b/lynxkite-core/src/lynxkite/core/workspace.py @@ -32,6 +32,7 @@ class WorkspaceNodeData(BaseConfig): title: str params: dict display: Optional[object] = None + input_metadata: Optional[object] = None error: Optional[str] = None status: NodeStatus = NodeStatus.done # Also contains a "meta" field when going out. @@ -59,12 +60,14 @@ class WorkspaceNode(BaseConfig): def publish_result(self, result: ops.Result): """Sends the result to the frontend. Call this in an executor when the result is available.""" self.data.display = result.display + self.data.input_metadata = result.input_metadata self.data.error = result.error self.data.status = NodeStatus.done if hasattr(self, "_crdt"): with self._crdt.doc.transaction(): - self._crdt["data"]["display"] = result.display - self._crdt["data"]["error"] = result.error + self._crdt["data"]["display"] = self.data.display + self._crdt["data"]["input_metadata"] = self.data.input_metadata + self._crdt["data"]["error"] = self.data.error self._crdt["data"]["status"] = NodeStatus.done def publish_error(self, error: Exception | str | None): diff --git a/lynxkite-graph-analytics/pyproject.toml b/lynxkite-graph-analytics/pyproject.toml index 95ddf6c1b1f94adb3822e5fc9668177cb46f7edf..971536c7e6c08c919c64ebaeedce1b686d06d659 100644 --- a/lynxkite-graph-analytics/pyproject.toml +++ b/lynxkite-graph-analytics/pyproject.toml @@ -14,6 +14,8 @@ dependencies = [ "osmnx>=2.0.1", "pandas>=2.2.3", "polars[gpu]>=1.14.0", + "torch>=2.6.0", + "torch-geometric>=2.6.1", ] [project.optional-dependencies] diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py index db46115e27bebd09316d27951f2b9525c4cfe270..b1731d32ef51f25c50d83465bdf4d4d671edecf5 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py @@ -42,7 +42,7 @@ class Bundle: dfs: dict[str, pd.DataFrame] = dataclasses.field(default_factory=dict) relations: list[RelationDefinition] = dataclasses.field(default_factory=list) - other: dict[str, typing.Any] = None + other: dict[str, typing.Any] = dataclasses.field(default_factory=dict) @classmethod def from_nx(cls, graph: nx.Graph): @@ -102,10 +102,11 @@ class Bundle: return Bundle( dfs=dict(self.dfs), relations=list(self.relations), - other=dict(self.other) if self.other else None, + other=dict(self.other), ) def to_dict(self, limit: int = 100): + """JSON-serializable representation of the bundle, including some data.""" return { "dataframes": { name: { @@ -115,7 +116,22 @@ class Bundle: for name, df in self.dfs.items() }, "relations": [dataclasses.asdict(relation) for relation in self.relations], - "other": self.other, + "other": {k: str(v) for k, v in self.other.items()}, + } + + def metadata(self): + """JSON-serializable information about the bundle, metadata only.""" + return { + "dataframes": { + name: { + "columns": sorted(str(c) for c in df.columns), + } + for name, df in self.dfs.items() + }, + "relations": [dataclasses.asdict(relation) for relation in self.relations], + "other": { + k: getattr(v, "metadata", lambda: {})() for k, v in self.other.items() + }, } @@ -137,8 +153,15 @@ def nx_node_attribute_func(name): def disambiguate_edges(ws: workspace.Workspace): """If an input plug is connected to multiple edges, keep only the last edge.""" + catalog = ops.CATALOGS[ws.env] + nodes = {node.id: node for node in ws.nodes} seen = set() for edge in reversed(ws.edges): + dst_node = nodes[edge.target] + op = catalog.get(dst_node.data.title) + if op.inputs[edge.targetHandle].type == list[Bundle]: + # Takes multiple bundles as an input. No need to disambiguate. + continue if (edge.target, edge.targetHandle) in seen: i = ws.edges.index(edge) del ws.edges[i] @@ -174,13 +197,14 @@ def _execute_node(node, ws, catalog, outputs): node.publish_error("Operation not found in catalog") return node.publish_started() + # TODO: Handle multi-inputs. input_map = { edge.targetHandle: outputs[edge.source] for edge in ws.edges if edge.target == node.id } + # Convert inputs types to match operation signature. try: - # Convert inputs types to match operation signature. inputs = [] for p in op.inputs.values(): if p.name not in input_map: @@ -194,16 +218,30 @@ def _execute_node(node, ws, catalog, outputs): elif p.type == Bundle and isinstance(x, pd.DataFrame): x = Bundle.from_df(x) inputs.append(x) - result = op(*inputs, **params) except Exception as e: if os.environ.get("LYNXKITE_LOG_OP_ERRORS"): traceback.print_exc() node.publish_error(e) return - outputs[node.id] = result.output + # Execute op. + try: + result = op(*inputs, **params) + except Exception as e: + if os.environ.get("LYNXKITE_LOG_OP_ERRORS"): + traceback.print_exc() + result = ops.Result(error=str(e)) + result.input_metadata = [_get_metadata(i) for i in inputs] + if result.output is not None: + outputs[node.id] = result.output node.publish_result(result) +def _get_metadata(x): + if hasattr(x, "metadata"): + return x.metadata() + return {} + + def df_for_frontend(df: pd.DataFrame, limit: int) -> pd.DataFrame: """Returns a DataFrame with values that are safe to send to the frontend.""" df = df[:limit] diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py index ec1b0ed1f6165abb0527dbb443ca66f65782650a..789378a0054f1def56656c9d842c82d88385c02f 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py @@ -2,10 +2,14 @@ import enum import os +import pathlib import fsspec from lynxkite.core import ops from collections import deque -from . import core + +from tqdm import tqdm +from . import core, pytorch_model_ops +from lynxkite.core import workspace import grandcypher import joblib import matplotlib @@ -165,11 +169,11 @@ def cypher(bundle: core.Bundle, *, query: ops.LongStr, save_as: str = "result"): return bundle -@op("Organize bundle") -def organize_bundle(bundle: core.Bundle, *, code: ops.LongStr): +@op("Organize") +def organize(bundle: list[core.Bundle], *, code: ops.LongStr) -> core.Bundle: """Lets you rename/copy/delete DataFrames, and modify relations. - TODO: Use a declarative solution instead of Python code. Add UI. + TODO: Merge this with "Create graph". """ bundle = bundle.copy() exec(code, globals(), {"bundle": bundle}) @@ -342,3 +346,108 @@ def create_graph(bundle: core.Bundle, *, relations: str = None) -> core.Bundle: core.RelationDefinition(**r) for r in json.loads(relations).values() ] return ops.Result(output=bundle, display=bundle.to_dict(limit=100)) + + +def load_ws(model_workspace: str): + cwd = pathlib.Path() + path = cwd / model_workspace + assert path.is_relative_to(cwd) + assert path.exists(), f"Workspace {path} does not exist" + ws = workspace.load(path) + return ws + + +@op("Biomedical foundation graph (PLACEHOLDER)") +def biomedical_foundation_graph(*, filter_nodes: str): + """Loads the gigantic Lynx-maintained knowledge graph. Includes drugs, diseases, genes, proteins, etc.""" + return None + + +@op("Define model") +def define_model( + bundle: core.Bundle, + *, + model_workspace: str, + save_as: str = "model", +): + """Trains the selected model on the selected dataset. Most training parameters are set in the model definition.""" + assert model_workspace, "Model workspace is unset." + ws = load_ws(model_workspace) + # Build the model without inputs, to get its interface. + m = pytorch_model_ops.build_model(ws, {}) + m.source_workspace = model_workspace + bundle = bundle.copy() + bundle.other[save_as] = m + return bundle + + +# These contain the same mapping, but they get different UIs. +# For inputs, you select existing columns. For outputs, you can create new columns. +class ModelInferenceInputMapping(pytorch_model_ops.ModelMapping): + pass + + +class ModelTrainingInputMapping(pytorch_model_ops.ModelMapping): + pass + + +class ModelOutputMapping(pytorch_model_ops.ModelMapping): + pass + + +@op("Train model") +def train_model( + bundle: core.Bundle, + *, + model_name: str = "model", + input_mapping: ModelTrainingInputMapping, + epochs: int = 1, +): + """Trains the selected model on the selected dataset. Most training parameters are set in the model definition.""" + m = bundle.other[model_name].copy() + inputs = pytorch_model_ops.to_tensors(bundle, input_mapping) + if not m.trained and m.source_workspace: + # Rebuild the model for the correct inputs. + ws = load_ws(m.source_workspace) + m = pytorch_model_ops.build_model(ws, inputs) + t = tqdm(range(epochs), desc="Training model") + for _ in t: + loss = m.train(inputs) + t.set_postfix({"loss": loss}) + m.trained = True + bundle = bundle.copy() + bundle.other[model_name] = m + return bundle + + +@op("Model inference") +def model_inference( + bundle: core.Bundle, + *, + model_name: str = "model", + input_mapping: ModelInferenceInputMapping, + output_mapping: ModelOutputMapping, +): + """Executes a trained model.""" + if input_mapping is None or output_mapping is None: + return ops.Result(bundle, error="Mapping is unset.") + m = bundle.other[model_name] + assert m.trained, "The model is not trained." + inputs = pytorch_model_ops.to_tensors(bundle, input_mapping) + outputs = m.inference(inputs) + bundle = bundle.copy() + for k, v in output_mapping.map.items(): + bundle.dfs[v.df][v.column] = outputs[k].detach().numpy().tolist() + return bundle + + +@op("Train/test split") +def train_test_split(bundle: core.Bundle, *, table_name: str, test_ratio: float = 0.1): + """Splits a dataframe in the bundle into separate "_train" and "_test" dataframes.""" + df = bundle.dfs[table_name] + test = df.sample(frac=test_ratio) + train = df.drop(test.index) + bundle = bundle.copy() + bundle.dfs[f"{table_name}_train"] = train + bundle.dfs[f"{table_name}_test"] = test + return bundle diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch_model_ops.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch_model_ops.py index e70dc0287005a89c268d44ee011a55f4431a206c..5ac8c03bbea63f40096a079f8bbfda91bd2781d4 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch_model_ops.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch_model_ops.py @@ -1,7 +1,16 @@ """Boxes for defining PyTorch models.""" -from lynxkite.core import ops +import copy +import graphlib +import types + +import pydantic +from lynxkite.core import ops, workspace from lynxkite.core.ops import Parameter as P +import torch +import torch_geometric as pyg +import dataclasses +from . import core ENV = "PyTorch model" @@ -22,16 +31,43 @@ def reg(name, inputs=[], outputs=None, params=[]): ) -reg("Input: features", outputs=["x"]) +reg("Input: embedding", outputs=["x"]) reg("Input: graph edges", outputs=["edges"]) reg("Input: label", outputs=["y"]) reg("Input: positive sample", outputs=["x_pos"]) reg("Input: negative sample", outputs=["x_neg"]) +reg("Input: sequential", outputs=["y"]) +reg("Input: zeros", outputs=["x"]) -reg("Attention", inputs=["q", "k", "v"], outputs=["x"]) +reg("LSTM", inputs=["x", "h"], outputs=["x", "h"]) +reg( + "Neural ODE", + inputs=["x"], + params=[ + P.basic("relative_tolerance"), + P.basic("absolute_tolerance"), + P.options( + "method", + [ + "dopri8", + "dopri5", + "bosh3", + "fehlberg2", + "adaptive_heun", + "euler", + "midpoint", + "rk4", + "explicit_adams", + "implicit_adams", + ], + ), + ], +) +reg("Attention", inputs=["q", "k", "v"], outputs=["x", "weights"]) reg("LayerNorm", inputs=["x"]) reg("Dropout", inputs=["x"], params=[P.basic("p", 0.5)]) reg("Linear", inputs=["x"], params=[P.basic("output_dim", "same")]) +reg("Softmax", inputs=["x"]) reg( "Graph conv", inputs=["x", "edges"], @@ -41,10 +77,15 @@ reg( reg( "Activation", inputs=["x"], - params=[P.options("type", ["ReLU", "LeakyReLU", "Tanh", "Mish"])], + params=[P.options("type", ["ReLU", "Leaky ReLU", "Tanh", "Mish"])], ) -reg("Supervised loss", inputs=["x", "y"], outputs=["loss"]) -reg("Triplet loss", inputs=["x", "x_pos", "x_neg"], outputs=["loss"]) +reg("Concatenate", inputs=["a", "b"], outputs=["x"]) +reg("Add", inputs=["a", "b"], outputs=["x"]) +reg("Subtract", inputs=["a", "b"], outputs=["x"]) +reg("Multiply", inputs=["a", "b"], outputs=["x"]) +reg("MSE loss", inputs=["x", "y"], outputs=["loss"]) +reg("Triplet margin loss", inputs=["x", "x_pos", "x_neg"], outputs=["loss"]) +reg("Cross-entropy loss", inputs=["x", "y"], outputs=["loss"]) reg( "Optimizer", inputs=["loss"], @@ -71,5 +112,211 @@ ops.register_passive_op( "Repeat", inputs=[ops.Input(name="input", position="top", type="tensor")], outputs=[ops.Output(name="output", position="bottom", type="tensor")], - params=[ops.Parameter.basic("times", 1, int)], + params=[ + ops.Parameter.basic("times", 1, int), + ops.Parameter.basic("same_weights", True, bool), + ], +) + +ops.register_passive_op( + ENV, + "Recurrent chain", + inputs=[ops.Input(name="input", position="top", type="tensor")], + outputs=[ops.Output(name="output", position="bottom", type="tensor")], + params=[], ) + + +def _to_id(*strings: str) -> str: + """Replaces all non-alphanumeric characters with underscores.""" + return "_".join("".join(c if c.isalnum() else "_" for c in s) for s in strings) + + +class ColumnSpec(pydantic.BaseModel): + df: str + column: str + + +class ModelMapping(pydantic.BaseModel): + map: dict[str, ColumnSpec] + + +@dataclasses.dataclass +class ModelConfig: + model: torch.nn.Module + model_inputs: list[str] + model_outputs: list[str] + loss_inputs: list[str] + loss: torch.nn.Module + optimizer: torch.optim.Optimizer + source_workspace: str | None = None + trained: bool = False + + def _forward(self, inputs: dict[str, torch.Tensor]) -> dict[str, torch.Tensor]: + model_inputs = [inputs[i] for i in self.model_inputs] + output = self.model(*model_inputs) + if not isinstance(output, tuple): + output = (output,) + values = {k: v for k, v in zip(self.model_outputs, output)} + return values + + def inference(self, inputs: dict[str, torch.Tensor]) -> dict[str, torch.Tensor]: + # TODO: Do multiple batches. + self.model.eval() + return self._forward(inputs) + + def train(self, inputs: dict[str, torch.Tensor]) -> float: + """Train the model for one epoch. Returns the loss.""" + # TODO: Do multiple batches. + self.model.train() + self.optimizer.zero_grad() + values = self._forward(inputs) + values.update(inputs) + loss_inputs = [values[i] for i in self.loss_inputs] + loss = self.loss(*loss_inputs) + loss.backward() + self.optimizer.step() + return loss.item() + + def copy(self): + """Returns a copy of the model.""" + c = dataclasses.replace(self) + c.model = copy.deepcopy(self.model) + return c + + def metadata(self): + return { + "type": "model", + "model": { + "inputs": self.model_inputs, + "outputs": self.model_outputs, + "loss_inputs": self.loss_inputs, + "trained": self.trained, + }, + } + + +def build_model( + ws: workspace.Workspace, inputs: dict[str, torch.Tensor] +) -> ModelConfig: + """Builds the model described in the workspace.""" + catalog = ops.CATALOGS[ENV] + optimizers = [] + nodes = {} + for node in ws.nodes: + nodes[node.id] = node + if node.data.title == "Optimizer": + optimizers.append(node.id) + assert optimizers, "No optimizer found." + assert len(optimizers) == 1, f"More than one optimizer found: {optimizers}" + [optimizer] = optimizers + dependencies = {n.id: [] for n in ws.nodes} + in_edges = {} + out_edges = {} + # TODO: Dissolve repeat boxes here. + for e in ws.edges: + dependencies[e.target].append(e.source) + in_edges.setdefault(e.target, {}).setdefault(e.targetHandle, []).append( + (e.source, e.sourceHandle) + ) + out_edges.setdefault(e.source, {}).setdefault(e.sourceHandle, []).append( + (e.target, e.targetHandle) + ) + sizes = {} + for k, i in inputs.items(): + sizes[k] = i.shape[-1] + ts = graphlib.TopologicalSorter(dependencies) + layers = [] + loss_layers = [] + in_loss = set() + cfg = {} + used_in_model = set() + made_in_model = set() + used_in_loss = set() + made_in_loss = set() + for node_id in ts.static_order(): + node = nodes[node_id] + t = node.data.title + op = catalog[t] + p = op.convert_params(node.data.params) + for b in dependencies[node_id]: + if b in in_loss: + in_loss.add(node_id) + if "loss" in t: + in_loss.add(node_id) + inputs = {} + for n in in_edges.get(node_id, []): + for b, h in in_edges[node_id][n]: + i = _to_id(b, h) + inputs[n] = i + if node_id in in_loss: + used_in_loss.add(i) + else: + used_in_model.add(i) + outputs = {} + for out in out_edges.get(node_id, []): + i = _to_id(node_id, out) + outputs[out] = i + if inputs: # Nodes with no inputs are input nodes. Their outputs are not "made" by us. + if node_id in in_loss: + made_in_loss.add(i) + else: + made_in_model.add(i) + inputs = types.SimpleNamespace(**inputs) + outputs = types.SimpleNamespace(**outputs) + ls = loss_layers if node_id in in_loss else layers + match t: + case "Linear": + isize = sizes.get(inputs.x, 1) + osize = isize if p["output_dim"] == "same" else int(p["output_dim"]) + ls.append((torch.nn.Linear(isize, osize), f"{inputs.x} -> {outputs.x}")) + sizes[outputs.x] = osize + case "Activation": + f = getattr( + torch.nn.functional, p["type"].name.lower().replace(" ", "_") + ) + ls.append((f, f"{inputs.x} -> {outputs.x}")) + sizes[outputs.x] = sizes.get(inputs.x, 1) + case "MSE loss": + ls.append( + ( + torch.nn.functional.mse_loss, + f"{inputs.x}, {inputs.y} -> {outputs.loss}", + ) + ) + cfg["model_inputs"] = list(used_in_model - made_in_model) + cfg["model_outputs"] = list(made_in_model & used_in_loss) + cfg["loss_inputs"] = list(used_in_loss - made_in_loss) + # Make sure the trained output is output from the last model layer. + outputs = ", ".join(cfg["model_outputs"]) + layers.append((torch.nn.Identity(), f"{outputs} -> {outputs}")) + # Create model. + cfg["model"] = pyg.nn.Sequential(", ".join(cfg["model_inputs"]), layers) + # Make sure the loss is output from the last loss layer. + [(lossb, lossh)] = in_edges[optimizer]["loss"] + lossi = _to_id(lossb, lossh) + loss_layers.append((torch.nn.Identity(), f"{lossi} -> loss")) + # Create loss function. + cfg["loss"] = pyg.nn.Sequential(", ".join(cfg["loss_inputs"]), loss_layers) + assert not list(cfg["loss"].parameters()), ( + f"loss should have no parameters: {list(cfg['loss'].parameters())}" + ) + # Create optimizer. + op = catalog["Optimizer"] + p = op.convert_params(nodes[optimizer].data.params) + o = getattr(torch.optim, p["type"].name) + cfg["optimizer"] = o(cfg["model"].parameters(), lr=p["lr"]) + return ModelConfig(**cfg) + + +def to_tensors(b: core.Bundle, m: ModelMapping | None) -> dict[str, torch.Tensor]: + """Converts a tensor to the correct type for PyTorch. Ignores missing mappings.""" + if m is None: + return {} + tensors = {} + for k, v in m.map.items(): + if v.df in b.dfs and v.column in b.dfs[v.df]: + tensors[k] = torch.tensor( + b.dfs[v.df][v.column].to_list(), dtype=torch.float32 + ) + return tensors diff --git a/lynxkite-graph-analytics/tests/test_pytorch_model_ops.py b/lynxkite-graph-analytics/tests/test_pytorch_model_ops.py new file mode 100644 index 0000000000000000000000000000000000000000..c2d435a60ba5e4fe6b9c39bdfa8459f5831bbafd --- /dev/null +++ b/lynxkite-graph-analytics/tests/test_pytorch_model_ops.py @@ -0,0 +1,65 @@ +from lynxkite.core import workspace +from lynxkite_graph_analytics import pytorch_model_ops +import torch +import pytest + + +def make_ws(env, nodes: dict[str, dict], edges: list[tuple[str, str, str, str]]): + ws = workspace.Workspace(env=env) + for id, data in nodes.items(): + ws.nodes.append( + workspace.WorkspaceNode( + id=id, + type="basic", + data=workspace.WorkspaceNodeData(title=data["title"], params=data), + position=workspace.Position( + x=data.get("x", 0), + y=data.get("y", 0), + ), + ) + ) + ws.edges = [ + workspace.WorkspaceEdge( + id=f"{source}->{target}", + source=source.split(":")[0], + target=target.split(":")[0], + sourceHandle=source.split(":")[1], + targetHandle=target.split(":")[1], + ) + for source, target in edges + ] + return ws + + +async def test_build_model(): + ws = make_ws( + pytorch_model_ops.ENV, + { + "emb": {"title": "Input: embedding"}, + "lin": {"title": "Linear", "output_dim": "same"}, + "act": {"title": "Activation", "type": "Leaky ReLU"}, + "label": {"title": "Input: label"}, + "loss": {"title": "MSE loss"}, + "optim": {"title": "Optimizer", "type": "SGD", "lr": 0.1}, + }, + [ + ("emb:x", "lin:x"), + ("lin:x", "act:x"), + ("act:x", "loss:x"), + ("label:y", "loss:y"), + ("loss:loss", "optim:loss"), + ], + ) + x = torch.rand(100, 4) + y = x + 1 + m = pytorch_model_ops.build_model(ws, {"emb_x": x, "label_y": y}) + for i in range(1000): + loss = m.train({"emb_x": x, "label_y": y}) + assert loss < 0.1 + o = m.inference({"emb_x": x[:1]}) + error = torch.nn.functional.mse_loss(o["act_x"], x[:1] + 1) + assert error < 0.1 + + +if __name__ == "__main__": + pytest.main() diff --git a/lynxkite-graph-analytics/uv.lock b/lynxkite-graph-analytics/uv.lock index b4fb75927cca52c0357ef1270f9e38bbe491119d..76f80f6e777abbb5b7eec8bdb6daf4b350b952fa 100644 --- a/lynxkite-graph-analytics/uv.lock +++ b/lynxkite-graph-analytics/uv.lock @@ -9,6 +9,101 @@ resolution-markers = [ "python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", ] +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, +] + +[[package]] +name = "aiohttp" +version = "3.11.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/96/91e93ae5fd04d428c101cdbabce6c820d284d61d2614d00518f4fa52ea24/aiohttp-3.11.14.tar.gz", hash = "sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c", size = 7676994 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/f5/5e2ae82822b1781f828bb9285fb585a4ac028cfd329788caf073bde45706/aiohttp-3.11.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f296d637a50bb15fb6a229fbb0eb053080e703b53dbfe55b1e4bb1c5ed25d325", size = 709382 }, + { url = "https://files.pythonhosted.org/packages/2f/eb/a0e118c54eb9f897e13e7a357b2ef9b8d0ca438060a9db8ad4af4561aab4/aiohttp-3.11.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6cd1954ca2bbf0970f531a628da1b1338f594bf5da7e361e19ba163ecc4f3b", size = 469254 }, + { url = "https://files.pythonhosted.org/packages/ea/3f/03c2f177536ad6ab4d3052e21fb67ce430d0257b3c61a0ef6b91b7b12cb4/aiohttp-3.11.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:572def4aad0a4775af66d5a2b5923c7de0820ecaeeb7987dcbccda2a735a993f", size = 456342 }, + { url = "https://files.pythonhosted.org/packages/d8/fe/849c000be857f60e36d2ce0a8c3d1ad34f8ea64b0ff119ecdafbc94cddfb/aiohttp-3.11.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c68e41c4d576cd6aa6c6d2eddfb32b2acfb07ebfbb4f9da991da26633a3db1a", size = 1686573 }, + { url = "https://files.pythonhosted.org/packages/a8/e9/737aef162bf618f3b3e0f4a6ed03b5baca5e2a9ffabdab4be1b756ca1061/aiohttp-3.11.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b8bbfc8111826aa8363442c0fc1f5751456b008737ff053570f06a151650b3", size = 1747903 }, + { url = "https://files.pythonhosted.org/packages/15/19/a510c51e5a383ad804e51040819898d074106dc297adf0e2c78dccc8ab47/aiohttp-3.11.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b0a200e85da5c966277a402736a96457b882360aa15416bf104ca81e6f5807b", size = 1788922 }, + { url = "https://files.pythonhosted.org/packages/51/66/30b217d0de5584650340025a285f1d0abf2039e5a683342891e84f250da9/aiohttp-3.11.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d173c0ac508a2175f7c9a115a50db5fd3e35190d96fdd1a17f9cb10a6ab09aa1", size = 1676062 }, + { url = "https://files.pythonhosted.org/packages/27/90/9f61d0c7b185e5a413ae7a3e206e7759ea1b208fff420b380ab205ab82b5/aiohttp-3.11.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:413fe39fd929329f697f41ad67936f379cba06fcd4c462b62e5b0f8061ee4a77", size = 1620750 }, + { url = "https://files.pythonhosted.org/packages/c9/5a/455a6b8aea18ec8590f0a5642caf6d0494152de09579a4fd4f9530a4a111/aiohttp-3.11.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65c75b14ee74e8eeff2886321e76188cbe938d18c85cff349d948430179ad02c", size = 1655093 }, + { url = "https://files.pythonhosted.org/packages/f5/4b/b369e5e809bdb46a306df7b22e611dc8622ebb5313498c11f6e1cb986408/aiohttp-3.11.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:321238a42ed463848f06e291c4bbfb3d15ba5a79221a82c502da3e23d7525d06", size = 1661318 }, + { url = "https://files.pythonhosted.org/packages/25/ac/a211dd149485e7c518481b08d7c13e7acd32090daf1e396aaea6b9f2eea9/aiohttp-3.11.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59a05cdc636431f7ce843c7c2f04772437dd816a5289f16440b19441be6511f1", size = 1650991 }, + { url = "https://files.pythonhosted.org/packages/74/c4/8b1d41853f1ccd4cb66edc909ccc2a95b332081661f04324f7064cc200d8/aiohttp-3.11.14-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:daf20d9c3b12ae0fdf15ed92235e190f8284945563c4b8ad95b2d7a31f331cd3", size = 1734371 }, + { url = "https://files.pythonhosted.org/packages/d9/e2/e244684266722d819f41d7e798ce8bbee3b72420eb684193a076ea1bf18f/aiohttp-3.11.14-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:05582cb2d156ac7506e68b5eac83179faedad74522ed88f88e5861b78740dc0e", size = 1756128 }, + { url = "https://files.pythonhosted.org/packages/e9/59/79d37f2badafbe229c7654dbf631b38419fcaa979a45c04941397ad7251c/aiohttp-3.11.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12c5869e7ddf6b4b1f2109702b3cd7515667b437da90a5a4a50ba1354fe41881", size = 1694370 }, + { url = "https://files.pythonhosted.org/packages/04/0f/aaaf3fc8533f65eba4572a79a935b9033e663f67f763b10db16f1c40a067/aiohttp-3.11.14-cp311-cp311-win32.whl", hash = "sha256:92868f6512714efd4a6d6cb2bfc4903b997b36b97baea85f744229f18d12755e", size = 417192 }, + { url = "https://files.pythonhosted.org/packages/07/3c/aa468550b7fcd0c634d4aa8192f33ce32a179ecba08b908a0ed272194f87/aiohttp-3.11.14-cp311-cp311-win_amd64.whl", hash = "sha256:bccd2cb7aa5a3bfada72681bdb91637094d81639e116eac368f8b3874620a654", size = 443590 }, + { url = "https://files.pythonhosted.org/packages/9c/ca/e4acb3b41f9e176f50960f7162d656e79bed151b1f911173b2c4a6c0a9d2/aiohttp-3.11.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:70ab0f61c1a73d3e0342cedd9a7321425c27a7067bebeeacd509f96695b875fc", size = 705489 }, + { url = "https://files.pythonhosted.org/packages/84/d5/dcf870e0b11f0c1e3065b7f17673485afa1ddb3d630ccd8f328bccfb459f/aiohttp-3.11.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:602d4db80daf4497de93cb1ce00b8fc79969c0a7cf5b67bec96fa939268d806a", size = 464807 }, + { url = "https://files.pythonhosted.org/packages/7c/f0/dc417d819ae26be6abcd72c28af99d285887fddbf76d4bbe46346f201870/aiohttp-3.11.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a8a0d127c10b8d89e69bbd3430da0f73946d839e65fec00ae48ca7916a31948", size = 456819 }, + { url = "https://files.pythonhosted.org/packages/28/db/f7deb0862ebb821aa3829db20081a122ba67ffd149303f2d5202e30f20cd/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9f835cdfedcb3f5947304e85b8ca3ace31eef6346d8027a97f4de5fb687534", size = 1683536 }, + { url = "https://files.pythonhosted.org/packages/5e/0d/8bf0619e21c6714902c44ab53e275deb543d4d2e68ab2b7b8fe5ba267506/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aa5c68e1e68fff7cd3142288101deb4316b51f03d50c92de6ea5ce646e6c71f", size = 1738111 }, + { url = "https://files.pythonhosted.org/packages/f5/10/204b3700bb57b30b9e759d453fcfb3ad79a3eb18ece4e298aaf7917757dd/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b512f1de1c688f88dbe1b8bb1283f7fbeb7a2b2b26e743bb2193cbadfa6f307", size = 1794508 }, + { url = "https://files.pythonhosted.org/packages/cc/39/3f65072614c62a315a951fda737e4d9e6e2703f1da0cd2f2d8f629e6092e/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc9253069158d57e27d47a8453d8a2c5a370dc461374111b5184cf2f147a3cc3", size = 1692006 }, + { url = "https://files.pythonhosted.org/packages/73/77/cc06ecea173f9bee2f20c8e32e2cf4c8e03909a707183cdf95434db4993e/aiohttp-3.11.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2501f1b981e70932b4a552fc9b3c942991c7ae429ea117e8fba57718cdeed0", size = 1620369 }, + { url = "https://files.pythonhosted.org/packages/87/75/5bd424bcd90c7eb2f50fd752d013db4cefb447deeecfc5bc4e8e0b1c74dd/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:28a3d083819741592685762d51d789e6155411277050d08066537c5edc4066e6", size = 1642508 }, + { url = "https://files.pythonhosted.org/packages/81/f0/ce936ec575e0569f91e5c8374086a6f7760926f16c3b95428fb55d6bfe91/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0df3788187559c262922846087e36228b75987f3ae31dd0a1e5ee1034090d42f", size = 1685771 }, + { url = "https://files.pythonhosted.org/packages/68/b7/5216590b99b5b1f18989221c25ac9d9a14a7b0c3c4ae1ff728e906c36430/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e73fa341d8b308bb799cf0ab6f55fc0461d27a9fa3e4582755a3d81a6af8c09", size = 1648318 }, + { url = "https://files.pythonhosted.org/packages/a5/c2/c27061c4ab93fa25f925c7ebddc10c20d992dbbc329e89d493811299dc93/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51ba80d473eb780a329d73ac8afa44aa71dfb521693ccea1dea8b9b5c4df45ce", size = 1704545 }, + { url = "https://files.pythonhosted.org/packages/09/f5/11b2da82f2c52365a5b760a4e944ae50a89cf5fb207024b7853615254584/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8d1dd75aa4d855c7debaf1ef830ff2dfcc33f893c7db0af2423ee761ebffd22b", size = 1737839 }, + { url = "https://files.pythonhosted.org/packages/03/7f/145e23fe0a4c45b256f14c3268ada5497d487786334721ae8a0c818ee516/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41cf0cefd9e7b5c646c2ef529c8335e7eafd326f444cc1cdb0c47b6bc836f9be", size = 1695833 }, + { url = "https://files.pythonhosted.org/packages/1c/78/627dba6ee9fb9439e2e29b521adb1135877a9c7b54811fec5c46e59f2fc8/aiohttp-3.11.14-cp312-cp312-win32.whl", hash = "sha256:948abc8952aff63de7b2c83bfe3f211c727da3a33c3a5866a0e2cf1ee1aa950f", size = 412185 }, + { url = "https://files.pythonhosted.org/packages/3f/5f/1737cf6fcf0524693a4aeff8746530b65422236761e7bfdd79c6d2ce2e1c/aiohttp-3.11.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b420d076a46f41ea48e5fcccb996f517af0d406267e31e6716f480a3d50d65c", size = 438526 }, + { url = "https://files.pythonhosted.org/packages/c5/8e/d7f353c5aaf9f868ab382c3d3320dc6efaa639b6b30d5a686bed83196115/aiohttp-3.11.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d14e274828561db91e4178f0057a915f3af1757b94c2ca283cb34cbb6e00b50", size = 698774 }, + { url = "https://files.pythonhosted.org/packages/d5/52/097b98d50f8550883f7d360c6cd4e77668c7442038671bb4b349ced95066/aiohttp-3.11.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f30fc72daf85486cdcdfc3f5e0aea9255493ef499e31582b34abadbfaafb0965", size = 461443 }, + { url = "https://files.pythonhosted.org/packages/2b/5c/19c84bb5796be6ca4fd1432012cfd5f88ec02c8b9e0357cdecc48ff2c4fd/aiohttp-3.11.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4edcbe34e6dba0136e4cabf7568f5a434d89cc9de5d5155371acda275353d228", size = 453717 }, + { url = "https://files.pythonhosted.org/packages/6d/08/61c2b6f04a4e1329c82ffda53dd0ac4b434681dc003578a1237d318be885/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7169ded15505f55a87f8f0812c94c9412623c744227b9e51083a72a48b68a5", size = 1666559 }, + { url = "https://files.pythonhosted.org/packages/7c/22/913ad5b4b979ecf69300869551c210b2eb8c22ca4cd472824a1425479775/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad1f2fb9fe9b585ea4b436d6e998e71b50d2b087b694ab277b30e060c434e5db", size = 1721701 }, + { url = "https://files.pythonhosted.org/packages/5b/ea/0ee73ea764b2e1f769c1caf59f299ac017b50632ceaa809960385b68e735/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20412c7cc3720e47a47e63c0005f78c0c2370020f9f4770d7fc0075f397a9fb0", size = 1779094 }, + { url = "https://files.pythonhosted.org/packages/e6/ca/6ce3da7c3295e0655b3404a309c7002099ca3619aeb04d305cedc77a0a14/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd9766da617855f7e85f27d2bf9a565ace04ba7c387323cd3e651ac4329db91", size = 1678406 }, + { url = "https://files.pythonhosted.org/packages/b1/b1/3a13ed54dc6bb57057cc94fec2a742f24a89885cfa84b71930826af40f5f/aiohttp-3.11.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:599b66582f7276ebefbaa38adf37585e636b6a7a73382eb412f7bc0fc55fb73d", size = 1604446 }, + { url = "https://files.pythonhosted.org/packages/00/21/fc9f327a121ff0be32ed4ec3ccca65f420549bf3a646b02f8534ba5fe86d/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b41693b7388324b80f9acfabd479bd1c84f0bc7e8f17bab4ecd9675e9ff9c734", size = 1619129 }, + { url = "https://files.pythonhosted.org/packages/56/5b/1a4a45b1f6f95b998c49d3d1e7763a75eeff29f2f5ec7e06d94a359e7d97/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:86135c32d06927339c8c5e64f96e4eee8825d928374b9b71a3c42379d7437058", size = 1657924 }, + { url = "https://files.pythonhosted.org/packages/2f/2d/b6211aa0664b87c93fda2f2f60d5211be514a2d5b4935e1286d54b8aa28d/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04eb541ce1e03edc1e3be1917a0f45ac703e913c21a940111df73a2c2db11d73", size = 1617501 }, + { url = "https://files.pythonhosted.org/packages/fa/3d/d46ccb1f361a1275a078bfc1509bcd6dc6873e22306d10baa61bc77a0dfc/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dc311634f6f28661a76cbc1c28ecf3b3a70a8edd67b69288ab7ca91058eb5a33", size = 1684211 }, + { url = "https://files.pythonhosted.org/packages/2d/e2/71d12ee6268ad3bf4ee82a4f2fc7f0b943f480296cb6f61af1afe05b8d24/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:69bb252bfdca385ccabfd55f4cd740d421dd8c8ad438ded9637d81c228d0da49", size = 1715797 }, + { url = "https://files.pythonhosted.org/packages/8d/a7/d0de521dc5ca6e8c766f8d1f373c859925f10b2a96455b16107c1e9b2d60/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b86efe23684b58a88e530c4ab5b20145f102916bbb2d82942cafec7bd36a647", size = 1673682 }, + { url = "https://files.pythonhosted.org/packages/f0/86/5c075ebeca7063a49a0da65a4e0aa9e49d741aca9a2fe9552d86906e159b/aiohttp-3.11.14-cp313-cp313-win32.whl", hash = "sha256:b9c60d1de973ca94af02053d9b5111c4fbf97158e139b14f1be68337be267be6", size = 411014 }, + { url = "https://files.pythonhosted.org/packages/4a/e0/2f9e77ef2d4a1dbf05f40b7edf1e1ce9be72bdbe6037cf1db1712b455e3e/aiohttp-3.11.14-cp313-cp313-win_amd64.whl", hash = "sha256:0a29be28e60e5610d2437b5b2fed61d6f3dcde898b57fb048aa5079271e7f6f3", size = 436964 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, +] + [[package]] name = "certifi" version = "2025.1.31" @@ -205,6 +300,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/28/a3/2ad0a0a69662fd4cf556ab8074f0de978ee9b56bff6ddb4e656df4aa9e8e/fastrlock-0.8.3-cp313-cp313-win_amd64.whl", hash = "sha256:8d1d6a28291b4ace2a66bd7b49a9ed9c762467617febdd9ab356b867ed901af8", size = 30472 }, ] +[[package]] +name = "filelock" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, +] + [[package]] name = "fonttools" version = "4.55.3" @@ -238,6 +342,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/3b/406d17b1f63e04a82aa621936e6e1c53a8c05458abd66300ac85ea7f9ae9/fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", size = 1111638 }, ] +[[package]] +name = "frozenlist" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987 }, + { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584 }, + { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499 }, + { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357 }, + { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516 }, + { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131 }, + { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320 }, + { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877 }, + { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592 }, + { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934 }, + { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859 }, + { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560 }, + { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150 }, + { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244 }, + { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634 }, + { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, + { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, + { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, + { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, + { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, + { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, + { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, + { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, + { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, + { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, + { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, + { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, + { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, + { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, + { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, + { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, + { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, + { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, + { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, + { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, + { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, + { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, + { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, + { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, + { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, + { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, + { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, + { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, + { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, + { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, +] + [[package]] name = "fsspec" version = "2025.2.0" @@ -302,6 +460,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, +] + [[package]] name = "joblib" version = "1.4.2" @@ -448,6 +618,8 @@ dependencies = [ { name = "osmnx" }, { name = "pandas" }, { name = "polars", extra = ["gpu"] }, + { name = "torch" }, + { name = "torch-geometric" }, ] [package.optional-dependencies] @@ -473,6 +645,56 @@ requires-dist = [ { name = "polars", extras = ["gpu"], specifier = ">=1.14.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.4" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.25.3" }, + { name = "torch", specifier = ">=2.6.0" }, + { name = "torch-geometric", specifier = ">=2.6.1" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] [[package]] @@ -518,6 +740,84 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/dd/e6ae97151e5ed648ab2ea48885bc33d39202b640eec7a2910e2c843f7ac0/matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c", size = 8109742 }, ] +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + +[[package]] +name = "multidict" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/4a/7874ca44a1c9b23796c767dd94159f6c17e31c0e7d090552a1c623247d82/multidict-6.2.0.tar.gz", hash = "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", size = 71066 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/aa/879cf5581bd56c19f1bd2682ee4ecfd4085a404668d4ee5138b0a08eaf2a/multidict-6.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46", size = 49125 }, + { url = "https://files.pythonhosted.org/packages/9e/d8/e6d47c166c13c48be8efb9720afe0f5cdc4da4687547192cbc3c03903041/multidict-6.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932", size = 29689 }, + { url = "https://files.pythonhosted.org/packages/a4/20/f3f0a2ca142c81100b6d4cbf79505961b54181d66157615bba3955304442/multidict-6.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf", size = 29975 }, + { url = "https://files.pythonhosted.org/packages/ab/2d/1724972c7aeb7aa1916a3276cb32f9c39e186456ee7ed621504e7a758322/multidict-6.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf", size = 135688 }, + { url = "https://files.pythonhosted.org/packages/1a/08/ea54e7e245aaf0bb1c758578e5afba394ffccb8bd80d229a499b9b83f2b1/multidict-6.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc", size = 142703 }, + { url = "https://files.pythonhosted.org/packages/97/76/960dee0424f38c71eda54101ee1ca7bb47c5250ed02f7b3e8e50b1ce0603/multidict-6.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1", size = 138559 }, + { url = "https://files.pythonhosted.org/packages/d0/35/969fd792e2e72801d80307f0a14f5b19c066d4a51d34dded22c71401527d/multidict-6.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081", size = 133312 }, + { url = "https://files.pythonhosted.org/packages/a4/b8/f96657a2f744d577cfda5a7edf9da04a731b80d3239eafbfe7ca4d944695/multidict-6.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98", size = 125652 }, + { url = "https://files.pythonhosted.org/packages/35/9d/97696d052297d8e2e08195a25c7aae873a6186c147b7635f979edbe3acde/multidict-6.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633", size = 139015 }, + { url = "https://files.pythonhosted.org/packages/31/a0/5c106e28d42f20288c10049bc6647364287ba049dc00d6ae4f1584eb1bd1/multidict-6.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e", size = 132437 }, + { url = "https://files.pythonhosted.org/packages/55/57/d5c60c075fef73422ae3b8f914221485b9ff15000b2db657c03bd190aee0/multidict-6.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d", size = 144037 }, + { url = "https://files.pythonhosted.org/packages/eb/56/a23f599c697a455bf65ecb0f69a5b052d6442c567d380ed423f816246824/multidict-6.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4", size = 138535 }, + { url = "https://files.pythonhosted.org/packages/34/3a/a06ff9b5899090f4bbdbf09e237964c76cecfe75d2aa921e801356314017/multidict-6.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2", size = 136885 }, + { url = "https://files.pythonhosted.org/packages/d6/28/489c0eca1df3800cb5d0a66278d5dd2a4deae747a41d1cf553e6a4c0a984/multidict-6.2.0-cp311-cp311-win32.whl", hash = "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d", size = 27044 }, + { url = "https://files.pythonhosted.org/packages/d0/b5/c7cd5ba9581add40bc743980f82426b90d9f42db0b56502011f1b3c929df/multidict-6.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86", size = 29145 }, + { url = "https://files.pythonhosted.org/packages/a4/e2/0153a8db878aef9b2397be81e62cbc3b32ca9b94e0f700b103027db9d506/multidict-6.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", size = 49204 }, + { url = "https://files.pythonhosted.org/packages/bb/9d/5ccb3224a976d1286f360bb4e89e67b7cdfb87336257fc99be3c17f565d7/multidict-6.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", size = 29807 }, + { url = "https://files.pythonhosted.org/packages/62/32/ef20037f51b84b074a89bab5af46d4565381c3f825fc7cbfc19c1ee156be/multidict-6.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", size = 30000 }, + { url = "https://files.pythonhosted.org/packages/97/81/b0a7560bfc3ec72606232cd7e60159e09b9cf29e66014d770c1315868fa2/multidict-6.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", size = 131820 }, + { url = "https://files.pythonhosted.org/packages/49/3b/768bfc0e41179fbccd3a22925329a11755b7fdd53bec66dbf6b8772f0bce/multidict-6.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", size = 136272 }, + { url = "https://files.pythonhosted.org/packages/71/ac/fd2be3fe98ff54e7739448f771ba730d42036de0870737db9ae34bb8efe9/multidict-6.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", size = 135233 }, + { url = "https://files.pythonhosted.org/packages/93/76/1657047da771315911a927b364a32dafce4135b79b64208ce4ac69525c56/multidict-6.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87", size = 132861 }, + { url = "https://files.pythonhosted.org/packages/19/a5/9f07ffb9bf68b8aaa406c2abee27ad87e8b62a60551587b8e59ee91aea84/multidict-6.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", size = 122166 }, + { url = "https://files.pythonhosted.org/packages/95/23/b5ce3318d9d6c8f105c3679510f9d7202980545aad8eb4426313bd8da3ee/multidict-6.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", size = 136052 }, + { url = "https://files.pythonhosted.org/packages/ce/5c/02cffec58ffe120873dce520af593415b91cc324be0345f534ad3637da4e/multidict-6.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/49/f3/3b19a83f4ebf53a3a2a0435f3e447aa227b242ba3fd96a92404b31fb3543/multidict-6.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", size = 140962 }, + { url = "https://files.pythonhosted.org/packages/cc/1a/c916b54fb53168c24cb6a3a0795fd99d0a59a0ea93fa9f6edeff5565cb20/multidict-6.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", size = 138082 }, + { url = "https://files.pythonhosted.org/packages/ef/1a/dcb7fb18f64b3727c61f432c1e1a0d52b3924016124e4bbc8a7d2e4fa57b/multidict-6.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", size = 136019 }, + { url = "https://files.pythonhosted.org/packages/fb/02/7695485375106f5c542574f70e1968c391f86fa3efc9f1fd76aac0af7237/multidict-6.2.0-cp312-cp312-win32.whl", hash = "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", size = 26676 }, + { url = "https://files.pythonhosted.org/packages/3c/f5/f147000fe1f4078160157b15b0790fff0513646b0f9b7404bf34007a9b44/multidict-6.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", size = 28899 }, + { url = "https://files.pythonhosted.org/packages/a4/6c/5df5590b1f9a821154589df62ceae247537b01ab26b0aa85997c35ca3d9e/multidict-6.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80", size = 49151 }, + { url = "https://files.pythonhosted.org/packages/d5/ca/c917fbf1be989cd7ea9caa6f87e9c33844ba8d5fbb29cd515d4d2833b84c/multidict-6.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16", size = 29803 }, + { url = "https://files.pythonhosted.org/packages/22/19/d97086fc96f73acf36d4dbe65c2c4175911969df49c4e94ef082be59d94e/multidict-6.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e", size = 29947 }, + { url = "https://files.pythonhosted.org/packages/e3/3b/203476b6e915c3f51616d5f87230c556e2f24b168c14818a3d8dae242b1b/multidict-6.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817", size = 130369 }, + { url = "https://files.pythonhosted.org/packages/c6/4f/67470007cf03b2bb6df8ae6d716a8eeb0a7d19e0c8dba4e53fa338883bca/multidict-6.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc", size = 135231 }, + { url = "https://files.pythonhosted.org/packages/6d/f5/7a5ce64dc9a3fecc7d67d0b5cb9c262c67e0b660639e5742c13af63fd80f/multidict-6.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1", size = 133634 }, + { url = "https://files.pythonhosted.org/packages/05/93/ab2931907e318c0437a4cd156c9cfff317ffb33d99ebbfe2d64200a870f7/multidict-6.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844", size = 131349 }, + { url = "https://files.pythonhosted.org/packages/54/aa/ab8eda83a6a85f5b4bb0b1c28e62b18129b14519ef2e0d4cfd5f360da73c/multidict-6.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48", size = 120861 }, + { url = "https://files.pythonhosted.org/packages/15/2f/7d08ea7c5d9f45786893b4848fad59ec8ea567367d4234691a721e4049a1/multidict-6.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0", size = 134611 }, + { url = "https://files.pythonhosted.org/packages/8b/07/387047bb1eac563981d397a7f85c75b306df1fff3c20b90da5a6cf6e487e/multidict-6.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f", size = 128955 }, + { url = "https://files.pythonhosted.org/packages/8d/6e/7ae18f764a5282c2d682f1c90c6b2a0f6490327730170139a7a63bf3bb20/multidict-6.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de", size = 139759 }, + { url = "https://files.pythonhosted.org/packages/b6/f4/c1b3b087b9379b9e56229bcf6570b9a963975c205a5811ac717284890598/multidict-6.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02", size = 136426 }, + { url = "https://files.pythonhosted.org/packages/a2/0e/ef7b39b161ffd40f9e25dd62e59644b2ccaa814c64e9573f9bc721578419/multidict-6.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d", size = 134648 }, + { url = "https://files.pythonhosted.org/packages/37/5c/7905acd0ca411c97bcae62ab167d9922f0c5a1d316b6d3af875d4bda3551/multidict-6.2.0-cp313-cp313-win32.whl", hash = "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e", size = 26680 }, + { url = "https://files.pythonhosted.org/packages/89/36/96b071d1dad6ac44fe517e4250329e753787bb7a63967ef44bb9b3a659f6/multidict-6.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2", size = 28942 }, + { url = "https://files.pythonhosted.org/packages/f5/05/d686cd2a12d648ecd434675ee8daa2901a80f477817e89ab3b160de5b398/multidict-6.2.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7", size = 50807 }, + { url = "https://files.pythonhosted.org/packages/4c/1f/c7db5aac8fea129fa4c5a119e3d279da48d769138ae9624d1234aa01a06f/multidict-6.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b", size = 30474 }, + { url = "https://files.pythonhosted.org/packages/e5/f1/1fb27514f4d73cea165429dcb7d90cdc4a45445865832caa0c50dd545420/multidict-6.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e", size = 30841 }, + { url = "https://files.pythonhosted.org/packages/d6/6b/9487169e549a23c8958edbb332afaf1ab55d61f0c03cb758ee07ff8f74fb/multidict-6.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025", size = 148658 }, + { url = "https://files.pythonhosted.org/packages/d7/22/79ebb2e4f70857c94999ce195db76886ae287b1b6102da73df24dcad4903/multidict-6.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd", size = 151988 }, + { url = "https://files.pythonhosted.org/packages/49/5d/63b17f3c1a2861587d26705923a94eb6b2600e5222d6b0d513bce5a78720/multidict-6.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7", size = 148432 }, + { url = "https://files.pythonhosted.org/packages/a3/22/55204eec45c4280fa431c11494ad64d6da0dc89af76282fc6467432360a0/multidict-6.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af", size = 143161 }, + { url = "https://files.pythonhosted.org/packages/97/e6/202b2cf5af161228767acab8bc49e73a91f4a7de088c9c71f3c02950a030/multidict-6.2.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331", size = 136820 }, + { url = "https://files.pythonhosted.org/packages/7d/16/dbedae0e94c7edc48fddef0c39483f2313205d9bc566fd7f11777b168616/multidict-6.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c", size = 150875 }, + { url = "https://files.pythonhosted.org/packages/f3/04/38ccf25d4bf8beef76a22bad7d9833fd088b4594c9765fe6fede39aa6c89/multidict-6.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b", size = 142050 }, + { url = "https://files.pythonhosted.org/packages/9e/89/4f6b43386e7b79a4aad560d751981a0a282a1943c312ac72f940d7cf8f9f/multidict-6.2.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151", size = 154117 }, + { url = "https://files.pythonhosted.org/packages/24/e3/3dde5b193f86d30ad6400bd50e116b0df1da3f0c7d419661e3bd79e5ad86/multidict-6.2.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019", size = 149408 }, + { url = "https://files.pythonhosted.org/packages/df/b2/ec1e27e8e3da12fcc9053e1eae2f6b50faa8708064d83ea25aa7fb77ffd2/multidict-6.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547", size = 145767 }, + { url = "https://files.pythonhosted.org/packages/3a/8e/c07a648a9d592fa9f3a19d1c7e1c7738ba95aff90db967a5a09cff1e1f37/multidict-6.2.0-cp313-cp313t-win32.whl", hash = "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc", size = 28950 }, + { url = "https://files.pythonhosted.org/packages/dc/a9/bebb5485b94d7c09831638a4df9a1a924c32431a750723f0bf39cd16a787/multidict-6.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44", size = 32001 }, + { url = "https://files.pythonhosted.org/packages/9c/fd/b247aec6add5601956d440488b7f23151d8343747e82c038af37b28d6098/multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", size = 10266 }, +] + [[package]] name = "networkx" version = "3.4.2" @@ -585,34 +885,149 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179 }, ] +[[package]] +name = "nvidia-cublas-cu12" +version = "12.4.5.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'x86_64'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/7f/7fbae15a3982dc9595e49ce0f19332423b260045d0a6afe93cdbe2f1f624/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3", size = 363333771 }, + { url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805 }, + { url = "https://files.pythonhosted.org/packages/e2/2a/4f27ca96232e8b5269074a72e03b4e0d43aa68c9b965058b1684d07c6ff8/nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc", size = 396895858 }, +] + [[package]] name = "nvidia-cublas-cu12" version = "12.8.3.14" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'aarch64'", + "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'aarch64'", + "python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", +] wheels = [ { url = "https://files.pythonhosted.org/packages/ed/63/684a6f72f52671ea222c12ecde9bdf748a0ba025e2ad3ec374e466c26eb6/nvidia_cublas_cu12-12.8.3.14-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:93a4e0e386cc7f6e56c822531396de8170ed17068a1e18f987574895044cd8c3", size = 604900717 }, { url = "https://files.pythonhosted.org/packages/82/df/4b01f10069e23c641f116c62fc31e31e8dc361a153175d81561d15c8143b/nvidia_cublas_cu12-12.8.3.14-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:3f0e05e7293598cf61933258b73e66a160c27d59c4422670bf0b79348c04be44", size = 609620630 }, { url = "https://files.pythonhosted.org/packages/6c/54/fbfa3315b936d3358517f7da5f9f2557c279bf210e5261f0cf66cc0f9832/nvidia_cublas_cu12-12.8.3.14-py3-none-win_amd64.whl", hash = "sha256:9ae5eae500aead01fc4bdfc458209df638b1a3551557ce11a78eea9ece602ae9", size = 578387959 }, ] +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/b5/9fb3d00386d3361b03874246190dfec7b206fd74e6e287b26a8fcb359d95/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a", size = 12354556 }, + { url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957 }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/aa/083b01c427e963ad0b314040565ea396f914349914c298556484f799e61b/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198", size = 24133372 }, + { url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306 }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/aa/b656d755f474e2084971e9a297def515938d56b466ab39624012070cb773/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3", size = 894177 }, + { url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737 }, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.1.0.70" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12", version = "12.4.5.8", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 }, +] + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12", version = "12.4.127", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/8a/0e728f749baca3fbeffad762738276e5df60851958be7783af121a7221e7/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399", size = 211422548 }, + { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117 }, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.5.147" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'x86_64'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/9c/a79180e4d70995fdf030c6946991d0171555c6edf95c265c6b2bf7011112/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9", size = 56314811 }, + { url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206 }, + { url = "https://files.pythonhosted.org/packages/1c/22/2573503d0d4e45673c263a313f79410e110eb562636b0617856fdb2ff5f6/nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771", size = 55799918 }, +] + [[package]] name = "nvidia-curand-cu12" version = "10.3.9.55" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'aarch64'", + "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'aarch64'", + "python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", +] wheels = [ { url = "https://files.pythonhosted.org/packages/f4/13/bbcf48e2f8a6a9adef58f130bc968810528a4e66bbbe62fad335241e699f/nvidia_curand_cu12-10.3.9.55-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b6bb90c044fa9b07cedae2ef29077c4cf851fb6fdd6d862102321f359dca81e9", size = 63623836 }, { url = "https://files.pythonhosted.org/packages/bd/fc/7be5d0082507269bb04ac07cc614c84b78749efb96e8cf4100a8a1178e98/nvidia_curand_cu12-10.3.9.55-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8387d974240c91f6a60b761b83d4b2f9b938b7e0b9617bae0f0dafe4f5c36b86", size = 63618038 }, { url = "https://files.pythonhosted.org/packages/d6/f0/91252f3cffe3f3c233a8e17262c21b41534652edfe783c1e58ea1c92c115/nvidia_curand_cu12-10.3.9.55-py3-none-win_amd64.whl", hash = "sha256:570d82475fe7f3d8ed01ffbe3b71796301e0e24c98762ca018ff8ce4f5418e1f", size = 62761446 }, ] +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.6.1.9" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'x86_64'", +] +dependencies = [ + { name = "nvidia-cublas-cu12", version = "12.4.5.8", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cusparse-cu12", version = "12.3.1.170", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-nvjitlink-cu12", version = "12.4.127", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/6b/a5c33cf16af09166845345275c34ad2190944bcc6026797a39f8e0a282e0/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e", size = 127634111 }, + { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057 }, + { url = "https://files.pythonhosted.org/packages/f2/be/d435b7b020e854d5d5a682eb5de4328fd62f6182507406f2818280e206e2/nvidia_cusolver_cu12-11.6.1.9-py3-none-win_amd64.whl", hash = "sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c", size = 125224015 }, +] + [[package]] name = "nvidia-cusolver-cu12" version = "11.7.2.55" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'aarch64'", + "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'aarch64'", + "python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", +] dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-cublas-cu12", version = "12.8.3.14", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-cusparse-cu12", version = "12.5.7.53", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-nvjitlink-cu12", version = "12.8.61", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/8c/ce/4214a892e804b20bf66d04f04a473006fc2d3dac158160ef85f1bc906639/nvidia_cusolver_cu12-11.7.2.55-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:0fd9e98246f43c15bee5561147ad235dfdf2d037f5d07c9d41af3f7f72feb7cc", size = 260094827 }, @@ -620,12 +1035,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/f9/e0e6f8b7aecd13e0f9e937d116fb3211329a0a92b9bea9624b1368de307a/nvidia_cusolver_cu12-11.7.2.55-py3-none-win_amd64.whl", hash = "sha256:a5a516c55da5c5aba98420d9bc9bcab18245f21ec87338cc1f930eb18dd411ac", size = 249600787 }, ] +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.3.1.170" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'x86_64'", +] +dependencies = [ + { name = "nvidia-nvjitlink-cu12", version = "12.4.127", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/a9/c0d2f83a53d40a4a41be14cea6a0bf9e668ffcf8b004bd65633f433050c0/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3", size = 207381987 }, + { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763 }, + { url = "https://files.pythonhosted.org/packages/a2/e0/3155ca539760a8118ec94cc279b34293309bcd14011fc724f87f31988843/nvidia_cusparse_cu12-12.3.1.170-py3-none-win_amd64.whl", hash = "sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f", size = 204684315 }, +] + [[package]] name = "nvidia-cusparse-cu12" version = "12.5.7.53" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'aarch64'", + "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'aarch64'", + "python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", +] dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-nvjitlink-cu12", version = "12.8.61", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/2e/a2/313db0453087f5324a5900380ca2e57e050c8de76f407b5e11383dc762ae/nvidia_cusparse_cu12-12.5.7.53-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d869c6146ca80f4305b62e02d924b4aaced936f8173e3cef536a67eed2a91af1", size = 291963692 }, @@ -633,6 +1071,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/48/64b01653919a3d1d9b5117c156806ab0db8312c7496ff646477a5c1545bf/nvidia_cusparse_cu12-12.5.7.53-py3-none-win_amd64.whl", hash = "sha256:82c201d6781bacf6bb7c654f0446728d0fe596dfdd82ef4a04c204ce3e107441", size = 288767123 }, ] +[[package]] +name = "nvidia-cusparselt-cu12" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/8e/675498726c605c9441cf46653bd29cb1b8666da1fb1469ffa25f67f20c58/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8", size = 149422781 }, + { url = "https://files.pythonhosted.org/packages/78/a8/bcbb63b53a4b1234feeafb65544ee55495e1bb37ec31b999b963cbccfd1d/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9", size = 150057751 }, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.21.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/99/12cd266d6233f47d00daf3a72739872bdc10267d0383508b0b9c84a18bb6/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", size = 188654414 }, +] + [[package]] name = "nvidia-nvcomp-cu12" version = "4.1.0.6" @@ -643,16 +1098,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/97/be4151c26d13741237e1b58d6fac097b79b552bee4a9c89d7f150c4959fb/nvidia_nvcomp_cu12-4.1.0.6-py3-none-win_amd64.whl", hash = "sha256:df24bedfe9df8be67ae7c59f5d21223f082c5ce689679909ee4985c563a0a89f", size = 75296662 }, ] +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'x86_64'", +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/45/239d52c05074898a80a900f49b1615d81c07fceadd5ad6c4f86a987c0bc4/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83", size = 20552510 }, + { url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810 }, + { url = "https://files.pythonhosted.org/packages/81/19/0babc919031bee42620257b9a911c528f05fb2688520dcd9ca59159ffea8/nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1", size = 95336325 }, +] + [[package]] name = "nvidia-nvjitlink-cu12" version = "12.8.61" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and platform_machine == 'aarch64'", + "python_full_version < '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", + "python_full_version >= '3.12' and platform_machine == 'aarch64'", + "python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", +] wheels = [ { url = "https://files.pythonhosted.org/packages/03/f8/9d85593582bd99b8d7c65634d2304780aefade049b2b94d96e44084be90b/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:45fd79f2ae20bd67e8bc411055939049873bfd8fac70ff13bd4865e0b9bdab17", size = 39243473 }, { url = "https://files.pythonhosted.org/packages/af/53/698f3758f48c5fcb1112721e40cc6714da3980d3c7e93bae5b29dafa9857/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b80ecab31085dda3ce3b41d043be0ec739216c3fc633b8abe212d5a30026df0", size = 38374634 }, { url = "https://files.pythonhosted.org/packages/7f/c6/0d1b2bfeb2ef42c06db0570c4d081e5cde4450b54c09e43165126cfe6ff6/nvidia_nvjitlink_cu12-12.8.61-py3-none-win_amd64.whl", hash = "sha256:1166a964d25fdc0eae497574d38824305195a5283324a21ccb0ce0c802cbf41c", size = 268514099 }, ] +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/39/471f581edbb7804b39e8063d92fc8305bdc7a80ae5c07dbe6ea5c50d14a5/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3", size = 100417 }, + { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, +] + [[package]] name = "nvtx" version = "0.2.10" @@ -820,6 +1304,94 @@ gpu = [ { name = "cudf-polars-cu12" }, ] +[[package]] +name = "propcache" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/76/f941e63d55c0293ff7829dd21e7cf1147e90a526756869a9070f287a68c9/propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5", size = 42722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/c9/cf09ff7e6d09f14149094f7cd50d2dec032b24e61af21fc4540da2b17bfb/propcache-0.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9ddd49258610499aab83b4f5b61b32e11fce873586282a0e972e5ab3bcadee51", size = 79568 }, + { url = "https://files.pythonhosted.org/packages/c8/32/2424d89da88cd81b7d148e0d2b3131461b570a02aa9d84a2e567509adb0d/propcache-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2578541776769b500bada3f8a4eeaf944530516b6e90c089aa368266ed70c49e", size = 45895 }, + { url = "https://files.pythonhosted.org/packages/f6/91/ee5b6aa7aa31754fefcf0c5180e09223cac380ef195c4ddc8c266eb641ea/propcache-0.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8074c5dd61c8a3e915fa8fc04754fa55cfa5978200d2daa1e2d4294c1f136aa", size = 45427 }, + { url = "https://files.pythonhosted.org/packages/bf/73/38f0128462b8b616181d8c53bd5d04eac41c50c449b07615c65d56ba0a9b/propcache-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b58229a844931bca61b3a20efd2be2a2acb4ad1622fc026504309a6883686fbf", size = 232427 }, + { url = "https://files.pythonhosted.org/packages/59/82/f3d4e84f4539dcfc9c3d338282b9e915f5b63c921986ecfdf7af2d12f87c/propcache-0.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e45377d5d6fefe1677da2a2c07b024a6dac782088e37c0b1efea4cfe2b1be19b", size = 239985 }, + { url = "https://files.pythonhosted.org/packages/42/e8/029f58cccbae83c9969a7ee7a06558d5b83a93dfc54e0f4f70234bbaea1b/propcache-0.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec5060592d83454e8063e487696ac3783cc48c9a329498bafae0d972bc7816c9", size = 238827 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/c373561777c0cb9b9e7b9b9a10b9b3a7b6bde75a2535b962231cecc8fdb8/propcache-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15010f29fbed80e711db272909a074dc79858c6d28e2915704cfc487a8ac89c6", size = 231348 }, + { url = "https://files.pythonhosted.org/packages/d7/d2/4673f715beedf6038b485bcd976813149231d9df5bb6196cb69a09c185c9/propcache-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a254537b9b696ede293bfdbc0a65200e8e4507bc9f37831e2a0318a9b333c85c", size = 220426 }, + { url = "https://files.pythonhosted.org/packages/e0/f6/1da65f900927bafd4675a16e890618ec7643f2f922bf0e4d84bb38645618/propcache-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2b975528998de037dfbc10144b8aed9b8dd5a99ec547f14d1cb7c5665a43f075", size = 220294 }, + { url = "https://files.pythonhosted.org/packages/ff/86/620451bdc02e91b1712cd71890c17077ee97e2a28493836a87e47b8e70ff/propcache-0.3.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:19d36bb351ad5554ff20f2ae75f88ce205b0748c38b146c75628577020351e3c", size = 212492 }, + { url = "https://files.pythonhosted.org/packages/6e/1b/e8f86921ed4016da80faf3b8f515f7829decabdbff106736bfff353bceba/propcache-0.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6032231d4a5abd67c7f71168fd64a47b6b451fbcb91c8397c2f7610e67683810", size = 215113 }, + { url = "https://files.pythonhosted.org/packages/1a/95/a61d86cc49aa0945f6c06f3a4614fc543e311a50558c92861f5e9691a37c/propcache-0.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6985a593417cdbc94c7f9c3403747335e450c1599da1647a5af76539672464d3", size = 228330 }, + { url = "https://files.pythonhosted.org/packages/8f/7d/10dbae48ff2bb189e92c2b3487a48f3229146a25941ad0d485934d1104d4/propcache-0.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6a1948df1bb1d56b5e7b0553c0fa04fd0e320997ae99689488201f19fa90d2e7", size = 231942 }, + { url = "https://files.pythonhosted.org/packages/39/ce/82d16aec96c5513ae7db13ab901a65a1e54c915292fb5b2390e33275b61d/propcache-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8319293e85feadbbfe2150a5659dbc2ebc4afdeaf7d98936fb9a2f2ba0d4c35c", size = 223077 }, + { url = "https://files.pythonhosted.org/packages/c8/e0/cb077e8e7a583c733df7f53327fcbdb92e42be59b976ce60bf1d904a0efe/propcache-0.3.0-cp311-cp311-win32.whl", hash = "sha256:63f26258a163c34542c24808f03d734b338da66ba91f410a703e505c8485791d", size = 40455 }, + { url = "https://files.pythonhosted.org/packages/d8/35/57abeb6146fe3c19081eeaf3d9d4cfea256f87f1e5101acf80d3332c1820/propcache-0.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cacea77ef7a2195f04f9279297684955e3d1ae4241092ff0cfcef532bb7a1c32", size = 44705 }, + { url = "https://files.pythonhosted.org/packages/8d/2c/921f15dc365796ec23975b322b0078eae72995c7b4d49eba554c6a308d70/propcache-0.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e", size = 79867 }, + { url = "https://files.pythonhosted.org/packages/11/a5/4a6cc1a559d1f2fb57ea22edc4245158cdffae92f7f92afcee2913f84417/propcache-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af", size = 46109 }, + { url = "https://files.pythonhosted.org/packages/e1/6d/28bfd3af3a567ad7d667348e7f46a520bda958229c4d545ba138a044232f/propcache-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5", size = 45635 }, + { url = "https://files.pythonhosted.org/packages/73/20/d75b42eaffe5075eac2f4e168f6393d21c664c91225288811d85451b2578/propcache-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b", size = 242159 }, + { url = "https://files.pythonhosted.org/packages/a5/fb/4b537dd92f9fd4be68042ec51c9d23885ca5fafe51ec24c58d9401034e5f/propcache-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667", size = 248163 }, + { url = "https://files.pythonhosted.org/packages/e7/af/8a9db04ac596d531ca0ef7dde518feaadfcdabef7b17d6a5ec59ee3effc2/propcache-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7", size = 248794 }, + { url = "https://files.pythonhosted.org/packages/9d/c4/ecfc988879c0fd9db03228725b662d76cf484b6b46f7e92fee94e4b52490/propcache-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7", size = 243912 }, + { url = "https://files.pythonhosted.org/packages/04/a2/298dd27184faa8b7d91cc43488b578db218b3cc85b54d912ed27b8c5597a/propcache-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf", size = 229402 }, + { url = "https://files.pythonhosted.org/packages/be/0d/efe7fec316ca92dbf4bc4a9ba49ca889c43ca6d48ab1d6fa99fc94e5bb98/propcache-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138", size = 226896 }, + { url = "https://files.pythonhosted.org/packages/60/63/72404380ae1d9c96d96e165aa02c66c2aae6072d067fc4713da5cde96762/propcache-0.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86", size = 221447 }, + { url = "https://files.pythonhosted.org/packages/9d/18/b8392cab6e0964b67a30a8f4dadeaff64dc7022b5a34bb1d004ea99646f4/propcache-0.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d", size = 222440 }, + { url = "https://files.pythonhosted.org/packages/6f/be/105d9ceda0f97eff8c06bac1673448b2db2a497444de3646464d3f5dc881/propcache-0.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e", size = 234104 }, + { url = "https://files.pythonhosted.org/packages/cb/c9/f09a4ec394cfcce4053d8b2a04d622b5f22d21ba9bb70edd0cad061fa77b/propcache-0.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64", size = 239086 }, + { url = "https://files.pythonhosted.org/packages/ea/aa/96f7f9ed6def82db67c972bdb7bd9f28b95d7d98f7e2abaf144c284bf609/propcache-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c", size = 230991 }, + { url = "https://files.pythonhosted.org/packages/5a/11/bee5439de1307d06fad176f7143fec906e499c33d7aff863ea8428b8e98b/propcache-0.3.0-cp312-cp312-win32.whl", hash = "sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d", size = 40337 }, + { url = "https://files.pythonhosted.org/packages/e4/17/e5789a54a0455a61cb9efc4ca6071829d992220c2998a27c59aeba749f6f/propcache-0.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57", size = 44404 }, + { url = "https://files.pythonhosted.org/packages/3a/0f/a79dd23a0efd6ee01ab0dc9750d8479b343bfd0c73560d59d271eb6a99d4/propcache-0.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568", size = 77287 }, + { url = "https://files.pythonhosted.org/packages/b8/51/76675703c90de38ac75adb8deceb3f3ad99b67ff02a0fa5d067757971ab8/propcache-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9", size = 44923 }, + { url = "https://files.pythonhosted.org/packages/01/9b/fd5ddbee66cf7686e73c516227c2fd9bf471dbfed0f48329d095ea1228d3/propcache-0.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767", size = 44325 }, + { url = "https://files.pythonhosted.org/packages/13/1c/6961f11eb215a683b34b903b82bde486c606516c1466bf1fa67f26906d51/propcache-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8", size = 225116 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/f8410c40abcb2e40dffe9adeed017898c930974650a63e5c79b886aa9f73/propcache-0.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0", size = 229905 }, + { url = "https://files.pythonhosted.org/packages/ef/5a/a9bf90894001468bf8e6ea293bb00626cc9ef10f8eb7996e9ec29345c7ed/propcache-0.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d", size = 233221 }, + { url = "https://files.pythonhosted.org/packages/dd/ce/fffdddd9725b690b01d345c1156b4c2cc6dca09ab5c23a6d07b8f37d6e2f/propcache-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05", size = 227627 }, + { url = "https://files.pythonhosted.org/packages/58/ae/45c89a5994a334735a3032b48e8e4a98c05d9536ddee0719913dc27da548/propcache-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe", size = 214217 }, + { url = "https://files.pythonhosted.org/packages/01/84/bc60188c3290ff8f5f4a92b9ca2d93a62e449c8daf6fd11ad517ad136926/propcache-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1", size = 212921 }, + { url = "https://files.pythonhosted.org/packages/14/b3/39d60224048feef7a96edabb8217dc3f75415457e5ebbef6814f8b2a27b5/propcache-0.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92", size = 208200 }, + { url = "https://files.pythonhosted.org/packages/9d/b3/0a6720b86791251273fff8a01bc8e628bc70903513bd456f86cde1e1ef84/propcache-0.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787", size = 208400 }, + { url = "https://files.pythonhosted.org/packages/e9/4f/bb470f3e687790547e2e78105fb411f54e0cdde0d74106ccadd2521c6572/propcache-0.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545", size = 218116 }, + { url = "https://files.pythonhosted.org/packages/34/71/277f7f9add469698ac9724c199bfe06f85b199542121a71f65a80423d62a/propcache-0.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e", size = 222911 }, + { url = "https://files.pythonhosted.org/packages/92/e3/a7b9782aef5a2fc765b1d97da9ec7aed2f25a4e985703608e73232205e3f/propcache-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626", size = 216563 }, + { url = "https://files.pythonhosted.org/packages/ab/76/0583ca2c551aa08ffcff87b2c6849c8f01c1f6fb815a5226f0c5c202173e/propcache-0.3.0-cp313-cp313-win32.whl", hash = "sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374", size = 39763 }, + { url = "https://files.pythonhosted.org/packages/80/ec/c6a84f9a36f608379b95f0e786c111d5465926f8c62f12be8cdadb02b15c/propcache-0.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a", size = 43650 }, + { url = "https://files.pythonhosted.org/packages/ee/95/7d32e3560f5bf83fc2f2a4c1b0c181d327d53d5f85ebd045ab89d4d97763/propcache-0.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf", size = 82140 }, + { url = "https://files.pythonhosted.org/packages/86/89/752388f12e6027a5e63f5d075f15291ded48e2d8311314fff039da5a9b11/propcache-0.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0", size = 47296 }, + { url = "https://files.pythonhosted.org/packages/1b/4c/b55c98d586c69180d3048984a57a5ea238bdeeccf82dbfcd598e935e10bb/propcache-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829", size = 46724 }, + { url = "https://files.pythonhosted.org/packages/0f/b6/67451a437aed90c4e951e320b5b3d7eb584ade1d5592f6e5e8f678030989/propcache-0.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa", size = 291499 }, + { url = "https://files.pythonhosted.org/packages/ee/ff/e4179facd21515b24737e1e26e02615dfb5ed29416eed4cf5bc6ac5ce5fb/propcache-0.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6", size = 293911 }, + { url = "https://files.pythonhosted.org/packages/76/8d/94a8585992a064a23bd54f56c5e58c3b8bf0c0a06ae10e56f2353ae16c3d/propcache-0.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db", size = 293301 }, + { url = "https://files.pythonhosted.org/packages/b0/b8/2c860c92b4134f68c7716c6f30a0d723973f881c32a6d7a24c4ddca05fdf/propcache-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54", size = 281947 }, + { url = "https://files.pythonhosted.org/packages/cd/72/b564be7411b525d11757b713c757c21cd4dc13b6569c3b2b8f6d3c96fd5e/propcache-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121", size = 268072 }, + { url = "https://files.pythonhosted.org/packages/37/68/d94649e399e8d7fc051e5a4f2334efc567993525af083db145a70690a121/propcache-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e", size = 275190 }, + { url = "https://files.pythonhosted.org/packages/d8/3c/446e125f5bbbc1922964dd67cb541c01cdb678d811297b79a4ff6accc843/propcache-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e", size = 254145 }, + { url = "https://files.pythonhosted.org/packages/f4/80/fd3f741483dc8e59f7ba7e05eaa0f4e11677d7db2077522b92ff80117a2a/propcache-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a", size = 257163 }, + { url = "https://files.pythonhosted.org/packages/dc/cf/6292b5ce6ed0017e6a89024a827292122cc41b6259b30ada0c6732288513/propcache-0.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac", size = 280249 }, + { url = "https://files.pythonhosted.org/packages/e8/f0/fd9b8247b449fe02a4f96538b979997e229af516d7462b006392badc59a1/propcache-0.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e", size = 288741 }, + { url = "https://files.pythonhosted.org/packages/64/71/cf831fdc2617f86cfd7f414cfc487d018e722dac8acc098366ce9bba0941/propcache-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf", size = 277061 }, + { url = "https://files.pythonhosted.org/packages/42/78/9432542a35d944abeca9e02927a0de38cd7a298466d8ffa171536e2381c3/propcache-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863", size = 42252 }, + { url = "https://files.pythonhosted.org/packages/6f/45/960365f4f8978f48ebb56b1127adf33a49f2e69ecd46ac1f46d6cf78a79d/propcache-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46", size = 46425 }, + { url = "https://files.pythonhosted.org/packages/b5/35/6c4c6fc8774a9e3629cd750dc24a7a4fb090a25ccd5c3246d127b70f9e22/propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043", size = 12101 }, +] + +[[package]] +name = "psutil" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, +] + [[package]] name = "pyarrow" version = "18.1.0" @@ -880,10 +1452,14 @@ name = "pylibcugraph-cu12" version = "24.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-cublas-cu12", version = "12.4.5.8", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cublas-cu12", version = "12.8.3.14", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-curand-cu12", version = "10.3.5.147", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-curand-cu12", version = "10.3.9.55", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-cusolver-cu12", version = "11.6.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cusolver-cu12", version = "11.7.2.55", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-cusparse-cu12", version = "12.3.1.170", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cusparse-cu12", version = "12.5.7.53", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "pylibraft-cu12" }, { name = "rmm-cu12" }, ] @@ -896,10 +1472,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-python" }, { name = "numpy" }, - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-cublas-cu12", version = "12.4.5.8", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cublas-cu12", version = "12.8.3.14", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-curand-cu12", version = "10.3.5.147", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-curand-cu12", version = "10.3.9.55", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-cusolver-cu12", version = "11.6.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cusolver-cu12", version = "11.7.2.55", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "nvidia-cusparse-cu12", version = "12.3.1.170", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "nvidia-cusparse-cu12", version = "12.5.7.53", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "rmm-cu12" }, ] sdist = { url = "https://files.pythonhosted.org/packages/97/21/7528b474119607168aae1e94148614761effbec8c45ae31f323ea75e7d68/pylibraft_cu12-24.12.0.tar.gz", hash = "sha256:88370c81ec6cad13c14f5b6df18845596cfb067f9c009d8d118fc0a2f3c78833", size = 5613 } @@ -1099,6 +1679,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, ] +[[package]] +name = "setuptools" +version = "78.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/f4/aa8d364f0dc1f33b2718938648c31202e2db5cd6479a73f0a9ca5a88372d/setuptools-78.0.2.tar.gz", hash = "sha256:137525e6afb9022f019d6e884a319017f9bf879a0d8783985d32cbc8683cab93", size = 1367747 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/db/2fd473dfe436ad19fda190f4079162d400402aedfcc41e048d38c0a375c6/setuptools-78.0.2-py3-none-any.whl", hash = "sha256:4a612c80e1f1d71b80e4906ce730152e8dec23df439f82731d9d0b608d7b700d", size = 1255965 }, +] + [[package]] name = "shapely" version = "2.0.7" @@ -1137,6 +1726,101 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] +[[package]] +name = "sympy" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/99/5a5b6f19ff9f083671ddf7b9632028436167cd3d33e11015754e41b249a4/sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f", size = 7533040 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177 }, +] + +[[package]] +name = "torch" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cublas-cu12", version = "12.4.5.8", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-curand-cu12", version = "10.3.5.147", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusolver-cu12", version = "11.6.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusparse-cu12", version = "12.3.1.170", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nvjitlink-cu12", version = "12.4.127", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.12'" }, + { name = "sympy" }, + { name = "triton", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/a9/97cbbc97002fff0de394a2da2cdfa859481fdca36996d7bd845d50aa9d8d/torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:7979834102cd5b7a43cc64e87f2f3b14bd0e1458f06e9f88ffa386d07c7446e1", size = 766715424 }, + { url = "https://files.pythonhosted.org/packages/6d/fa/134ce8f8a7ea07f09588c9cc2cea0d69249efab977707cf67669431dcf5c/torch-2.6.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:ccbd0320411fe1a3b3fec7b4d3185aa7d0c52adac94480ab024b5c8f74a0bf1d", size = 95759416 }, + { url = "https://files.pythonhosted.org/packages/11/c5/2370d96b31eb1841c3a0883a492c15278a6718ccad61bb6a649c80d1d9eb/torch-2.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:46763dcb051180ce1ed23d1891d9b1598e07d051ce4c9d14307029809c4d64f7", size = 204164970 }, + { url = "https://files.pythonhosted.org/packages/0b/fa/f33a4148c6fb46ca2a3f8de39c24d473822d5774d652b66ed9b1214da5f7/torch-2.6.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:94fc63b3b4bedd327af588696559f68c264440e2503cc9e6954019473d74ae21", size = 66530713 }, + { url = "https://files.pythonhosted.org/packages/e5/35/0c52d708144c2deb595cd22819a609f78fdd699b95ff6f0ebcd456e3c7c1/torch-2.6.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:2bb8987f3bb1ef2675897034402373ddfc8f5ef0e156e2d8cfc47cacafdda4a9", size = 766624563 }, + { url = "https://files.pythonhosted.org/packages/01/d6/455ab3fbb2c61c71c8842753b566012e1ed111e7a4c82e0e1c20d0c76b62/torch-2.6.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b789069020c5588c70d5c2158ac0aa23fd24a028f34a8b4fcb8fcb4d7efcf5fb", size = 95607867 }, + { url = "https://files.pythonhosted.org/packages/18/cf/ae99bd066571656185be0d88ee70abc58467b76f2f7c8bfeb48735a71fe6/torch-2.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e1448426d0ba3620408218b50aa6ada88aeae34f7a239ba5431f6c8774b1239", size = 204120469 }, + { url = "https://files.pythonhosted.org/packages/81/b4/605ae4173aa37fb5aa14605d100ff31f4f5d49f617928c9f486bb3aaec08/torch-2.6.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:9a610afe216a85a8b9bc9f8365ed561535c93e804c2a317ef7fabcc5deda0989", size = 66532538 }, + { url = "https://files.pythonhosted.org/packages/24/85/ead1349fc30fe5a32cadd947c91bda4a62fbfd7f8c34ee61f6398d38fb48/torch-2.6.0-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:4874a73507a300a5d089ceaff616a569e7bb7c613c56f37f63ec3ffac65259cf", size = 766626191 }, + { url = "https://files.pythonhosted.org/packages/dd/b0/26f06f9428b250d856f6d512413e9e800b78625f63801cbba13957432036/torch-2.6.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a0d5e1b9874c1a6c25556840ab8920569a7a4137afa8a63a32cee0bc7d89bd4b", size = 95611439 }, + { url = "https://files.pythonhosted.org/packages/c2/9c/fc5224e9770c83faed3a087112d73147cd7c7bfb7557dcf9ad87e1dda163/torch-2.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:510c73251bee9ba02ae1cb6c9d4ee0907b3ce6020e62784e2d7598e0cfa4d6cc", size = 204126475 }, + { url = "https://files.pythonhosted.org/packages/88/8b/d60c0491ab63634763be1537ad488694d316ddc4a20eaadd639cedc53971/torch-2.6.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:ff96f4038f8af9f7ec4231710ed4549da1bdebad95923953a25045dcf6fd87e2", size = 66536783 }, +] + +[[package]] +name = "torch-geometric" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "psutil" }, + { name = "pyparsing" }, + { name = "requests" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/81/e1b015494cb9e0bf4c47cc8426e49736120248733be0e22072a5628ae9ed/torch_geometric-2.6.1.tar.gz", hash = "sha256:1f18f9d0fc4d2239d526221e4f22606a4a3895b5d965a9856d27610a3df662c6", size = 771490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/9f/157e913626c1acfb3b19ce000b1a6e4e4fb177c0bc0ea0c67ca5bd714b5a/torch_geometric-2.6.1-py3-none-any.whl", hash = "sha256:8faeb353f9655f7dbec44c5e0b44c721773bdfb279994da96b9b8b12fd30f427", size = 1135632 }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + +[[package]] +name = "triton" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/2e/757d2280d4fefe7d33af7615124e7e298ae7b8e3bc4446cdb8e88b0f9bab/triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220", size = 253157636 }, + { url = "https://files.pythonhosted.org/packages/06/00/59500052cb1cf8cf5316be93598946bc451f14072c6ff256904428eaf03c/triton-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d9b215efc1c26fa7eefb9a157915c92d52e000d2bf83e5f69704047e63f125c", size = 253159365 }, + { url = "https://files.pythonhosted.org/packages/c7/30/37a3384d1e2e9320331baca41e835e90a3767303642c7a80d4510152cbcf/triton-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5dfa23ba84541d7c0a531dfce76d8bcd19159d50a4a8b14ad01e91734a5c1b0", size = 253154278 }, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1163,3 +1847,65 @@ sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf wheels = [ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] + +[[package]] +name = "yarl" +version = "1.18.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/93/282b5f4898d8e8efaf0790ba6d10e2245d2c9f30e199d1a85cae9356098c/yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069", size = 141555 }, + { url = "https://files.pythonhosted.org/packages/6d/9c/0a49af78df099c283ca3444560f10718fadb8a18dc8b3edf8c7bd9fd7d89/yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193", size = 94351 }, + { url = "https://files.pythonhosted.org/packages/5a/a1/205ab51e148fdcedad189ca8dd587794c6f119882437d04c33c01a75dece/yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889", size = 92286 }, + { url = "https://files.pythonhosted.org/packages/ed/fe/88b690b30f3f59275fb674f5f93ddd4a3ae796c2b62e5bb9ece8a4914b83/yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8", size = 340649 }, + { url = "https://files.pythonhosted.org/packages/07/eb/3b65499b568e01f36e847cebdc8d7ccb51fff716dbda1ae83c3cbb8ca1c9/yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca", size = 356623 }, + { url = "https://files.pythonhosted.org/packages/33/46/f559dc184280b745fc76ec6b1954de2c55595f0ec0a7614238b9ebf69618/yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8", size = 354007 }, + { url = "https://files.pythonhosted.org/packages/af/ba/1865d85212351ad160f19fb99808acf23aab9a0f8ff31c8c9f1b4d671fc9/yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae", size = 344145 }, + { url = "https://files.pythonhosted.org/packages/94/cb/5c3e975d77755d7b3d5193e92056b19d83752ea2da7ab394e22260a7b824/yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3", size = 336133 }, + { url = "https://files.pythonhosted.org/packages/19/89/b77d3fd249ab52a5c40859815765d35c91425b6bb82e7427ab2f78f5ff55/yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb", size = 347967 }, + { url = "https://files.pythonhosted.org/packages/35/bd/f6b7630ba2cc06c319c3235634c582a6ab014d52311e7d7c22f9518189b5/yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e", size = 346397 }, + { url = "https://files.pythonhosted.org/packages/18/1a/0b4e367d5a72d1f095318344848e93ea70da728118221f84f1bf6c1e39e7/yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59", size = 350206 }, + { url = "https://files.pythonhosted.org/packages/b5/cf/320fff4367341fb77809a2d8d7fe75b5d323a8e1b35710aafe41fdbf327b/yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d", size = 362089 }, + { url = "https://files.pythonhosted.org/packages/57/cf/aadba261d8b920253204085268bad5e8cdd86b50162fcb1b10c10834885a/yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e", size = 366267 }, + { url = "https://files.pythonhosted.org/packages/54/58/fb4cadd81acdee6dafe14abeb258f876e4dd410518099ae9a35c88d8097c/yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a", size = 359141 }, + { url = "https://files.pythonhosted.org/packages/9a/7a/4c571597589da4cd5c14ed2a0b17ac56ec9ee7ee615013f74653169e702d/yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1", size = 84402 }, + { url = "https://files.pythonhosted.org/packages/ae/7b/8600250b3d89b625f1121d897062f629883c2f45339623b69b1747ec65fa/yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5", size = 91030 }, + { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, + { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, + { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, + { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, + { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, + { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, + { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, + { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, + { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, + { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, + { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, + { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, + { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, + { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, + { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, + { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, + { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, + { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, + { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, + { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, + { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, + { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, + { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, + { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, + { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, + { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, + { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, + { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, + { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, + { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, + { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, + { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, + { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, +]